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;
25 import android.provider.MediaStore.Files.FileColumns;
26 import android.util.SparseArray;
28 import com.android.gallery3d.data.ContentListener;
29 import com.android.gallery3d.data.DataManager;
30 import com.android.gallery3d.data.MediaItem;
31 import com.android.gallery3d.data.MediaSet;
32 import com.android.gallery3d.data.MediaSet.ItemConsumer;
33 import com.android.gallery3d.data.MediaSet.SyncListener;
34 import com.android.gallery3d.util.Future;
35 import com.android.photos.data.PhotoSetLoader;
38 * Returns all MediaItems in a MediaSet, wrapping them in a cursor to appear
39 * like a PhotoSetLoader
41 public class MediaItemsLoader extends AsyncTaskLoader<Cursor> implements LoaderCompatShim<Cursor> {
43 private static final SyncListener sNullListener = new SyncListener() {
45 public void onSyncDone(MediaSet mediaSet, int resultCode) {
49 private final MediaSet mMediaSet;
50 private Future<Integer> mSyncTask = null;
51 private ContentListener mObserver = new ContentListener() {
53 public void onContentDirty() {
57 private SparseArray<MediaItem> mMediaItems;
59 public MediaItemsLoader(Context context) {
61 DataManager dm = DataManager.from(context);
62 String path = dm.getTopSetPath(DataManager.INCLUDE_ALL);
63 mMediaSet = dm.getMediaSet(path);
66 public MediaItemsLoader(Context context, String parentPath) {
68 mMediaSet = DataManager.from(getContext()).getMediaSet(parentPath);
72 protected void onStartLoading() {
73 super.onStartLoading();
74 mMediaSet.addContentListener(mObserver);
75 mSyncTask = mMediaSet.requestSync(sNullListener);
80 protected boolean onCancelLoad() {
81 if (mSyncTask != null) {
85 return super.onCancelLoad();
89 protected void onStopLoading() {
90 super.onStopLoading();
92 mMediaSet.removeContentListener(mObserver);
96 protected void onReset() {
102 public Cursor loadInBackground() {
103 mMediaSet.loadIfDirty();
104 final MatrixCursor cursor = new MatrixCursor(PhotoSetLoader.PROJECTION);
105 final Object[] row = new Object[PhotoSetLoader.PROJECTION.length];
106 final SparseArray<MediaItem> mediaItems = new SparseArray<MediaItem>();
107 mMediaSet.enumerateTotalMediaItems(new ItemConsumer() {
109 public void consume(int index, MediaItem item) {
110 row[PhotoSetLoader.INDEX_ID] = index;
111 row[PhotoSetLoader.INDEX_DATA] = item.getContentUri().toString();
112 row[PhotoSetLoader.INDEX_DATE_ADDED] = item.getDateInMs();
113 row[PhotoSetLoader.INDEX_HEIGHT] = item.getHeight();
114 row[PhotoSetLoader.INDEX_WIDTH] = item.getWidth();
115 row[PhotoSetLoader.INDEX_WIDTH] = item.getWidth();
116 int rawMediaType = item.getMediaType();
117 int mappedMediaType = FileColumns.MEDIA_TYPE_NONE;
118 if (rawMediaType == MediaItem.MEDIA_TYPE_IMAGE) {
119 mappedMediaType = FileColumns.MEDIA_TYPE_IMAGE;
120 } else if (rawMediaType == MediaItem.MEDIA_TYPE_VIDEO) {
121 mappedMediaType = FileColumns.MEDIA_TYPE_VIDEO;
123 row[PhotoSetLoader.INDEX_MEDIA_TYPE] = mappedMediaType;
125 mediaItems.append(index, item);
128 synchronized (mMediaSet) {
129 mMediaItems = mediaItems;
135 public Drawable drawableForItem(Cursor item, Drawable recycle) {
136 BitmapJobDrawable drawable = null;
137 if (recycle == null || !(recycle instanceof BitmapJobDrawable)) {
138 drawable = new BitmapJobDrawable();
140 drawable = (BitmapJobDrawable) recycle;
142 int index = item.getInt(PhotoSetLoader.INDEX_ID);
143 drawable.setMediaItem(mMediaItems.get(index));
147 public static int getThumbnailSize() {
148 return MediaItem.getTargetSize(MediaItem.TYPE_MICROTHUMBNAIL);
152 public Uri uriForItem(Cursor item) {
153 int index = item.getInt(PhotoSetLoader.INDEX_ID);
154 MediaItem mi = mMediaItems.get(index);
155 return mi == null ? null : mi.getContentUri();