Skip to content

Instantly share code, notes, and snippets.

@TomasValenta
Last active October 3, 2018 14:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save TomasValenta/4645cb92fdc17ad1bd5e2dd21b145f6b to your computer and use it in GitHub Desktop.
Save TomasValenta/4645cb92fdc17ad1bd5e2dd21b145f6b to your computer and use it in GitHub Desktop.
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