diff --git a/CatalogueMovie/.idea/assetWizardSettings.xml b/CatalogueMovie/.idea/assetWizardSettings.xml
index c44c509..81c89b9 100644
--- a/CatalogueMovie/.idea/assetWizardSettings.xml
+++ b/CatalogueMovie/.idea/assetWizardSettings.xml
@@ -66,7 +66,7 @@
@@ -77,7 +77,7 @@
diff --git a/CatalogueMovie/.idea/caches/build_file_checksums.ser b/CatalogueMovie/.idea/caches/build_file_checksums.ser
index 8fce114..94e96c2 100644
Binary files a/CatalogueMovie/.idea/caches/build_file_checksums.ser and b/CatalogueMovie/.idea/caches/build_file_checksums.ser differ
diff --git a/CatalogueMovie/app/src/main/AndroidManifest.xml b/CatalogueMovie/app/src/main/AndroidManifest.xml
index 611a3c5..503d8be 100644
--- a/CatalogueMovie/app/src/main/AndroidManifest.xml
+++ b/CatalogueMovie/app/src/main/AndroidManifest.xml
@@ -3,8 +3,13 @@
package="com.anggitprayogo.dicoding.cataloguemovie">
-
-
+
+
+
+ android:value=".feature.home.HomeActivtiy" />
+ android:launchMode="singleTop"
+ android:theme="@style/AppTheme.NoActionBar">
@@ -41,12 +45,28 @@
+ android:writePermission="com.anggitprayogo.dicoding.cataloguemovie.WRITE_DATABASE" />
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/home/HomeActivtiy.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/home/HomeActivtiy.java
index 00a155f..021aaae 100644
--- a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/home/HomeActivtiy.java
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/home/HomeActivtiy.java
@@ -25,9 +25,14 @@
import com.anggitprayogo.dicoding.cataloguemovie.feature.homefragment.HomeFragment;
import com.anggitprayogo.dicoding.cataloguemovie.feature.mainactivity.MainActivity;
import com.anggitprayogo.dicoding.cataloguemovie.feature.nowplaying.NowPlayingFragment;
+import com.anggitprayogo.dicoding.cataloguemovie.feature.settings.SettingsActivity;
import com.anggitprayogo.dicoding.cataloguemovie.feature.upcoming.UpcomingFragment;
+import com.anggitprayogo.dicoding.cataloguemovie.prefrence.PrefrenceUtil;
+import com.anggitprayogo.dicoding.cataloguemovie.reciever.AlarmReciever;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Calendar;
import java.util.List;
import butterknife.BindView;
@@ -37,6 +42,8 @@ public class HomeActivtiy extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
private final String TAG = getClass().getSimpleName();
+ private AlarmReciever alarmReciever;
+ private PrefrenceUtil prefrenceUtil;
@BindView(R.id.toolbar)
Toolbar toolbar;
@@ -67,6 +74,35 @@ protected void onCreate(Bundle savedInstanceState) {
showFragment(new HomeFragment());
+ alarmReciever = new AlarmReciever();
+ prefrenceUtil = new PrefrenceUtil(this);
+
+ if (!prefrenceUtil.isDailyRemainderExist()){
+ setupDialyRemainder();
+ }
+
+ if (!prefrenceUtil.isReleaseRemainderExists()){
+ setupReleaseRemainder();
+ }
+
+ }
+
+ private void setupDialyRemainder() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 7);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+ prefrenceUtil.setDailyDate(simpleDateFormat.format(calendar.getTime()));
+ }
+
+ private void setupReleaseRemainder() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 8);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+ prefrenceUtil.setReleaseDate(simpleDateFormat.format(calendar.getTime()));
}
@Override
@@ -142,8 +178,8 @@ public boolean onNavigationItemSelected(MenuItem item) {
setActionBarTitle(getString(R.string.favourite));
break;
case R.id.nav_settings:
- Intent toChangeLanguage = new Intent(Settings.ACTION_LOCALE_SETTINGS);
- startActivity(toChangeLanguage);
+ Intent toSettingActivity = new Intent(HomeActivtiy.this, SettingsActivity.class);
+ startActivity(toSettingActivity);
break;
}
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/settings/SettingsActivity.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/settings/SettingsActivity.java
new file mode 100644
index 0000000..4bafe57
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/feature/settings/SettingsActivity.java
@@ -0,0 +1,156 @@
+package com.anggitprayogo.dicoding.cataloguemovie.feature.settings;
+
+import android.content.Intent;
+import android.os.Bundle;
+import android.provider.Settings;
+import android.support.design.widget.AppBarLayout;
+import android.support.v7.app.AppCompatActivity;
+import android.support.v7.widget.Toolbar;
+import android.view.MenuItem;
+import android.widget.CompoundButton;
+import android.widget.Switch;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import com.anggitprayogo.dicoding.cataloguemovie.R;
+import com.anggitprayogo.dicoding.cataloguemovie.prefrence.PrefrenceUtil;
+import com.anggitprayogo.dicoding.cataloguemovie.reciever.AlarmReciever;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import butterknife.OnClick;
+
+public class SettingsActivity extends AppCompatActivity {
+
+ private final String TAG = getClass().getSimpleName();
+ private PrefrenceUtil prefrenceUtil;
+ private AlarmReciever alarmReciever;
+ private boolean isDailyRemainderChecked = true, isReleaseRemainderChecked = true;
+
+ @BindView(R.id.toolbar)
+ Toolbar toolbar;
+ @BindView(R.id.app_bar_layout)
+ AppBarLayout appBarLayout;
+ @BindView(R.id.tv_change_language)
+ TextView tvChangeLanguage;
+ @BindView(R.id.switch_daily_remainder)
+ Switch switchDailyRemainder;
+ @BindView(R.id.switch_release_remainder)
+ Switch switchReleaseRemainder;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_settings);
+
+ ButterKnife.bind(this);
+ prefrenceUtil = new PrefrenceUtil(this);
+ alarmReciever = new AlarmReciever();
+
+ setSupportActionBar(toolbar);
+ getSupportActionBar().setTitle(R.string.label_settings);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ getSupportActionBar().setDisplayShowHomeEnabled(true);
+
+ setupDialyRemainder();
+ setupReleaseRemainder();
+
+ if (!prefrenceUtil.getDailyRemainder()){
+ switchDailyRemainder.setChecked(false);
+ switchDailyRemainder.setText(R.string.label_off);
+ }
+
+ if (!prefrenceUtil.getReleaseRemainder()){
+ switchReleaseRemainder.setChecked(false);
+ switchReleaseRemainder.setText(R.string.label_off);
+ }
+
+ switchDailyRemainder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked){
+ switchDailyRemainder.setText(R.string.label_on);
+ isDailyRemainderChecked = true;
+ prefrenceUtil.setDailyRemainder(isDailyRemainderChecked);
+ startDailyRemainder();
+ }else{
+ switchDailyRemainder.setText(R.string.label_off);
+ isDailyRemainderChecked = false;
+ prefrenceUtil.setDailyRemainder(isDailyRemainderChecked);
+ cancelDailyRemainder();
+ }
+ }
+ });
+
+ switchReleaseRemainder.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (isChecked){
+ switchReleaseRemainder.setText(R.string.label_on);
+ isReleaseRemainderChecked = true;
+ prefrenceUtil.setReleaseRemainder(isReleaseRemainderChecked);
+ startReleaseRemainder();
+ }else{
+ switchReleaseRemainder.setText(R.string.label_off);
+ isReleaseRemainderChecked = false;
+ prefrenceUtil.setReleaseRemainder(isReleaseRemainderChecked);
+ cancelReleaseRemainder();
+ }
+ }
+ });
+
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ switch (item.getItemId()){
+ case android.R.id.home:
+ finish();
+ return true;
+ }
+ return true;
+ }
+
+ @OnClick(R.id.tv_change_language)
+ public void OnChangeLanguage(){
+ Intent intent = new Intent(Settings.ACTION_LOCALE_SETTINGS);
+ startActivity(intent);
+ }
+
+ private void setupDialyRemainder() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 7);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+ prefrenceUtil.setDailyDate(simpleDateFormat.format(calendar.getTime()));
+ }
+
+ private void setupReleaseRemainder() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 8);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm");
+ prefrenceUtil.setReleaseDate(simpleDateFormat.format(calendar.getTime()));
+ }
+
+ private void cancelDailyRemainder(){
+ alarmReciever.cancelDailyRemainder(this);
+ }
+
+ private void startDailyRemainder(){
+ alarmReciever.startDailyRemainder(this, AlarmReciever.DAILY_REMAINDER_TYPE, prefrenceUtil.getDailyDate(), "Jangan lupa kunjungi kami hari ini ya..");
+ }
+
+ private void cancelReleaseRemainder(){
+ alarmReciever.cancelReleaseRemainder(this);
+ }
+
+ private void startReleaseRemainder(){
+ alarmReciever.startReleaseRemainder(this, AlarmReciever.RELEASE_REMAINDER_TYPE, prefrenceUtil.getReleaseDate(), "Jangan lupa senyum hari ini:)");
+ }
+}
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/prefrence/PrefrenceUtil.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/prefrence/PrefrenceUtil.java
new file mode 100644
index 0000000..cac7e43
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/prefrence/PrefrenceUtil.java
@@ -0,0 +1,62 @@
+package com.anggitprayogo.dicoding.cataloguemovie.prefrence;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+public class PrefrenceUtil {
+
+ private static final String PREF_NAME = "catalogue_movie_core";
+ private SharedPreferences sharedPreferences;
+ private SharedPreferences.Editor editor;
+
+ private static final String DAILY_REMAINDER = "daily_remainder";
+ private static final String RELEASE_REMAINDER = "release_remainder";
+ private static final String DAILY_DATE = "daily_date";
+ private static final String RELEASE_DATE = "release_date";
+
+ public PrefrenceUtil(Context context) {
+ sharedPreferences = context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
+ editor = sharedPreferences.edit();
+ }
+
+ public void setDailyRemainder(Boolean bool){
+ editor.putBoolean(DAILY_REMAINDER, bool).apply();
+ }
+
+ public Boolean getDailyRemainder(){
+ return sharedPreferences.getBoolean(DAILY_REMAINDER, true);
+ }
+
+ public void setReleaseRemainder(Boolean bool){
+ editor.putBoolean(RELEASE_REMAINDER, bool).apply();
+ }
+
+ public Boolean getReleaseRemainder(){
+ return sharedPreferences.getBoolean(RELEASE_REMAINDER, true);
+ }
+
+ public void setDailyDate(String dailyDate){
+ editor.putString(DAILY_DATE, dailyDate).apply();
+ }
+
+ public String getDailyDate(){
+ return sharedPreferences.getString(DAILY_DATE, "");
+ }
+
+ public void setReleaseDate(String releaseDate){
+ editor.putString(RELEASE_DATE, releaseDate).apply();
+ }
+
+ public String getReleaseDate(){
+ return sharedPreferences.getString(RELEASE_DATE, "");
+ }
+
+ public boolean isDailyRemainderExist(){
+ return sharedPreferences.contains(DAILY_REMAINDER);
+ }
+
+ public boolean isReleaseRemainderExists(){
+ return sharedPreferences.contains(RELEASE_REMAINDER);
+ }
+
+}
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmPrefrence.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmPrefrence.java
new file mode 100644
index 0000000..2ff3d1b
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmPrefrence.java
@@ -0,0 +1,4 @@
+package com.anggitprayogo.dicoding.cataloguemovie.reciever;
+
+public class AlarmPrefrence {
+}
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmReciever.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmReciever.java
new file mode 100644
index 0000000..426e5e8
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/reciever/AlarmReciever.java
@@ -0,0 +1,216 @@
+package com.anggitprayogo.dicoding.cataloguemovie.reciever;
+
+import android.app.AlarmManager;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.media.RingtoneManager;
+import android.net.Uri;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.ContextCompat;
+import android.util.Log;
+import android.widget.Toast;
+
+import com.anggitprayogo.dicoding.cataloguemovie.BuildConfig;
+import com.anggitprayogo.dicoding.cataloguemovie.R;
+import com.anggitprayogo.dicoding.cataloguemovie.feature.home.HomeActivtiy;
+import com.anggitprayogo.dicoding.cataloguemovie.model.HomeMovieResponse;
+import com.anggitprayogo.dicoding.cataloguemovie.network.EndpointClient;
+import com.anggitprayogo.dicoding.cataloguemovie.network.ServiceGenerator;
+import com.google.gson.GsonBuilder;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+
+public class AlarmReciever extends BroadcastReceiver{
+
+ private final String TAG = getClass().getSimpleName();
+ public static final String EXTRA_MESSAGE = "extra_message";
+ public static final String EXTRA_TYPE = "extra_type";
+ public static final String DAILY_REMAINDER_TYPE = "daily_remainder_type";
+ public static final String RELEASE_REMAINDER_TYPE = "release_remainder_type";
+ public static final int NOTIF_DAILY_REMAINDER = 100;
+ public static final int NOTIF_RELEASE_REMAINDER = 101;
+ private List results = new ArrayList<>();
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+
+ if (intent.getExtras() != null){
+ String message = intent.getExtras().getString(EXTRA_MESSAGE);
+ String type = intent.getExtras().getString(EXTRA_TYPE);
+ int notifId = type.equalsIgnoreCase(DAILY_REMAINDER_TYPE) ? NOTIF_DAILY_REMAINDER : NOTIF_RELEASE_REMAINDER;
+
+ if (notifId == NOTIF_DAILY_REMAINDER){
+ showNotifications(context, notifId, message);
+ }else{
+ fetchReleaseMovie(context);
+ }
+
+ }else{
+ Toast.makeText(context, "none", Toast.LENGTH_SHORT).show();
+ }
+
+ }
+
+ private void fetchReleaseMovie(final Context context) {
+ results.clear();
+ final Context mContext = context;
+ Call call = ServiceGenerator.createService(EndpointClient.class, context)
+ .nowPlaying(BuildConfig.OPEN_WEATHER_MAP_API_KEY, ServiceGenerator.LANG);
+ call.enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, Response response) {
+
+ results.addAll(response.body().getResults());
+
+ Date date = Calendar.getInstance().getTime();
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ String currentDate = simpleDateFormat.format(date);
+
+ int i = 0;
+ int notifId = 0;
+ while (i < results.size()) {
+
+ if (notifId > 5){
+ break;
+ }
+
+ if (results.get(i).getReleaseDate().equalsIgnoreCase(currentDate)){
+ if (notifId < 5){
+ showNotificationRelease(mContext, results.get(i).getTitle(),notifId);
+ }else{
+ break;
+ }
+ notifId++;
+ }
+ i++;
+ }
+
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable t) {
+ Log.d(TAG, "onFailure: "+t.getMessage());
+ }
+ });
+ }
+
+ private void showNotificationRelease(Context context, String title, int l) {
+ NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+
+ Intent intent = null;
+
+ intent = new Intent(context, HomeActivtiy.class);
+
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, 123, intent, 0);
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
+ .setSound(alarmSound)
+ .setSmallIcon(R.drawable.ic_access_alarm_black_24dp)
+ .setContentTitle(context.getString(R.string.app_name))
+ .setContentText("Release terbaru hari ini film "+title)
+ .setContentIntent(pendingIntent)
+ .setAutoCancel(true)
+ .setColor(ContextCompat.getColor(context, android.R.color.transparent))
+ .setVibrate(new long[]{1000,1000,1000,1000});
+
+ notificationManager.notify(l, builder.build());
+ }
+
+ public void showNotifications(Context context, int notifId, String message) {
+ NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
+ Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
+
+ Intent intent = null;
+
+ intent = new Intent(context, HomeActivtiy.class);
+
+ PendingIntent pendingIntent = PendingIntent.getActivity(context, 123, intent, 0);
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
+ .setSound(alarmSound)
+ .setSmallIcon(R.drawable.ic_access_alarm_black_24dp)
+ .setContentTitle(context.getString(R.string.app_name))
+ .setContentText(message)
+ .setContentIntent(pendingIntent)
+ .setAutoCancel(true)
+ .setColor(ContextCompat.getColor(context, android.R.color.transparent))
+ .setVibrate(new long[]{1000,1000,1000,1000});
+
+ notificationManager.notify(notifId, builder.build());
+ }
+
+ public void startDailyRemainder(Context context, String type, String time, String message){
+ AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
+ Intent intent = new Intent(context, AlarmReciever.class);
+ intent.putExtra(EXTRA_MESSAGE, message);
+ intent.putExtra(EXTRA_TYPE, type);
+
+ String[] arrTime = time.split(":");
+ int hour = Integer.parseInt(arrTime[0]);
+ int minute = Integer.parseInt(arrTime[1]);
+ int second = 0;
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, minute);
+ calendar.set(Calendar.SECOND, second);
+
+ int requestCode = NOTIF_DAILY_REMAINDER;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
+ alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
+ Toast.makeText(context, R.string.message_daily_remainder_on, Toast.LENGTH_SHORT).show();
+ }
+
+ public void cancelDailyRemainder(Context context){
+ AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
+ Intent intent = new Intent(context, AlarmReciever.class);
+ int requestCode = NOTIF_DAILY_REMAINDER;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
+ alarmManager.cancel(pendingIntent);
+ Toast.makeText(context, R.string.message_cancle_daily_remainder, Toast.LENGTH_SHORT).show();
+ }
+
+ public void startReleaseRemainder(Context context, String type, String time, String message){
+ AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
+ Intent intent = new Intent(context, AlarmReciever.class);
+ intent.putExtra(EXTRA_MESSAGE, message);
+ intent.putExtra(EXTRA_TYPE, type);
+
+ String[] arrTime = time.split(":");
+ int hour = Integer.parseInt(arrTime[0]);
+ int minute = Integer.parseInt(arrTime[1]);
+ int second = 0;
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, minute);
+ calendar.set(Calendar.SECOND, second);
+
+ int requestCode = NOTIF_RELEASE_REMAINDER;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
+ Toast.makeText(context, R.string.message_release_remainder_on, Toast.LENGTH_SHORT).show();
+ }
+
+ public void cancelReleaseRemainder(Context context){
+ AlarmManager alarmManager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
+ Intent intent = new Intent(context, AlarmReciever.class);
+ int requestCode = NOTIF_RELEASE_REMAINDER;
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, 0);
+ alarmManager.cancel(pendingIntent);
+ Toast.makeText(context, R.string.message_cancle_release_remainder, Toast.LENGTH_SHORT).show();
+ }
+
+}
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/service/StackWidgetService.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/service/StackWidgetService.java
new file mode 100644
index 0000000..b57eb18
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/service/StackWidgetService.java
@@ -0,0 +1,13 @@
+package com.anggitprayogo.dicoding.cataloguemovie.service;
+
+import android.content.Intent;
+import android.widget.RemoteViewsService;
+
+import com.anggitprayogo.dicoding.cataloguemovie.widget.StackRemoteViewFactory;
+
+public class StackWidgetService extends RemoteViewsService{
+ @Override
+ public RemoteViewsFactory onGetViewFactory(Intent intent) {
+ return new StackRemoteViewFactory(getApplicationContext(), intent);
+ }
+}
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/FavouriteWidget.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/FavouriteWidget.java
new file mode 100644
index 0000000..240dfa3
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/FavouriteWidget.java
@@ -0,0 +1,74 @@
+package com.anggitprayogo.dicoding.cataloguemovie.widget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+
+import com.anggitprayogo.dicoding.cataloguemovie.R;
+import com.anggitprayogo.dicoding.cataloguemovie.service.StackWidgetService;
+
+/**
+ * Implementation of App Widget functionality.
+ */
+public class FavouriteWidget extends AppWidgetProvider {
+
+ public static final String TOAST_ACTION = "com.anggitprayogo.dicoding.cataloguemovie.widget.ACTION_TOAST";
+ public static final String EXTRA_ITEM = "com.anggitprayogo.dicoding.cataloguemovie.widget.EXTRA_ITEM";
+
+ static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
+ int appWidgetId) {
+
+ Intent intent = new Intent(context, StackWidgetService.class);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+ intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+
+ RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.favourite_widget);
+ remoteViews.setRemoteAdapter(R.id.stack_view, intent);
+ remoteViews.setEmptyView(R.id.stack_view, R.id.tv_empty);
+
+ Intent toastIntent = new Intent(context, FavouriteWidget.class);
+ toastIntent.setAction(TOAST_ACTION);
+ toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+ toastIntent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
+ remoteViews.setPendingIntentTemplate(R.id.stack_view, pendingIntent);
+
+ appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
+
+ }
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+ // There may be multiple widgets active, so update all of them
+ for (int appWidgetId : appWidgetIds) {
+ updateAppWidget(context, appWidgetManager, appWidgetId);
+ }
+ }
+
+ @Override
+ public void onEnabled(Context context) {
+ // Enter relevant functionality for when the first widget is created
+ }
+
+ @Override
+ public void onDisabled(Context context) {
+ // Enter relevant functionality for when the last widget is disabled
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ AppWidgetManager mgr = AppWidgetManager.getInstance(context);
+ if (intent.getAction().equals(TOAST_ACTION)){
+ int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0);
+ Toast.makeText(context, "Touched View "+viewIndex, Toast.LENGTH_SHORT).show();
+ }
+ super.onReceive(context, intent);
+ }
+}
+
diff --git a/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/StackRemoteViewFactory.java b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/StackRemoteViewFactory.java
new file mode 100644
index 0000000..9830cb6
--- /dev/null
+++ b/CatalogueMovie/app/src/main/java/com/anggitprayogo/dicoding/cataloguemovie/widget/StackRemoteViewFactory.java
@@ -0,0 +1,106 @@
+package com.anggitprayogo.dicoding.cataloguemovie.widget;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.widget.RemoteViews;
+
+import com.anggitprayogo.dicoding.cataloguemovie.R;
+import com.anggitprayogo.dicoding.cataloguemovie.model.HomeMovieResponse;
+import com.anggitprayogo.dicoding.cataloguemovie.network.ServiceGenerator;
+import com.anggitprayogo.dicoding.cataloguemovie.service.StackWidgetService;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.request.target.Target;
+
+import java.util.concurrent.ExecutionException;
+
+import static com.anggitprayogo.dicoding.cataloguemovie.db.DatabaseContract.CONTENT_URI;
+
+public class StackRemoteViewFactory implements StackWidgetService.RemoteViewsFactory{
+
+ private Cursor cursor;
+ private Context context;
+ private int widgetAppid;
+
+ public StackRemoteViewFactory(Context context, Intent intent) {
+ this.context = context;
+ this.widgetAppid = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ @Override
+ public void onCreate() {
+ cursor = context.getContentResolver().query(CONTENT_URI, null, null, null, null);
+ }
+
+ @Override
+ public void onDataSetChanged() {
+
+ }
+
+ @Override
+ public void onDestroy() {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+
+ @Override
+ public int getCount() {
+ return cursor == null ? 0 : cursor.getCount();
+ }
+
+ @Override
+ public RemoteViews getViewAt(int position) {
+ HomeMovieResponse.Results resultItem = getItem(position);
+
+ RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_item);
+
+ Bitmap bmp = null;
+
+ try {
+ bmp = Glide.with(context)
+ .asBitmap()
+ .load(ServiceGenerator.BASE_URL_IMAGE.concat(resultItem.getPosterPath()))
+ .into(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL)
+ .get();
+ } catch (ExecutionException | InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ remoteViews.setTextViewText(R.id.tv_date_release,resultItem.getReleaseDate());
+ remoteViews.setImageViewBitmap(R.id.imageView, bmp);
+
+ return remoteViews;
+
+ }
+
+ @Override
+ public RemoteViews getLoadingView() {
+ return null;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return position;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return true;
+ }
+
+ private HomeMovieResponse.Results getItem(int position) {
+ if (!cursor.moveToPosition(position)) {
+ throw new IllegalStateException("Position invalid!");
+ }
+
+ return new HomeMovieResponse.Results(cursor);
+ }
+}
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/CatalogueMovie/app/src/main/res/drawable-nodpi/example_appwidget_preview.png
new file mode 100644
index 0000000..894b069
Binary files /dev/null and b/CatalogueMovie/app/src/main/res/drawable-nodpi/example_appwidget_preview.png differ
diff --git a/CatalogueMovie/app/src/main/res/drawable/ic_access_alarm_black_24dp.xml b/CatalogueMovie/app/src/main/res/drawable/ic_access_alarm_black_24dp.xml
new file mode 100644
index 0000000..6244bba
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/drawable/ic_access_alarm_black_24dp.xml
@@ -0,0 +1,5 @@
+
+
+
diff --git a/CatalogueMovie/app/src/main/res/layout/activity_settings.xml b/CatalogueMovie/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000..4b16f40
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/layout/favourite_widget.xml b/CatalogueMovie/app/src/main/res/layout/favourite_widget.xml
new file mode 100644
index 0000000..7aae527
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/layout/favourite_widget.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/layout/widget_item.xml b/CatalogueMovie/app/src/main/res/layout/widget_item.xml
new file mode 100644
index 0000000..7c68ad6
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/layout/widget_item.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/values-v14/dimens.xml b/CatalogueMovie/app/src/main/res/values-v14/dimens.xml
new file mode 100644
index 0000000..4db8c59
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/values-v14/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ 0dp
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/values/dimens.xml b/CatalogueMovie/app/src/main/res/values/dimens.xml
index b4899b5..ea41f2c 100644
--- a/CatalogueMovie/app/src/main/res/values/dimens.xml
+++ b/CatalogueMovie/app/src/main/res/values/dimens.xml
@@ -10,4 +10,10 @@
176dp
16dp
60dp
+
+
+ 8dp
\ No newline at end of file
diff --git a/CatalogueMovie/app/src/main/res/values/strings.xml b/CatalogueMovie/app/src/main/res/values/strings.xml
index 5885278..b34bf24 100644
--- a/CatalogueMovie/app/src/main/res/values/strings.xml
+++ b/CatalogueMovie/app/src/main/res/values/strings.xml
@@ -40,4 +40,18 @@
Gagal menambahkan ke favourite
failed to remove from favourite
You have no favourite yet.
+ EXAMPLE
+ Add widget
+ Belum ada film favourite
+ Change Language
+ Change
+ Daily Remainder
+ Release Remainder
+ On
+ Settings
+ Off
+ daily remainder is on
+ Cancel daily remainder
+ Release remainder is on
+ Cancel release remainder
diff --git a/CatalogueMovie/app/src/main/res/xml/favourite_widget_info.xml b/CatalogueMovie/app/src/main/res/xml/favourite_widget_info.xml
new file mode 100644
index 0000000..bfb49dc
--- /dev/null
+++ b/CatalogueMovie/app/src/main/res/xml/favourite_widget_info.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file
diff --git a/CatalogueMovie/favouriteapp/src/main/AndroidManifest.xml b/CatalogueMovie/favouriteapp/src/main/AndroidManifest.xml
index fd4694d..21e2ff4 100644
--- a/CatalogueMovie/favouriteapp/src/main/AndroidManifest.xml
+++ b/CatalogueMovie/favouriteapp/src/main/AndroidManifest.xml
@@ -20,7 +20,8 @@
-
+
+
\ No newline at end of file
diff --git a/MyAlarmManager/.idea/caches/build_file_checksums.ser b/MyAlarmManager/.idea/caches/build_file_checksums.ser
index 625a3d1..35146de 100644
Binary files a/MyAlarmManager/.idea/caches/build_file_checksums.ser and b/MyAlarmManager/.idea/caches/build_file_checksums.ser differ
diff --git a/MyJobScheduler/.idea/misc.xml b/MyJobScheduler/.idea/misc.xml
index 99202cc..c0f68ed 100644
--- a/MyJobScheduler/.idea/misc.xml
+++ b/MyJobScheduler/.idea/misc.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/MyJobScheduler/app/src/main/java/com/anggitprayogo/dicoding/myjobscheduler/service/GetCurrentWheatherJobService.java b/MyJobScheduler/app/src/main/java/com/anggitprayogo/dicoding/myjobscheduler/service/GetCurrentWheatherJobService.java
index 6cdfa9a..3db3975 100644
--- a/MyJobScheduler/app/src/main/java/com/anggitprayogo/dicoding/myjobscheduler/service/GetCurrentWheatherJobService.java
+++ b/MyJobScheduler/app/src/main/java/com/anggitprayogo/dicoding/myjobscheduler/service/GetCurrentWheatherJobService.java
@@ -23,79 +23,6 @@
public class GetCurrentWheatherJobService extends JobService{
-// private final String TAG = getClass().getSimpleName();
-//
-// final String APP_ID = "827ccc94b9d80b6937cae986bc675e5e";
-// final String CITY = "Jakarta";
-//
-// @Override
-// public boolean onStartJob(JobParameters params) {
-// Log.d(TAG, "onStartJob: ");
-// getCurrentWeather(params);
-// return true;
-// }
-//
-// @Override
-// public boolean onStopJob(JobParameters params) {
-// Log.d(TAG, "onStopJob: ");
-// return true;
-// }
-//
-// private void getCurrentWeather(final JobParameters params) {
-// Log.d(TAG, "getCurrentWeather: ");
-// AsyncHttpClient client = new AsyncHttpClient();
-// String url = "http://api.openweathermap.org/data/2.5/weather?q="+CITY+"&appid="+APP_ID;
-// Log.e(TAG, "getCurrentWeather: "+url);
-// client.get(url, new AsyncHttpResponseHandler() {
-// @Override
-// public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
-// String result = new String(responseBody);
-// Log.d(TAG, "onSuccess: "+result);
-// try {
-// JSONObject jsonObject = new JSONObject(result);
-// String currentWheather = jsonObject.getJSONArray("weather").getJSONObject(0).getString("main");
-// String description = jsonObject.getJSONArray("weather").getJSONObject(0).getString("description");
-// double temp = jsonObject.getJSONObject("main").getDouble("temp");
-//
-// double celcius = temp - 273;
-// String temperature = new DecimalFormat("##.##").format(celcius);
-//
-// String title = "Current Weather";
-// String message = currentWheather.concat(", ").concat(description).concat(" with ").concat(temperature).concat(" Celcius");
-// int notifId = 100;
-//
-// showNotification(getApplicationContext(), title, message, notifId);
-//
-// jobFinished(params, false);
-//
-// }catch (Exception e){
-// Log.d(TAG, "onSuccess: "+e.getMessage());
-// jobFinished(params, true);
-// }
-// }
-//
-// @Override
-// public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
-// Log.d(TAG, "onFailure: "+error.getMessage());
-// jobFinished(params, true);
-// }
-// });
-// }
-//
-// private void showNotification(Context applicationContext, String title, String message, int notifId) {
-// NotificationManager notificationManager = (NotificationManager)applicationContext.getSystemService(NOTIFICATION_SERVICE);
-//
-// Uri alarmSound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
-// NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
-// .setVibrate(new long[]{1000,1000,1000,100})
-// .setContentText(message)
-// .setContentTitle(title)
-// .setSmallIcon(R.drawable.ic_wb_sunny_black_24dp)
-// .setSound(alarmSound);
-//
-// notificationManager.notify(notifId, builder.build());
-// }
-
public static final String TAG = GetCurrentWheatherJobService.class.getSimpleName();
final String APP_ID = "827ccc94b9d80b6937cae986bc675e5e";
//private final String CITY = "ISIKAN DENGAN NAMA KOTA KAMU";
@@ -161,4 +88,4 @@ private void showNotification(Context context, String title, String message, int
.setSound(alarmSound);
notificationManagerCompat.notify(notifId, builder.build());
}
-}
+}
\ No newline at end of file
diff --git a/MyStackWidget/.idea/assetWizardSettings.xml b/MyStackWidget/.idea/assetWizardSettings.xml
new file mode 100644
index 0000000..f0e8567
--- /dev/null
+++ b/MyStackWidget/.idea/assetWizardSettings.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MyStackWidget/.idea/caches/build_file_checksums.ser b/MyStackWidget/.idea/caches/build_file_checksums.ser
index c0f2ffe..01a89b5 100644
Binary files a/MyStackWidget/.idea/caches/build_file_checksums.ser and b/MyStackWidget/.idea/caches/build_file_checksums.ser differ
diff --git a/MyStackWidget/app/build.gradle b/MyStackWidget/app/build.gradle
index 2b55cb6..2093386 100644
--- a/MyStackWidget/app/build.gradle
+++ b/MyStackWidget/app/build.gradle
@@ -4,7 +4,7 @@ android {
compileSdkVersion 28
defaultConfig {
applicationId "com.anggitprayogo.dicoding.mystackwidget"
- minSdkVersion 15
+ minSdkVersion 17
targetSdkVersion 28
versionCode 1
versionName "1.0"
diff --git a/MyStackWidget/app/src/main/AndroidManifest.xml b/MyStackWidget/app/src/main/AndroidManifest.xml
index 8c56cd4..dbaade8 100644
--- a/MyStackWidget/app/src/main/AndroidManifest.xml
+++ b/MyStackWidget/app/src/main/AndroidManifest.xml
@@ -16,6 +16,19 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/ImageBannerWidget.java b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/ImageBannerWidget.java
new file mode 100644
index 0000000..53eaa08
--- /dev/null
+++ b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/ImageBannerWidget.java
@@ -0,0 +1,73 @@
+package com.anggitprayogo.dicoding.mystackwidget;
+
+import android.app.PendingIntent;
+import android.appwidget.AppWidgetManager;
+import android.appwidget.AppWidgetProvider;
+import android.content.Context;
+import android.content.Intent;
+import android.net.Uri;
+import android.widget.RemoteViews;
+import android.widget.Toast;
+
+/**
+ * Implementation of App Widget functionality.
+ */
+public class ImageBannerWidget extends AppWidgetProvider {
+
+ public static final String TOAST_ACTION = "com.anggitprayogo.dicoding.mystackwidget.TOAST_ACTION";
+ public static final String EXTRA_ITEM = "com.anggitprayogo.dicoding.mystackwidget.EXTRA_ITEM";
+
+ static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
+ int appWidgetId) {
+
+
+ Intent intent = new Intent(context, StackWidgetService.class);
+ intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+ intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+ RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.image_banner_widget);
+ remoteViews.setRemoteAdapter(R.id.stack_view, intent);
+ remoteViews.setEmptyView(R.id.stack_view, R.id.empty_view);
+
+ Intent toastIntent = new Intent(context, ImageBannerWidget.class);
+
+ toastIntent.setAction(ImageBannerWidget.TOAST_ACTION);
+ toastIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+ intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, toastIntent, PendingIntent.FLAG_UPDATE_CURRENT);
+ remoteViews.setPendingIntentTemplate(R.id.stack_view, pendingIntent);
+
+
+ appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
+
+ }
+
+ @Override
+ public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
+ // There may be multiple widgets active, so update all of them
+ for (int appWidgetId : appWidgetIds) {
+ updateAppWidget(context, appWidgetManager, appWidgetId);
+ }
+ }
+
+ @Override
+ public void onEnabled(Context context) {
+ // Enter relevant functionality for when the first widget is created
+ }
+
+ @Override
+ public void onDisabled(Context context) {
+ // Enter relevant functionality for when the last widget is disabled
+ }
+
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ AppWidgetManager mgr = AppWidgetManager.getInstance(context);
+ if (intent.getAction().equals(TOAST_ACTION)){
+ int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
+ int viewIndex = intent.getIntExtra(EXTRA_ITEM, 0);
+ Toast.makeText(context, "Touched View "+viewIndex, Toast.LENGTH_SHORT).show();
+ }
+ super.onReceive(context, intent);
+ }
+}
+
diff --git a/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackRemoteViewsFactory.java b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackRemoteViewsFactory.java
new file mode 100644
index 0000000..4d04736
--- /dev/null
+++ b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackRemoteViewsFactory.java
@@ -0,0 +1,89 @@
+package com.anggitprayogo.dicoding.mystackwidget;
+
+import android.appwidget.AppWidgetManager;
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Bundle;
+import android.util.Log;
+import android.widget.RemoteViews;
+import android.widget.RemoteViewsService;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class StackRemoteViewsFactory implements RemoteViewsService.RemoteViewsFactory{
+
+ private List mWidgetItems = new ArrayList<>();
+ private Context context;
+ private int mAppWidgetId;
+ private String TAG = getClass().getSimpleName();
+
+
+ public StackRemoteViewsFactory(Context context, Intent intent) {
+ this.context = context;
+ mAppWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
+ AppWidgetManager.INVALID_APPWIDGET_ID);
+ }
+
+ @Override
+ public void onCreate() {
+ mWidgetItems.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.star_wars_logo));
+ mWidgetItems.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.star_wars_logo));
+ mWidgetItems.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.star_wars_logo));
+ mWidgetItems.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.star_wars_logo));
+ mWidgetItems.add(BitmapFactory.decodeResource(context.getResources(), R.drawable.star_wars_logo));
+ }
+
+ @Override
+ public void onDataSetChanged() {
+
+ }
+
+ @Override
+ public void onDestroy() {
+
+ }
+
+ @Override
+ public int getCount() {
+ return mWidgetItems.size();
+ }
+
+ @Override
+ public RemoteViews getViewAt(int position) {
+ RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_item);
+ remoteViews.setImageViewBitmap(R.id.imageView, mWidgetItems.get(position));
+ remoteViews.setTextViewText(R.id.banner_text, "Test");
+ Log.d(TAG, "getViewAt: "+mWidgetItems.get(0).toString());
+
+ Bundle extras = new Bundle();
+ extras.putInt(ImageBannerWidget.EXTRA_ITEM, position);
+ Intent fillIntent = new Intent();
+ fillIntent.putExtras(extras);
+
+ remoteViews.setOnClickFillInIntent(R.id.imageView, fillIntent);
+ return remoteViews;
+ }
+
+ @Override
+ public RemoteViews getLoadingView() {
+ return null;
+ }
+
+ @Override
+ public int getViewTypeCount() {
+ return 1;
+ }
+
+ @Override
+ public long getItemId(int position) {
+ return 0;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+}
diff --git a/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackWidgetService.java b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackWidgetService.java
new file mode 100644
index 0000000..6112abd
--- /dev/null
+++ b/MyStackWidget/app/src/main/java/com/anggitprayogo/dicoding/mystackwidget/StackWidgetService.java
@@ -0,0 +1,12 @@
+package com.anggitprayogo.dicoding.mystackwidget;
+
+import android.content.Intent;
+import android.widget.RemoteViewsService;
+
+public class StackWidgetService extends RemoteViewsService{
+
+ @Override
+ public RemoteViewsFactory onGetViewFactory(Intent intent) {
+ return new StackRemoteViewsFactory(this.getApplicationContext(), intent);
+ }
+}
diff --git a/MyStackWidget/app/src/main/res/drawable-nodpi/example_appwidget_preview.png b/MyStackWidget/app/src/main/res/drawable-nodpi/example_appwidget_preview.png
new file mode 100644
index 0000000..894b069
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable-nodpi/example_appwidget_preview.png differ
diff --git a/MyStackWidget/app/src/main/res/drawable/darth_vader.jpg b/MyStackWidget/app/src/main/res/drawable/darth_vader.jpg
new file mode 100644
index 0000000..d80d7f0
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable/darth_vader.jpg differ
diff --git a/MyStackWidget/app/src/main/res/drawable/falcon.jpg b/MyStackWidget/app/src/main/res/drawable/falcon.jpg
new file mode 100644
index 0000000..9ca1e48
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable/falcon.jpg differ
diff --git a/MyStackWidget/app/src/main/res/drawable/ic_android_black_24dp.xml b/MyStackWidget/app/src/main/res/drawable/ic_android_black_24dp.xml
new file mode 100644
index 0000000..401cbf6
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/drawable/ic_android_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/MyStackWidget/app/src/main/res/drawable/star_wars_logo.gif b/MyStackWidget/app/src/main/res/drawable/star_wars_logo.gif
new file mode 100644
index 0000000..7a276bf
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable/star_wars_logo.gif differ
diff --git a/MyStackWidget/app/src/main/res/drawable/starwars.jpg b/MyStackWidget/app/src/main/res/drawable/starwars.jpg
new file mode 100644
index 0000000..655d7a8
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable/starwars.jpg differ
diff --git a/MyStackWidget/app/src/main/res/drawable/storm_trooper.jpg b/MyStackWidget/app/src/main/res/drawable/storm_trooper.jpg
new file mode 100644
index 0000000..63ea174
Binary files /dev/null and b/MyStackWidget/app/src/main/res/drawable/storm_trooper.jpg differ
diff --git a/MyStackWidget/app/src/main/res/layout/image_banner_widget.xml b/MyStackWidget/app/src/main/res/layout/image_banner_widget.xml
new file mode 100644
index 0000000..1fa242f
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/layout/image_banner_widget.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/MyStackWidget/app/src/main/res/layout/widget_item.xml b/MyStackWidget/app/src/main/res/layout/widget_item.xml
new file mode 100644
index 0000000..16043fe
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/layout/widget_item.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/MyStackWidget/app/src/main/res/values-v14/dimens.xml b/MyStackWidget/app/src/main/res/values-v14/dimens.xml
new file mode 100644
index 0000000..4db8c59
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/values-v14/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ 0dp
+
+
\ No newline at end of file
diff --git a/MyStackWidget/app/src/main/res/values/dimens.xml b/MyStackWidget/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..fdececf
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/values/dimens.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ 8dp
+
+
\ No newline at end of file
diff --git a/MyStackWidget/app/src/main/res/values/strings.xml b/MyStackWidget/app/src/main/res/values/strings.xml
index ad4543a..0e40cb2 100644
--- a/MyStackWidget/app/src/main/res/values/strings.xml
+++ b/MyStackWidget/app/src/main/res/values/strings.xml
@@ -1,3 +1,6 @@
MyStackWidget
+ EXAMPLE
+ Add widget
+ empty
diff --git a/MyStackWidget/app/src/main/res/xml/image_banner_widget_info.xml b/MyStackWidget/app/src/main/res/xml/image_banner_widget_info.xml
new file mode 100644
index 0000000..9c212a6
--- /dev/null
+++ b/MyStackWidget/app/src/main/res/xml/image_banner_widget_info.xml
@@ -0,0 +1,9 @@
+
+
\ No newline at end of file