package com.bumptech.glide.request.target;
import android.appwidget.AppWidgetManager;
import android.content.ComponentName;
import android.content.Context;
import android.graphics.Bitmap;
import android.widget.RemoteViews;
import com.bumptech.glide.request.transition.Transition;
import com.bumptech.glide.util.Preconditions;
/**
* This class is used in order to display downloaded Bitmap inside an ImageView of an AppWidget
* through RemoteViews.
*
* <p> Note - For cancellation to work correctly, you must pass in the same instance of this class
* for every subsequent load. </p>
*/
public class AppWidgetTarget extends SimpleTarget<Bitmap> {
private final int[] widgetIds;
private final ComponentName componentName;
private final RemoteViews remoteViews;
private final Context context;
private final int viewId;
/**
* Constructor using an int array of widgetIds to get a handle on the Widget in order to update
* it.
*
* @param context Context to use in the AppWidgetManager initialization.
* @param width Desired width in pixels of the bitmap that will be loaded. (Needs to be
* manually put because of RemoteViews limitations.)
* @param height Desired height in pixels of the bitmap that will be loaded. (Needs to be
* manually put because of RemoteViews limitations.)
* @param viewId The id of the ImageView view that will load the image.
* @param remoteViews RemoteViews object which contains the ImageView that will load the bitmap.
* @param widgetIds The int[] that contains the widget ids of an application.
*/
public AppWidgetTarget(Context context, int width, int height,
int viewId, RemoteViews remoteViews, int... widgetIds) {
super(width, height);
if (widgetIds.length == 0) {
throw new IllegalArgumentException("WidgetIds must have length > 0");
}
this.context = Preconditions.checkNotNull(context, "Context can not be null!");
this.remoteViews =
Preconditions.checkNotNull(remoteViews, "RemoteViews object can not be null!");
this.widgetIds = Preconditions.checkNotNull(widgetIds, "WidgetIds can not be null!");
this.viewId = viewId;
componentName = null;
}
/**
* Constructor using an int array of widgetIds to get a handle on the Widget in order to update it
* that uses {@link #SIZE_ORIGINAL} as the target width and height.
*
* @param context Context to use in the AppWidgetManager initialization.
* @param viewId The id of the ImageView view that will load the image.
* @param remoteViews RemoteViews object which contains the ImageView that will load the bitmap.
* @param widgetIds The int[] that contains the widget ids of an application.
*/
public AppWidgetTarget(Context context,
int viewId, RemoteViews remoteViews, int... widgetIds) {
this(context, SIZE_ORIGINAL, SIZE_ORIGINAL, viewId, remoteViews, widgetIds);
}
/**
* Constructor using a ComponentName to get a handle on the Widget in order to update it.
*
* @param context Context to use in the AppWidgetManager initialization.
* @param width Desired width in pixels of the bitmap that will be loaded. (Needs to be
* manually put because of RemoteViews limitations.)
* @param height Desired height in pixels of the bitmap that will be loaded. (Needs to be
* manually put because of RemoteViews limitations.)
* @param viewId The id of the ImageView view that will load the image.
* @param remoteViews RemoteViews object which contains the ImageView that will load the
* bitmap.
* @param componentName The ComponentName that refers to our AppWidget.
*/
public AppWidgetTarget(Context context, int width, int height,
int viewId, RemoteViews remoteViews, ComponentName componentName) {
super(width, height);
this.context = Preconditions.checkNotNull(context, "Context can not be null!");
this.remoteViews =
Preconditions.checkNotNull(remoteViews, "RemoteViews object can not be null!");
this.componentName =
Preconditions.checkNotNull(componentName, "ComponentName can not be null!");
this.viewId = viewId;
widgetIds = null;
}
/**
* Constructor using a ComponentName, when override has been put to get a handle on the Widget in
* order to update it that uses {@link #SIZE_ORIGINAL} as the target width and height.
*
* @param context Context to use in the AppWidgetManager initialization.
* @param viewId The id of the ImageView view that will load the image.
* @param remoteViews RemoteViews object which contains the ImageView that will load the
* bitmap.
* @param componentName The ComponentName that refers to our AppWidget.
*/
public AppWidgetTarget(Context context,
int viewId, RemoteViews remoteViews, ComponentName componentName) {
this(context, SIZE_ORIGINAL, SIZE_ORIGINAL, viewId, remoteViews, componentName);
}
/**
* Updates the AppWidget after the ImageView has loaded the Bitmap.
*/
private void update() {
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this.context);
if (this.componentName != null) {
appWidgetManager.updateAppWidget(this.componentName, this.remoteViews);
} else {
appWidgetManager.updateAppWidget(this.widgetIds, this.remoteViews);
}
}
@Override
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
this.remoteViews.setImageViewBitmap(this.viewId, resource);
this.update();
}
}