From 2a5e936116cd6adcc4a461091e101b3704d4e6c0 Mon Sep 17 00:00:00 2001 From: Chao Zhang Date: Mon, 11 Apr 2016 19:32:14 +0800 Subject: Gallery2: fix photo widget has not sync after delete the photo. Use a ContentObserver to observe uri's change. If uri is deleted, show a empty view in widght. Change-Id: I11f0632ed96958a74b6aa2cdd9c2f1d88c99e94e CRs-Fixed: 981663 --- res/layout/photo_frame.xml | 22 +++++++ .../gallery3d/gadget/PhotoAppWidgetProvider.java | 67 ++++++++++++++++++++++ 2 files changed, 89 insertions(+) diff --git a/res/layout/photo_frame.xml b/res/layout/photo_frame.xml index 63faf539d..ede942f6b 100755 --- a/res/layout/photo_frame.xml +++ b/res/layout/photo_frame.xml @@ -21,6 +21,28 @@ android:paddingBottom="23dp" android:paddingStart="12dp" android:paddingEnd="12dp"> + + + + + + + + mPhotoUriObservers = new ArrayList<>(); + private static Handler mContentObserverHandler = new Handler(); static RemoteViews buildWidget(Context context, int id, Entry entry) { @@ -44,6 +53,12 @@ public class PhotoAppWidgetProvider extends AppWidgetProvider { case WidgetDatabaseHelper.TYPE_SHUFFLE: return buildStackWidget(context, id, entry); case WidgetDatabaseHelper.TYPE_SINGLE_PHOTO: + PhotoUriContentObserver photoUriObserver = + new PhotoUriContentObserver(context, mContentObserverHandler, entry, id); + photoUriObserver.setTag(id); + mPhotoUriObservers.add(photoUriObserver); + context.getContentResolver().registerContentObserver(Uri.parse(entry.imageUri), + false, photoUriObserver); return buildFrameWidget(context, id, entry); } throw new RuntimeException("invalid type - " + entry.type); @@ -132,8 +147,60 @@ public class PhotoAppWidgetProvider extends AppWidgetProvider { // Clean deleted photos out of our database WidgetDatabaseHelper helper = new WidgetDatabaseHelper(context); for (int appWidgetId : appWidgetIds) { + PhotoUriContentObserver contentObserver = getContentObserver(appWidgetId); + if (contentObserver != null) { + context.getContentResolver().unregisterContentObserver(contentObserver); + mPhotoUriObservers.remove(contentObserver); + } helper.deleteEntry(appWidgetId); } helper.close(); } + + private PhotoUriContentObserver getContentObserver(int appWidgetId) { + for (PhotoUriContentObserver contentObserver : mPhotoUriObservers) { + if (appWidgetId == contentObserver.getTag()) { + return contentObserver; + } + } + return null; + } + + private static class PhotoUriContentObserver extends ContentObserver { + private int mId; + private int mTag; + private Context mContext; + private Entry mEntry; + + public void setTag(int tag) { + this.mTag = tag; + } + + public int getTag() { + return mTag; + } + + public PhotoUriContentObserver(Context context, Handler handler, Entry entry, int id) { + super(handler); + mContext = context; + mEntry = entry; + mId = id; + } + + public void onChange(boolean selfChange) { + super.onChange(selfChange); + Uri uri = Uri.parse(mEntry.imageUri); + Cursor cursor = mContext.getContentResolver().query(uri, null, null, + null, "_id ASC LIMIT 1"); + if (cursor != null) { + if (cursor.getCount() == 0) { + RemoteViews views = buildFrameWidget(mContext, mId, mEntry); + views.setViewVisibility(R.id.appwidget_empty_photo, View.VISIBLE); + views.setViewVisibility(R.id.photo, View.GONE); + AppWidgetManager.getInstance(mContext).updateAppWidget(mId, views); + } + cursor.close(); + } + } + } } -- cgit v1.2.3