</intent-filter>
</activity>
- <activity android:name="com.android.photos.GalleryActivity"
+ <activity
+ android:name="com.android.photos.GalleryActivity"
android:label="@string/app_name"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="@style/Theme.Photos.Gallery"
<data android:mimeType="image/*" />
<data android:mimeType="video/*" />
</intent-filter>
+ <!-- We do NOT support the PICK intent, we add these intent-filter for
+ backward compatibility. Handle it as GET_CONTENT. -->
+ <intent-filter>
+ <action android:name="android.intent.action.PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="image/*" />
+ <data android:mimeType="video/*" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name="android.intent.action.PICK" />
+ <category android:name="android.intent.category.DEFAULT" />
+ <data android:mimeType="vnd.android.cursor.dir/image" />
+ <data android:mimeType="vnd.android.cursor.dir/video" />
+ </intent-filter>
+ </activity>
+ <activity
+ android:name="com.android.gallery3d.app.Gallery"
+ android:label="@string/app_name"
+ android:configChanges="keyboardHidden|orientation|screenSize">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="video/3gpp2" />
<data android:mimeType="application/sdp" />
</intent-filter>
- <!-- We do NOT support the PICK intent, we add these intent-filter for
- backward compatibility. Handle it as GET_CONTENT. -->
- <intent-filter>
- <action android:name="android.intent.action.PICK" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="image/*" />
- <data android:mimeType="video/*" />
- </intent-filter>
- <intent-filter>
- <action android:name="android.intent.action.PICK" />
- <category android:name="android.intent.category.DEFAULT" />
- <data android:mimeType="vnd.android.cursor.dir/image" />
- <data android:mimeType="vnd.android.cursor.dir/video" />
- </intent-filter>
</activity>
<activity android:name="com.android.photos.FullscreenViewer"
import com.android.gallery3d.R;
import com.android.photos.data.AlbumSetLoader;
-import com.android.photos.drawables.DrawableFactory;
+import com.android.photos.shims.LoaderCompatShim;
import com.android.photos.shims.MediaSetLoader;
import java.util.Date;
private static class AlbumSetCursorAdapter extends CursorAdapter {
- private DrawableFactory<Cursor> mDrawableFactory;
+ private LoaderCompatShim<Cursor> mDrawableFactory;
- public void setDrawableFactory(DrawableFactory<Cursor> factory) {
+ public void setDrawableFactory(LoaderCompatShim<Cursor> factory) {
mDrawableFactory = factory;
}
private Date mDate = new Date(); // Used for converting timestamps for display
import android.app.Fragment;
import android.app.LoaderManager.LoaderCallbacks;
import android.content.Context;
+import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
+import android.widget.AdapterView;
+import android.widget.AdapterView.OnItemClickListener;
import android.widget.CursorAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import com.android.gallery3d.R;
+import com.android.gallery3d.app.Gallery;
import com.android.photos.data.PhotoSetLoader;
-import com.android.photos.drawables.DrawableFactory;
+import com.android.photos.shims.LoaderCompatShim;
import com.android.photos.shims.MediaItemsLoader;
import com.android.photos.views.GalleryThumbnailView.GalleryThumbnailAdapter;
-public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor> {
+public class PhotoSetFragment extends Fragment implements LoaderCallbacks<Cursor>,
+ OnItemClickListener {
private static final int LOADER_PHOTOSET = 1;
private GridView mPhotoSetView;
private View mEmptyView;
private ThumbnailAdapter mAdapter;
+ private boolean mInitialLoadComplete = false;
+ private LoaderCompatShim<Cursor> mLoaderCompatShim;
@Override
public void onCreate(Bundle savedInstanceState) {
mPhotoSetView = (GridView) root.findViewById(android.R.id.list);
// TODO: Remove once UI stabilizes
mPhotoSetView.setColumnWidth(MediaItemsLoader.getThumbnailSize());
+ mPhotoSetView.setOnItemClickListener(this);
mEmptyView = root.findViewById(android.R.id.empty);
mEmptyView.setVisibility(View.GONE);
mPhotoSetView.setAdapter(mAdapter);
private void updateEmptyStatus() {
boolean empty = (mAdapter == null || mAdapter.getCount() == 0);
mPhotoSetView.setVisibility(empty ? View.GONE : View.VISIBLE);
- mEmptyView.setVisibility(empty ? View.VISIBLE : View.GONE);
+ mEmptyView.setVisibility(empty && mInitialLoadComplete
+ ? View.VISIBLE : View.GONE);
+ }
+
+ @Override
+ public void onItemClick(AdapterView<?> parent, View view, int position,
+ long id) {
+ if (mLoaderCompatShim == null) {
+ // Not fully initialized yet, discard
+ return;
+ }
+ Cursor item = mAdapter.getItem(position);
+ Uri uri = mLoaderCompatShim.uriForItem(item);
+ Intent intent = new Intent(Intent.ACTION_VIEW, uri);
+ intent.setClass(getActivity(), Gallery.class);
+ startActivity(intent);
}
@Override
// TODO: Switch to PhotoSetLoader
MediaItemsLoader loader = new MediaItemsLoader(getActivity());
mAdapter.setDrawableFactory(loader);
+ mInitialLoadComplete = false;
+ mLoaderCompatShim = loader;
return loader;
}
public void onLoadFinished(Loader<Cursor> loader,
Cursor data) {
mAdapter.swapCursor(data);
+ mInitialLoadComplete = true;
updateEmptyStatus();
}
private static class ThumbnailAdapter extends CursorAdapter implements GalleryThumbnailAdapter {
private LayoutInflater mInflater;
- private DrawableFactory<Cursor> mDrawableFactory;
+ private LoaderCompatShim<Cursor> mDrawableFactory;
public ThumbnailAdapter(Context context) {
super(context, null, false);
mInflater = LayoutInflater.from(context);
}
- public void setDrawableFactory(DrawableFactory<Cursor> factory) {
+ public void setDrawableFactory(LoaderCompatShim<Cursor> factory) {
mDrawableFactory = factory;
}
import android.provider.MediaStore.Files.FileColumns;
import com.android.photos.drawables.DataUriThumbnailDrawable;
-import com.android.photos.drawables.DrawableFactory;
+import com.android.photos.shims.LoaderCompatShim;
-public class PhotoSetLoader extends CursorLoader implements DrawableFactory<Cursor> {
+public class PhotoSetLoader extends CursorLoader implements LoaderCompatShim<Cursor> {
private static final Uri CONTENT_URI = Files.getContentUri("external");
public static final String[] PROJECTION = new String[] {
item.getInt(INDEX_WIDTH), item.getInt(INDEX_HEIGHT));
return drawable;
}
+
+ @Override
+ public Uri uriForItem(Cursor item) {
+ return null;
+ }
}
* limitations under the License.
*/
-package com.android.photos.drawables;
+package com.android.photos.shims;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
-public interface DrawableFactory<T> {
+public interface LoaderCompatShim<T> {
Drawable drawableForItem(T item, Drawable recycle);
+ Uri uriForItem(T item);
}
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import android.provider.MediaStore.Files.FileColumns;
import android.util.SparseArray;
import com.android.gallery3d.data.MediaSet.SyncListener;
import com.android.gallery3d.util.Future;
import com.android.photos.data.PhotoSetLoader;
-import com.android.photos.drawables.DrawableFactory;
/**
* Returns all MediaItems in a MediaSet, wrapping them in a cursor to appear
* like a PhotoSetLoader
*/
-public class MediaItemsLoader extends AsyncTaskLoader<Cursor> implements DrawableFactory<Cursor> {
+public class MediaItemsLoader extends AsyncTaskLoader<Cursor> implements LoaderCompatShim<Cursor> {
private static final SyncListener sNullListener = new SyncListener() {
@Override
return MediaItem.getTargetSize(MediaItem.TYPE_MICROTHUMBNAIL);
}
+ @Override
+ public Uri uriForItem(Cursor item) {
+ int index = item.getInt(PhotoSetLoader.INDEX_ID);
+ MediaItem mi = mMediaItems.get(index);
+ return mi == null ? null : mi.getContentUri();
+ }
+
}
import android.database.Cursor;
import android.database.MatrixCursor;
import android.graphics.drawable.Drawable;
+import android.net.Uri;
import com.android.gallery3d.data.ContentListener;
import com.android.gallery3d.data.DataManager;
import com.android.gallery3d.data.MediaSet.SyncListener;
import com.android.gallery3d.util.Future;
import com.android.photos.data.AlbumSetLoader;
-import com.android.photos.drawables.DrawableFactory;
import java.util.ArrayList;
* Returns all MediaSets in a MediaSet, wrapping them in a cursor to appear
* like a AlbumSetLoader.
*/
-public class MediaSetLoader extends AsyncTaskLoader<Cursor> implements DrawableFactory<Cursor>{
+public class MediaSetLoader extends AsyncTaskLoader<Cursor> implements LoaderCompatShim<Cursor>{
private static final SyncListener sNullListener = new SyncListener() {
@Override
public static int getThumbnailSize() {
return MediaItem.getTargetSize(MediaItem.TYPE_MICROTHUMBNAIL);
}
+
+ @Override
+ public Uri uriForItem(Cursor item) {
+ int index = item.getInt(AlbumSetLoader.INDEX_ID);
+ MediaSet ms = mMediaSet.getSubMediaSet(index);
+ return ms == null ? null : ms.getContentUri();
+ }
}