diff options
Diffstat (limited to 'src/com/android/gallery3d/data/LocalAlbumSet.java')
-rw-r--r-- | src/com/android/gallery3d/data/LocalAlbumSet.java | 113 |
1 files changed, 34 insertions, 79 deletions
diff --git a/src/com/android/gallery3d/data/LocalAlbumSet.java b/src/com/android/gallery3d/data/LocalAlbumSet.java index b2b4b8c5d..d71c9f700 100644 --- a/src/com/android/gallery3d/data/LocalAlbumSet.java +++ b/src/com/android/gallery3d/data/LocalAlbumSet.java @@ -17,26 +17,20 @@ package com.android.gallery3d.data; import android.net.Uri; -import android.os.Handler; import android.provider.MediaStore.Images; import android.provider.MediaStore.Video; import com.android.gallery3d.R; import com.android.gallery3d.app.GalleryApp; import com.android.gallery3d.data.BucketHelper.BucketEntry; -import com.android.gallery3d.util.Future; -import com.android.gallery3d.util.FutureListener; import com.android.gallery3d.util.MediaSetUtils; -import com.android.gallery3d.util.ThreadPool; -import com.android.gallery3d.util.ThreadPool.JobContext; import java.util.ArrayList; import java.util.Comparator; // LocalAlbumSet lists all image or video albums in the local storage. // The path should be "/local/image", "local/video" or "/local/all" -public class LocalAlbumSet extends MediaSet - implements FutureListener<ArrayList<MediaSet>> { +public class LocalAlbumSet extends MediaSet { @SuppressWarnings("unused") private static final String TAG = "LocalAlbumSet"; @@ -52,16 +46,10 @@ public class LocalAlbumSet extends MediaSet private ArrayList<MediaSet> mAlbums = new ArrayList<MediaSet>(); private final ChangeNotifier mNotifier; private final String mName; - private final Handler mHandler; - private boolean mIsLoading; - - private Future<ArrayList<MediaSet>> mLoadTask; - private ArrayList<MediaSet> mLoadBuffer; public LocalAlbumSet(Path path, GalleryApp application) { super(path, nextVersionNumber()); mApplication = application; - mHandler = new Handler(application.getMainLooper()); mType = getTypeFromPath(path); mNotifier = new ChangeNotifier(this, mWatchUris, application); mName = application.getResources().getString( @@ -98,41 +86,6 @@ public class LocalAlbumSet extends MediaSet return -1; } - private class AlbumsLoader implements ThreadPool.Job<ArrayList<MediaSet>> { - - @Override - @SuppressWarnings("unchecked") - public ArrayList<MediaSet> run(JobContext jc) { - // Note: it will be faster if we only select media_type and bucket_id. - // need to test the performance if that is worth - BucketEntry[] entries = BucketHelper.loadBucketEntries( - jc, mApplication.getContentResolver(), mType); - - if (jc.isCancelled()) return null; - - int offset = 0; - // Move camera and download bucket to the front, while keeping the - // order of others. - int index = findBucket(entries, MediaSetUtils.CAMERA_BUCKET_ID); - if (index != -1) { - circularShiftRight(entries, offset++, index); - } - index = findBucket(entries, MediaSetUtils.DOWNLOAD_BUCKET_ID); - if (index != -1) { - circularShiftRight(entries, offset++, index); - } - - ArrayList<MediaSet> albums = new ArrayList<MediaSet>(); - DataManager dataManager = mApplication.getDataManager(); - for (BucketEntry entry : entries) { - MediaSet album = getLocalAlbum(dataManager, - mType, mPath, entry.bucketId, entry.bucketName); - albums.add(album); - } - return albums; - } - } - private MediaSet getLocalAlbum( DataManager manager, int type, Path parent, int id, String name) { synchronized (DataManager.LOCK) { @@ -155,43 +108,45 @@ public class LocalAlbumSet extends MediaSet } @Override - public synchronized boolean isLoading() { - return mIsLoading; + protected boolean isDirtyLocked() { + return mNotifier.isDirty(); } @Override - // synchronized on this function for - // 1. Prevent calling reload() concurrently. - // 2. Prevent calling onFutureDone() and reload() concurrently - public synchronized long reload() { - if (mNotifier.isDirty()) { - if (mLoadTask != null) mLoadTask.cancel(); - mIsLoading = true; - mLoadTask = mApplication.getThreadPool().submit(new AlbumsLoader(), this); + protected void load() throws InterruptedException { + // Note: it will be faster if we only select media_type and bucket_id. + // need to test the performance if that is worth + BucketEntry[] entries = BucketHelper.loadBucketEntries( + createJobContextCompat(), mApplication.getContentResolver(), mType); + + // BucketHelper.loadBucketEntries returns null if it was canceled + if (entries == null || Thread.interrupted()) { + throw new InterruptedException(); } - if (mLoadBuffer != null) { - mAlbums = mLoadBuffer; - mLoadBuffer = null; - for (MediaSet album : mAlbums) { - album.reload(); - } - mDataVersion = nextVersionNumber(); + + int offset = 0; + // Move camera and download bucket to the front, while keeping the + // order of others. + int index = findBucket(entries, MediaSetUtils.CAMERA_BUCKET_ID); + if (index != -1) { + circularShiftRight(entries, offset++, index); + } + index = findBucket(entries, MediaSetUtils.DOWNLOAD_BUCKET_ID); + if (index != -1) { + circularShiftRight(entries, offset++, index); } - return mDataVersion; - } - @Override - public synchronized void onFutureDone(Future<ArrayList<MediaSet>> future) { - if (mLoadTask != future) return; // ignore, wait for the latest task - mLoadBuffer = future.get(); - mIsLoading = false; - if (mLoadBuffer == null) mLoadBuffer = new ArrayList<MediaSet>(); - mHandler.post(new Runnable() { - @Override - public void run() { - notifyContentChanged(); - } - }); + mAlbums.clear(); + DataManager dataManager = mApplication.getDataManager(); + for (BucketEntry entry : entries) { + MediaSet album = getLocalAlbum(dataManager, + mType, mPath, entry.bucketId, entry.bucketName); + mAlbums.add(album); + } + + for (MediaSet album : mAlbums) { + album.loadIfDirty(); + } } // For debug only. Fake there is a ContentObserver.onChange() event. |