package com.bumptech.glide.request.target;


import android.app.Notification;
import android.app.NotificationManager;
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 to display downloaded Bitmap inside an ImageView of a Notification 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 NotificationTarget extends SimpleTarget<Bitmap> {
  private final RemoteViews remoteViews;
  private final Context context;
  private final int notificationId;
  private final String notificationTag;
  private final Notification notification;
  private final int viewId;

  /**
   * Constructor using a Notification object and a notificationId to get a handle on the
   * Notification 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 notification    The Notification object that we want to update.
   * @param notificationId  The notificationId of the Notification that we want to load the Bitmap.
   */
  public NotificationTarget(Context context,
      int viewId, RemoteViews remoteViews, Notification notification, int notificationId) {
    this(context, viewId, remoteViews, notification, notificationId, null);
  }

  /**
   * Constructor using a Notification object, a notificationId, and a notificationTag to get a
   * handle on the Notification 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 notification    The Notification object that we want to update.
   * @param notificationId  The notificationId of the Notification that we want to load the Bitmap.
   * @param notificationTag The notificationTag of the Notification that we want to load the Bitmap.
   *                        May be {@code null}.
   */
  public NotificationTarget(Context context, int viewId, RemoteViews remoteViews,
      Notification notification, int notificationId, String notificationTag) {
    this(context, SIZE_ORIGINAL, SIZE_ORIGINAL, viewId, remoteViews, notification, notificationId,
      notificationTag);
  }

  /**
   * Constructor using a Notification object, a notificationId, and a notificationTag to get a
   * handle on the Notification in order to update it.
   *
   * @param context         Context to use in the AppWidgetManager initialization.
   * @param width           Desired width of the bitmap that will be loaded.(Need to be manually put
   *                        because of RemoteViews limitations.)
   * @param height          Desired height of the bitmap that will be loaded. (Need 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 notification    The Notification object that we want to update.
   * @param notificationId  The notificationId of the Notification that we want to load the Bitmap.
   * @param notificationTag The notificationTag of the Notification that we want to load the
   *                        Bitmap. May be {@code null}.
   */
  public NotificationTarget(Context context, int width, int height, int viewId,
      RemoteViews remoteViews, Notification notification, int notificationId,
      String notificationTag) {
    super(width, height);
    this.context = Preconditions.checkNotNull(context, "Context must not be null!");
    this.notification =
        Preconditions.checkNotNull(notification, "Notification object can not be null!");
    this.remoteViews =
        Preconditions.checkNotNull(remoteViews, "RemoteViews object can not be null!");
    this.viewId = viewId;
    this.notificationId = notificationId;
    this.notificationTag = notificationTag;
  }

  /**
   * Updates the Notification after the Bitmap resource is loaded.
   */
  private void update() {
    NotificationManager manager =
        (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(this.notificationTag, this.notificationId, this.notification);
  }

  @Override
  public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
    this.remoteViews.setImageViewBitmap(this.viewId, resource);
    this.update();
  }
}
