/* * Copyright (C) 2014 Square, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.squareup.picasso; import android.app.Notification; import android.app.NotificationManager; import android.appwidget.AppWidgetManager; import android.graphics.Bitmap; import android.widget.RemoteViews; import static android.content.Context.NOTIFICATION_SERVICE; import static com.squareup.picasso.Utils.getService; abstract class RemoteViewsAction extends Action<RemoteViewsAction.RemoteViewsTarget> { final RemoteViews remoteViews; final int viewId; Callback callback; private RemoteViewsTarget target; RemoteViewsAction(Picasso picasso, Request data, RemoteViews remoteViews, int viewId, int errorResId, int memoryPolicy, int networkPolicy, Object tag, String key, Callback callback) { super(picasso, null, data, memoryPolicy, networkPolicy, errorResId, null, key, tag, false); this.remoteViews = remoteViews; this.viewId = viewId; this.callback = callback; } @Override void complete(Bitmap result, Picasso.LoadedFrom from) { remoteViews.setImageViewBitmap(viewId, result); update(); if (callback != null) { callback.onSuccess(); } } @Override void cancel() { super.cancel(); if (callback != null) { callback = null; } } @Override public void error(Exception e) { if (errorResId != 0) { setImageResource(errorResId); } if (callback != null) { callback.onError(e); } } @Override RemoteViewsTarget getTarget() { if (target == null) { target = new RemoteViewsTarget(remoteViews, viewId); } return target; } void setImageResource(int resId) { remoteViews.setImageViewResource(viewId, resId); update(); } abstract void update(); static class RemoteViewsTarget { final RemoteViews remoteViews; final int viewId; RemoteViewsTarget(RemoteViews remoteViews, int viewId) { this.remoteViews = remoteViews; this.viewId = viewId; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; RemoteViewsTarget remoteViewsTarget = (RemoteViewsTarget) o; return viewId == remoteViewsTarget.viewId && remoteViews.equals( remoteViewsTarget.remoteViews); } @Override public int hashCode() { return 31 * remoteViews.hashCode() + viewId; } } static class AppWidgetAction extends RemoteViewsAction { private final int[] appWidgetIds; AppWidgetAction(Picasso picasso, Request data, RemoteViews remoteViews, int viewId, int[] appWidgetIds, int memoryPolicy, int networkPolicy, String key, Object tag, int errorResId, Callback callback) { super(picasso, data, remoteViews, viewId, errorResId, memoryPolicy, networkPolicy, tag, key, callback); this.appWidgetIds = appWidgetIds; } @Override void update() { AppWidgetManager manager = AppWidgetManager.getInstance(picasso.context); manager.updateAppWidget(appWidgetIds, remoteViews); } } static class NotificationAction extends RemoteViewsAction { private final int notificationId; private final String notificationTag; private final Notification notification; NotificationAction(Picasso picasso, Request data, RemoteViews remoteViews, int viewId, int notificationId, Notification notification, String notificationTag, int memoryPolicy, int networkPolicy, String key, Object tag, int errorResId, Callback callback) { super(picasso, data, remoteViews, viewId, errorResId, memoryPolicy, networkPolicy, tag, key, callback); this.notificationId = notificationId; this.notificationTag = notificationTag; this.notification = notification; } @Override void update() { NotificationManager manager = getService(picasso.context, NOTIFICATION_SERVICE); manager.notify(notificationTag, notificationId, notification); } } }