2 * Copyright (C) 2013 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 package com.android.photos.shims;
19 import android.content.AsyncTaskLoader;
20 import android.content.Context;
21 import android.database.Cursor;
22 import android.database.MatrixCursor;
23 import android.graphics.drawable.Drawable;
24 import android.net.Uri;
26 import com.android.gallery3d.data.ContentListener;
27 import com.android.gallery3d.data.DataManager;
28 import com.android.gallery3d.data.MediaItem;
29 import com.android.gallery3d.data.MediaObject;
30 import com.android.gallery3d.data.MediaSet;
31 import com.android.gallery3d.data.Path;
32 import com.android.gallery3d.data.MediaSet.SyncListener;
33 import com.android.gallery3d.util.Future;
34 import com.android.photos.data.AlbumSetLoader;
36 import java.util.ArrayList;
39 * Returns all MediaSets in a MediaSet, wrapping them in a cursor to appear
40 * like a AlbumSetLoader.
42 public class MediaSetLoader extends AsyncTaskLoader<Cursor> implements LoaderCompatShim<Cursor>{
44 private static final SyncListener sNullListener = new SyncListener() {
46 public void onSyncDone(MediaSet mediaSet, int resultCode) {
50 private final MediaSet mMediaSet;
51 private final DataManager mDataManager;
52 private Future<Integer> mSyncTask = null;
53 private ContentListener mObserver = new ContentListener() {
55 public void onContentDirty() {
60 private ArrayList<MediaItem> mCoverItems;
62 public MediaSetLoader(Context context) {
64 mDataManager = DataManager.from(context);
65 String path = mDataManager.getTopSetPath(DataManager.INCLUDE_ALL);
66 mMediaSet = mDataManager.getMediaSet(path);
69 public MediaSetLoader(Context context, String path) {
71 mDataManager = DataManager.from(getContext());
72 mMediaSet = mDataManager.getMediaSet(path);
76 protected void onStartLoading() {
77 super.onStartLoading();
78 mMediaSet.addContentListener(mObserver);
79 mSyncTask = mMediaSet.requestSync(sNullListener);
84 protected boolean onCancelLoad() {
85 if (mSyncTask != null) {
89 return super.onCancelLoad();
93 protected void onStopLoading() {
94 super.onStopLoading();
96 mMediaSet.removeContentListener(mObserver);
100 protected void onReset() {
106 public Cursor loadInBackground() {
107 mMediaSet.loadIfDirty();
108 final MatrixCursor cursor = new MatrixCursor(AlbumSetLoader.PROJECTION);
109 final Object[] row = new Object[AlbumSetLoader.PROJECTION.length];
110 int count = mMediaSet.getSubMediaSetCount();
111 ArrayList<MediaItem> coverItems = new ArrayList<MediaItem>(count);
112 for (int i = 0; i < count; i++) {
113 MediaSet m = mMediaSet.getSubMediaSet(i);
115 row[AlbumSetLoader.INDEX_ID] = i;
116 row[AlbumSetLoader.INDEX_TITLE] = m.getName();
117 row[AlbumSetLoader.INDEX_COUNT] = m.getMediaItemCount();
118 row[AlbumSetLoader.INDEX_SUPPORTED_OPERATIONS] = m.getSupportedOperations();
119 MediaItem coverItem = m.getCoverMediaItem();
120 if (coverItem != null) {
121 row[AlbumSetLoader.INDEX_TIMESTAMP] = coverItem.getDateInMs();
123 coverItems.add(coverItem);
126 synchronized (mMediaSet) {
127 mCoverItems = coverItems;
133 public Drawable drawableForItem(Cursor item, Drawable recycle) {
134 BitmapJobDrawable drawable = null;
135 if (recycle == null || !(recycle instanceof BitmapJobDrawable)) {
136 drawable = new BitmapJobDrawable();
138 drawable = (BitmapJobDrawable) recycle;
140 int index = item.getInt(AlbumSetLoader.INDEX_ID);
141 drawable.setMediaItem(mCoverItems.get(index));
145 public static int getThumbnailSize() {
146 return MediaItem.getTargetSize(MediaItem.TYPE_MICROTHUMBNAIL);
150 public Uri uriForItem(Cursor item) {
151 int index = item.getInt(AlbumSetLoader.INDEX_ID);
152 MediaSet ms = mMediaSet.getSubMediaSet(index);
153 return ms == null ? null : ms.getContentUri();
157 public ArrayList<Uri> urisForSubItems(Cursor item) {
158 int index = item.getInt(AlbumSetLoader.INDEX_ID);
159 MediaSet ms = mMediaSet.getSubMediaSet(index);
160 if (ms == null) return null;
161 final ArrayList<Uri> result = new ArrayList<Uri>();
162 ms.enumerateMediaItems(new MediaSet.ItemConsumer() {
164 public void consume(int index, MediaItem item) {
166 result.add(item.getContentUri());
174 public void deleteItemWithPath(Object path) {
175 MediaObject o = mDataManager.getMediaObject((Path) path);
182 public Object getPathForItem(Cursor item) {
183 int index = item.getInt(AlbumSetLoader.INDEX_ID);
184 MediaSet ms = mMediaSet.getSubMediaSet(index);