diff options
author | Mangesh Ghiware <mghiware@google.com> | 2013-04-24 13:40:39 -0700 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2013-04-24 13:40:39 -0700 |
commit | 78bbe3f54603aac103784201fdbff96772ba1933 (patch) | |
tree | a8e7d517b0feda230db407dd22942b28b27797ad /src/com/android/gallery3d | |
parent | 3fe31386413590bcaf89f7a8f66e7b4d272000dd (diff) | |
parent | 7ff114927c5e02e296485df58966c0fb116376a0 (diff) | |
download | android_packages_apps_Snap-78bbe3f54603aac103784201fdbff96772ba1933.tar.gz android_packages_apps_Snap-78bbe3f54603aac103784201fdbff96772ba1933.tar.bz2 android_packages_apps_Snap-78bbe3f54603aac103784201fdbff96772ba1933.zip |
am ef95774e: Merge "Fix for blank Gallery widgets on a DB upgrade" into gb-ub-photos-bryce
* commit 'ef95774e2463a3d3537d1ddd9b0dfca21c6d56df':
Fix for blank Gallery widgets on a DB upgrade
Diffstat (limited to 'src/com/android/gallery3d')
-rw-r--r-- | src/com/android/gallery3d/gadget/MediaSetSource.java | 223 | ||||
-rw-r--r-- | src/com/android/gallery3d/gadget/WidgetService.java | 37 |
2 files changed, 172 insertions, 88 deletions
diff --git a/src/com/android/gallery3d/gadget/MediaSetSource.java b/src/com/android/gallery3d/gadget/MediaSetSource.java index caeff2a87..458651c98 100644 --- a/src/com/android/gallery3d/gadget/MediaSetSource.java +++ b/src/com/android/gallery3d/gadget/MediaSetSource.java @@ -22,93 +22,212 @@ import android.os.Binder; import com.android.gallery3d.common.Utils; import com.android.gallery3d.data.ContentListener; +import com.android.gallery3d.data.DataManager; import com.android.gallery3d.data.MediaItem; import com.android.gallery3d.data.MediaObject; import com.android.gallery3d.data.MediaSet; +import com.android.gallery3d.data.Path; import java.util.ArrayList; import java.util.Arrays; public class MediaSetSource implements WidgetSource, ContentListener { - private static final int CACHE_SIZE = 32; - - @SuppressWarnings("unused") private static final String TAG = "MediaSetSource"; - private MediaSet mSource; - private MediaItem mCache[] = new MediaItem[CACHE_SIZE]; - private int mCacheStart; - private int mCacheEnd; - private long mSourceVersion = MediaObject.INVALID_DATA_VERSION; + private DataManager mDataManager; + private Path mAlbumPath; + + private WidgetSource mSource; - private ContentListener mContentListener; + private MediaSet mRootSet; + private ContentListener mListener; + + public MediaSetSource(DataManager manager, String albumPath) { + MediaSet mediaSet = (MediaSet) manager.getMediaObject(albumPath); + if (mediaSet != null) { + mSource = new CheckedMediaSetSource(mediaSet); + return; + } - public MediaSetSource(MediaSet source) { - mSource = Utils.checkNotNull(source); - mSource.addContentListener(this); + // Initialize source to an empty source until the album path can be resolved + mDataManager = Utils.checkNotNull(manager); + mAlbumPath = Path.fromString(albumPath); + mSource = new EmptySource(); + monitorRootPath(); } @Override - public void close() { - mSource.removeContentListener(this); + public int size() { + return mSource.size(); } - private void ensureCacheRange(int index) { - if (index >= mCacheStart && index < mCacheEnd) return; - - long token = Binder.clearCallingIdentity(); - try { - mCacheStart = index; - ArrayList<MediaItem> items = mSource.getMediaItem(mCacheStart, CACHE_SIZE); - mCacheEnd = mCacheStart + items.size(); - items.toArray(mCache); - } finally { - Binder.restoreCallingIdentity(token); - } + @Override + public Bitmap getImage(int index) { + return mSource.getImage(index); } @Override - public synchronized Uri getContentUri(int index) { - ensureCacheRange(index); - if (index < mCacheStart || index >= mCacheEnd) return null; - return mCache[index - mCacheStart].getContentUri(); + public Uri getContentUri(int index) { + return mSource.getContentUri(index); } @Override - public synchronized Bitmap getImage(int index) { - ensureCacheRange(index); - if (index < mCacheStart || index >= mCacheEnd) return null; - return WidgetUtils.createWidgetBitmap(mCache[index - mCacheStart]); + public synchronized void setContentListener(ContentListener listener) { + if (mRootSet != null) { + mListener = listener; + } else { + mSource.setContentListener(listener); + } } @Override public void reload() { - long version = mSource.reload(); - if (mSourceVersion != version) { - mSourceVersion = version; - mCacheStart = 0; - mCacheEnd = 0; - Arrays.fill(mCache, null); - } + mSource.reload(); } @Override - public void setContentListener(ContentListener listener) { - mContentListener = listener; + public void close() { + mSource.close(); } @Override - public int size() { - long token = Binder.clearCallingIdentity(); - try { - return mSource.getMediaItemCount(); - } finally { - Binder.restoreCallingIdentity(token); + public void onContentDirty() { + resolveAlbumPath(); + } + + private void monitorRootPath() { + String rootPath = mDataManager.getTopSetPath(DataManager.INCLUDE_ALL); + mRootSet = (MediaSet) mDataManager.getMediaObject(rootPath); + mRootSet.addContentListener(this); + } + + private synchronized void resolveAlbumPath() { + if (mDataManager == null) return; + MediaSet mediaSet = (MediaSet) mDataManager.getMediaObject(mAlbumPath); + if (mediaSet != null) { + // Clear the reference instead of removing the listener + // to get around a concurrent modification exception. + mRootSet = null; + + mSource = new CheckedMediaSetSource(mediaSet); + if (mListener != null) { + mListener.onContentDirty(); + mSource.setContentListener(mListener); + mListener = null; + } + mDataManager = null; + mAlbumPath = null; } } - @Override - public void onContentDirty() { - if (mContentListener != null) mContentListener.onContentDirty(); + private static class CheckedMediaSetSource implements WidgetSource, ContentListener { + private static final int CACHE_SIZE = 32; + + @SuppressWarnings("unused") + private static final String TAG = "CheckedMediaSetSource"; + + private MediaSet mSource; + private MediaItem mCache[] = new MediaItem[CACHE_SIZE]; + private int mCacheStart; + private int mCacheEnd; + private long mSourceVersion = MediaObject.INVALID_DATA_VERSION; + + private ContentListener mContentListener; + + public CheckedMediaSetSource(MediaSet source) { + mSource = Utils.checkNotNull(source); + mSource.addContentListener(this); + } + + @Override + public void close() { + mSource.removeContentListener(this); + } + + private void ensureCacheRange(int index) { + if (index >= mCacheStart && index < mCacheEnd) return; + + long token = Binder.clearCallingIdentity(); + try { + mCacheStart = index; + ArrayList<MediaItem> items = mSource.getMediaItem(mCacheStart, CACHE_SIZE); + mCacheEnd = mCacheStart + items.size(); + items.toArray(mCache); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public synchronized Uri getContentUri(int index) { + ensureCacheRange(index); + if (index < mCacheStart || index >= mCacheEnd) return null; + return mCache[index - mCacheStart].getContentUri(); + } + + @Override + public synchronized Bitmap getImage(int index) { + ensureCacheRange(index); + if (index < mCacheStart || index >= mCacheEnd) return null; + return WidgetUtils.createWidgetBitmap(mCache[index - mCacheStart]); + } + + @Override + public void reload() { + long version = mSource.reload(); + if (mSourceVersion != version) { + mSourceVersion = version; + mCacheStart = 0; + mCacheEnd = 0; + Arrays.fill(mCache, null); + } + } + + @Override + public void setContentListener(ContentListener listener) { + mContentListener = listener; + } + + @Override + public int size() { + long token = Binder.clearCallingIdentity(); + try { + return mSource.getMediaItemCount(); + } finally { + Binder.restoreCallingIdentity(token); + } + } + + @Override + public void onContentDirty() { + if (mContentListener != null) mContentListener.onContentDirty(); + } + } + + private static class EmptySource implements WidgetSource { + + @Override + public int size() { + return 0; + } + + @Override + public Bitmap getImage(int index) { + throw new UnsupportedOperationException(); + } + + @Override + public Uri getContentUri(int index) { + throw new UnsupportedOperationException(); + } + + @Override + public void setContentListener(ContentListener listener) {} + + @Override + public void reload() {} + + @Override + public void close() {} } } diff --git a/src/com/android/gallery3d/gadget/WidgetService.java b/src/com/android/gallery3d/gadget/WidgetService.java index 334b15a69..94dd16439 100644 --- a/src/com/android/gallery3d/gadget/WidgetService.java +++ b/src/com/android/gallery3d/gadget/WidgetService.java @@ -28,9 +28,6 @@ import com.android.gallery3d.R; import com.android.gallery3d.app.GalleryApp; import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.data.ContentListener; -import com.android.gallery3d.data.DataManager; -import com.android.gallery3d.data.MediaSet; -import com.android.gallery3d.data.Path; @TargetApi(ApiHelper.VERSION_CODES.HONEYCOMB) public class WidgetService extends RemoteViewsService { @@ -52,33 +49,6 @@ public class WidgetService extends RemoteViewsService { id, type, albumPath); } - private static class EmptySource implements WidgetSource { - - @Override - public int size() { - return 0; - } - - @Override - public Bitmap getImage(int index) { - throw new UnsupportedOperationException(); - } - - @Override - public Uri getContentUri(int index) { - throw new UnsupportedOperationException(); - } - - @Override - public void setContentListener(ContentListener listener) {} - - @Override - public void reload() {} - - @Override - public void close() {} - } - private static class PhotoRVFactory implements RemoteViewsService.RemoteViewsFactory, ContentListener { @@ -99,12 +69,7 @@ public class WidgetService extends RemoteViewsService { @Override public void onCreate() { if (mType == WidgetDatabaseHelper.TYPE_ALBUM) { - Path path = Path.fromString(mAlbumPath); - DataManager manager = mApp.getDataManager(); - MediaSet mediaSet = (MediaSet) manager.getMediaObject(path); - mSource = mediaSet == null - ? new EmptySource() - : new MediaSetSource(mediaSet); + mSource = new MediaSetSource(mApp.getDataManager(), mAlbumPath); } else { mSource = new LocalPhotoSource(mApp.getAndroidContext()); } |