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