Last active
October 3, 2018 14:45
-
-
Save TomasValenta/4645cb92fdc17ad1bd5e2dd21b145f6b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class WidgetProvider extends AppWidgetProvider { | |
@StringDef({Actions.MANUAL_REFRESH, Actions.DETAIL_ACTIVITY, Actions.RECONFIGURATION_ACTIVITY}) | |
@Retention(RetentionPolicy.SOURCE) | |
private @interface Actions { | |
String MANUAL_REFRESH = BuildConfig.APPLICATION_ID + ".widget.MANUAL_REFRESH_ACTION"; | |
String DETAIL_ACTIVITY = BuildConfig.APPLICATION_ID + ".widget.DETAIL_ACTIVITY_ACTION"; | |
String RECONFIGURATION_ACTIVITY = BuildConfig.APPLICATION_ID + ".widget.RECONFIGURATION_ACTIVITY_ACTION"; | |
} | |
private static final String SET_COLOR_FILTER = "setColorFilter"; | |
private static final String SET_BACKGROUND_COLOR = "setBackgroundColor"; | |
private static final int WIDGET_IMAGE_SIZE = 720; | |
@Override | |
public void onUpdate(final Context context, final AppWidgetManager appWidgetManager, final int[] appWidgetIds) { | |
super.onUpdate(context, appWidgetManager, appWidgetIds); | |
for (final int appWidgetId : appWidgetIds) { | |
updateAppWidget(context, appWidgetManager, appWidgetId, true, false); | |
} | |
} | |
@Override | |
public void onAppWidgetOptionsChanged(final Context context, final AppWidgetManager appWidgetManager, final int appWidgetId, final Bundle newOptions) { | |
super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); | |
updateAppWidget(context, appWidgetManager, appWidgetId, true, false); | |
} | |
@Override | |
public void onDeleted(final Context context, final int[] appWidgetIds) { | |
super.onDeleted(context, appWidgetIds); | |
for (final int appWidgetId : appWidgetIds) { | |
cancelAutoRefreshAlarm(context, appWidgetId); | |
} | |
} | |
@Override | |
public void onReceive(@NonNull final Context context, @NonNull final Intent intent) { | |
super.onReceive(context, intent); | |
final int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); | |
switch (intent.getAction()) { | |
case Actions.MANUAL_REFRESH: | |
updateAppWidget(context, AppWidgetManager.getInstance(context), appWidgetId, false, true); | |
break; | |
case Actions.DETAIL_ACTIVITY: | |
final Intent detailActivityIntent = new Intent(context, DetailActivity.class); | |
detailActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_NAME, WidgetsUtils.loadStringPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_NAME)); | |
detailActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_URL, WidgetsUtils.loadStringPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_URL)); | |
detailActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |
context.startActivity(detailActivityIntent); | |
break; | |
case Actions.RECONFIGURATION_ACTIVITY: | |
final Intent configurationActivityIntent = new Intent(context, WebCamsWidgetReConfigure.class); | |
configurationActivityIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); | |
configurationActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_NAME, WidgetsUtils.loadStringPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_NAME)); | |
configurationActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_INTERVAL, WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_INTERVAL)); | |
configurationActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_TOP_BAR_HIDE, WidgetsUtils.loadBooleanPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_TOP_BAR_HIDE)); | |
final int textColor = WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_TEXT_COLOR); | |
if (textColor != 0) { | |
configurationActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_TEXT_COLOR, textColor); | |
} | |
final int backgroundColor = WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_BACKGROUND_COLOR); | |
if (backgroundColor != 0) { | |
configurationActivityIntent.putExtra(WidgetsUtils.Key.WIDGET_BACKGROUND_COLOR, backgroundColor); | |
} | |
configurationActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); | |
context.startActivity(configurationActivityIntent); | |
break; | |
} | |
} | |
private void updateAppWidget(final Context context, final AppWidgetManager appWidgetManager, | |
final int appWidgetId, final boolean resetRefreshAlarm, final boolean hideRefreshButton) { | |
final RemoteViews widgetLayout = new RemoteViews(context.getPackageName(), R.layout.widget_layout); | |
final PendingIntent refreshPendingIntent = getPendingIntent(context, appWidgetId, Actions.MANUAL_REFRESH); | |
final String name = WidgetsUtils.loadStringPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_NAME); | |
final String url = WidgetsUtils.loadStringPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_URL); | |
final int textColor = WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_TEXT_COLOR); | |
final int backgroundColor = WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_BACKGROUND_COLOR); | |
final int refreshInterval = WidgetsUtils.loadIntPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_INTERVAL); | |
final boolean topBarHide = WidgetsUtils.loadBooleanPref(context, appWidgetId, WidgetsUtils.Key.WIDGET_TOP_BAR_HIDE); | |
widgetLayout.setViewVisibility(R.id.widgetUpdateButton, hideRefreshButton ? View.GONE : View.VISIBLE); | |
widgetLayout.setOnClickPendingIntent(R.id.widgetWebCamImage, getPendingIntent(context, appWidgetId, Actions.DETAIL_ACTIVITY)); | |
widgetLayout.setOnClickPendingIntent(R.id.widgetConfigureButton, getPendingIntent(context, appWidgetId, Actions.RECONFIGURATION_ACTIVITY)); | |
widgetLayout.setOnClickPendingIntent(R.id.widgetUpdateButton, refreshPendingIntent); | |
widgetLayout.setTextViewText(R.id.widgetTitle, name); | |
if (textColor != 0) { | |
widgetLayout.setTextColor(R.id.widgetTitle, textColor); | |
widgetLayout.setTextColor(R.id.widgetUpdateTime, textColor); | |
widgetLayout.setTextColor(R.id.widgetRefreshInfoText, textColor); | |
widgetLayout.setInt(R.id.widgetConfigureButton, SET_COLOR_FILTER, textColor); | |
} | |
if (backgroundColor != 0) { | |
widgetLayout.setInt(R.id.widgetUpdateButton, SET_COLOR_FILTER, backgroundColor); | |
widgetLayout.setInt(R.id.widgetButtonsContainer, SET_BACKGROUND_COLOR, backgroundColor); | |
widgetLayout.setInt(R.id.widgetBackgroundLayout, SET_BACKGROUND_COLOR, backgroundColor); | |
} | |
widgetLayout.setViewVisibility(R.id.widgetButtonsContainer, topBarHide ? View.GONE : View.VISIBLE); | |
if (resetRefreshAlarm) { | |
cancelAutoRefreshAlarm(context, appWidgetId); | |
if (refreshInterval != 0) { | |
final AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE); | |
if (alarmManager != null) { | |
alarmManager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 1000, refreshInterval, refreshPendingIntent); // one second delay | |
} | |
} | |
} | |
loadImage(context, widgetLayout, appWidgetManager, appWidgetId, url); | |
appWidgetManager.updateAppWidget(appWidgetId, widgetLayout); | |
} | |
private void loadImage(final Context context, final RemoteViews widgetLayout, final AppWidgetManager appWidgetManager, final int appWidgetId, final String url) { | |
final AppWidgetTarget appWidgetTarget = new AppWidgetTarget(context.getApplicationContext(), WIDGET_IMAGE_SIZE, WIDGET_IMAGE_SIZE, R.id.widgetWebCamImage, widgetLayout, appWidgetId); | |
GlideApp.with(context.getApplicationContext()) // ApplicationContext is safer! | |
.asBitmap() | |
.load(WebCamsGlideExtensions.getGlideUrlWithHeaders(url)) | |
.skipMemoryAndDiskCache() | |
.listener(new RequestListener<Bitmap>() { | |
@Override | |
public boolean onLoadFailed(@Nullable final GlideException e, final Object model, | |
final Target<Bitmap> target, final boolean isFirstResource) { | |
return updateWidget(); | |
} | |
@Override | |
public boolean onResourceReady(final Bitmap resource, final Object model, final Target<Bitmap> target, | |
final DataSource dataSource, final boolean isFirstResource) { | |
widgetLayout.setTextViewText(R.id.widgetUpdateTime, Utils.getCustomDateString(getPattern(context))); | |
return updateWidget(); | |
} | |
private boolean updateWidget() { | |
widgetLayout.setViewVisibility(R.id.widgetUpdateButton, View.VISIBLE); | |
appWidgetManager.updateAppWidget(appWidgetId, widgetLayout); | |
return false; | |
} | |
}) | |
.into(appWidgetTarget); | |
} | |
private PendingIntent getPendingIntent(final @NonNull Context context, final int appWidgetId, final @NonNull String action) { | |
final Intent intent = new Intent(context, WebCamsWidgetProvider.class); | |
intent.setAction(action); | |
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); | |
intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME))); | |
return PendingIntent.getBroadcast(context.getApplicationContext(), 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); | |
} | |
private void cancelAutoRefreshAlarm(final Context context, final int appWidgetId) { | |
final AlarmManager alarmManager = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE); | |
if (alarmManager != null) { | |
alarmManager.cancel(getPendingIntent(context.getApplicationContext(), appWidgetId, Actions.MANUAL_REFRESH)); | |
} | |
} | |
private String getPattern(final Context context) { | |
return DateFormat.is24HourFormat(context.getApplicationContext()) ? "HH:mm:ss" : "K:mm a"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment