diff options
author | Ray Chen <raychen@google.com> | 2012-03-06 17:24:28 +0800 |
---|---|---|
committer | Ray Chen <raychen@google.com> | 2012-03-15 08:50:35 +0800 |
commit | f3f7f56af19f3f04a7daefd16981e5f55e39053d (patch) | |
tree | f932b44f1959b36ab2a5cdd62a5bb4453ac05512 /src/com/android | |
parent | 762f8e20f608bc805d9e9f01fa2c4925f4735cf0 (diff) | |
download | android_packages_apps_Snap-f3f7f56af19f3f04a7daefd16981e5f55e39053d.tar.gz android_packages_apps_Snap-f3f7f56af19f3f04a7daefd16981e5f55e39053d.tar.bz2 android_packages_apps_Snap-f3f7f56af19f3f04a7daefd16981e5f55e39053d.zip |
Fix 3462852 [UI] When linking from Camera preview - App icon with 'Up' arrow should go to next level up.
Some changes in this CL:
1. ActivityState can decide whether to enable home button and show up arrow
2. ActivityState can handle home_up event on its own
3. Support getContentUri in LocalAlbum (Image/Video Roll) and LocalMergeAlbum (Camera Roll)
4. Gallery supports view action for AlbumPage (Camera Roll)
Change-Id: I85a75cdce9cbc2a877651fdec34a0180ed8e785c
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/gallery3d/app/ActivityState.java | 7 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/AlbumPage.java | 21 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/Gallery.java | 5 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/GalleryActionBar.java | 11 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/PhotoPage.java | 32 | ||||
-rw-r--r-- | src/com/android/gallery3d/app/StateManager.java | 16 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalAlbum.java | 14 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalAlbumSet.java | 2 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalMergeAlbum.java | 13 | ||||
-rw-r--r-- | src/com/android/gallery3d/data/LocalSource.java | 8 |
10 files changed, 97 insertions, 32 deletions
diff --git a/src/com/android/gallery3d/app/ActivityState.java b/src/com/android/gallery3d/app/ActivityState.java index 8cff1326e..443e2bd29 100644 --- a/src/com/android/gallery3d/app/ActivityState.java +++ b/src/com/android/gallery3d/app/ActivityState.java @@ -141,12 +141,7 @@ abstract public class ActivityState { actionBar.show(); } int stateCount = mActivity.getStateManager().getStateCount(); - actionBar.setDisplayOptions( - stateCount == 1 ? 0 : ActionBar.DISPLAY_HOME_AS_UP, - ActionBar.DISPLAY_HOME_AS_UP); - actionBar.setHomeButtonEnabled( - (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != 0); - actionBar.setDisplayShowTitleEnabled(true); + mActivity.getGalleryActionBar().setDisplayOptions(stateCount > 1, true); // Default behavior, this can be overridden in ActivityState's onResume. actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); } diff --git a/src/com/android/gallery3d/app/AlbumPage.java b/src/com/android/gallery3d/app/AlbumPage.java index ead2a2005..411464e86 100644 --- a/src/com/android/gallery3d/app/AlbumPage.java +++ b/src/com/android/gallery3d/app/AlbumPage.java @@ -63,6 +63,7 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster private static final String TAG = "AlbumPage"; public static final String KEY_MEDIA_PATH = "media-path"; + public static final String KEY_PARENT_MEDIA_PATH = "parent-media-path"; public static final String KEY_SET_CENTER = "set-center"; public static final String KEY_AUTO_SELECT_ALL = "auto-select-all"; public static final String KEY_SHOW_CLUSTER_MENU = "cluster-menu"; @@ -79,6 +80,7 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster private boolean mIsActive = false; private AlbumView mAlbumView; private Path mMediaSetPath; + private String mParentMediaSetString; private AlbumDataAdapter mAlbumDataAdapter; @@ -314,6 +316,11 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster mIsActive = true; setContentPane(mRootPane); + Path path = mMediaSet.getPath(); + boolean enableHomeButton = (mActivity.getStateManager().getStateCount() > 1) | + mParentMediaSetString != null; + mActivity.getGalleryActionBar().setDisplayOptions(enableHomeButton, true); + // Set the reload bit here to prevent it exit this page in clearLoadingBit(). setLoadingBit(BIT_LOADING_RELOAD); mAlbumDataAdapter.resume(); @@ -391,6 +398,7 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster private void initializeData(Bundle data) { mMediaSetPath = Path.fromString(data.getString(KEY_MEDIA_PATH)); + mParentMediaSetString = data.getString(KEY_PARENT_MEDIA_PATH); mMediaSet = mActivity.getDataManager().getMediaSet(mMediaSetPath); if (mMediaSet == null) { Utils.fail("MediaSet is null. Path = %s", mMediaSetPath); @@ -462,6 +470,19 @@ public class AlbumPage extends ActivityState implements GalleryActionBar.Cluster @Override protected boolean onItemSelected(MenuItem item) { switch (item.getItemId()) { + case android.R.id.home: { + if (mActivity.getStateManager().getStateCount() > 1) { + onBackPressed(); + } else if (mParentMediaSetString != null) { + Activity a = (Activity) mActivity; + int flags = Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK; + Intent intent = new Intent() + .setClass(a, Gallery.class) + .setFlags(flags); + a.startActivity(intent); + } + return true; + } case R.id.action_cancel: mActivity.getStateManager().finishState(this); return true; diff --git a/src/com/android/gallery3d/app/Gallery.java b/src/com/android/gallery3d/app/Gallery.java index c45c603fb..624083494 100644 --- a/src/com/android/gallery3d/app/Gallery.java +++ b/src/com/android/gallery3d/app/Gallery.java @@ -118,7 +118,6 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi data.putInt(KEY_TYPE_BITS, typeBits); data.putString(AlbumSetPage.KEY_MEDIA_PATH, getDataManager().getTopSetPath(typeBits)); - getStateManager().setLaunchGalleryOnTop(true); getStateManager().startState(AlbumSetPage.class, data); } @@ -137,7 +136,6 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi private void startViewAction(Intent intent) { Boolean slideshow = intent.getBooleanExtra(EXTRA_SLIDESHOW, false); - getStateManager().setLaunchGalleryOnTop(true); if (slideshow) { getActionBar().hide(); DataManager manager = getDataManager(); @@ -168,7 +166,6 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi data.putInt(KEY_TYPE_BITS, typeBits); data.putString(AlbumSetPage.KEY_MEDIA_PATH, getDataManager().getTopSetPath(typeBits)); - getStateManager().setLaunchGalleryOnTop(true); getStateManager().startState(AlbumSetPage.class, data); } else if (contentType.startsWith( ContentResolver.CURSOR_DIR_BASE_TYPE)) { @@ -186,6 +183,8 @@ public final class Gallery extends AbstractGalleryActivity implements OnCancelLi if (mediaSet != null) { if (mediaSet.isLeafAlbum()) { data.putString(AlbumPage.KEY_MEDIA_PATH, setPath.toString()); + data.putString(AlbumPage.KEY_PARENT_MEDIA_PATH, + dm.getTopSetPath(DataManager.INCLUDE_ALL)); getStateManager().startState(AlbumPage.class, data); } else { data.putString(AlbumSetPage.KEY_MEDIA_PATH, setPath.toString()); diff --git a/src/com/android/gallery3d/app/GalleryActionBar.java b/src/com/android/gallery3d/app/GalleryActionBar.java index 93b6e8b1e..35cb8b4cb 100644 --- a/src/com/android/gallery3d/app/GalleryActionBar.java +++ b/src/com/android/gallery3d/app/GalleryActionBar.java @@ -210,6 +210,17 @@ public class GalleryActionBar implements ActionBar.OnNavigationListener { }).create().show(); } + public void setDisplayOptions(boolean displayHomeAsUp, boolean showTitle) { + if (mActionBar != null) { + int options = (displayHomeAsUp ? ActionBar.DISPLAY_HOME_AS_UP : 0) | + (showTitle ? ActionBar.DISPLAY_SHOW_TITLE : 0); + mActionBar.setDisplayOptions( + options, + ActionBar.DISPLAY_HOME_AS_UP | ActionBar.DISPLAY_SHOW_TITLE); + mActionBar.setHomeButtonEnabled(displayHomeAsUp); + } + } + public void setTitle(String title) { if (mActionBar != null) mActionBar.setTitle(title); } diff --git a/src/com/android/gallery3d/app/PhotoPage.java b/src/com/android/gallery3d/app/PhotoPage.java index 3aaa26336..8040a2fc6 100644 --- a/src/com/android/gallery3d/app/PhotoPage.java +++ b/src/com/android/gallery3d/app/PhotoPage.java @@ -20,6 +20,7 @@ import android.app.ActionBar; import android.app.ActionBar.OnMenuVisibilityListener; import android.app.Activity; import android.content.ActivityNotFoundException; +import android.content.ContentResolver; import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -104,6 +105,7 @@ public class PhotoPage extends ActivityState private MenuExecutor mMenuExecutor; private boolean mIsActive; private ShareActionProvider mShareActionProvider; + private String mSetPathString; public static interface Model extends PhotoView.Model { public void resume(); @@ -176,16 +178,16 @@ public class PhotoPage extends ActivityState mRootPane.addComponent(mPhotoView); mApplication = (GalleryApp)((Activity) mActivity).getApplication(); - String setPathString = data.getString(KEY_MEDIA_SET_PATH); + mSetPathString = data.getString(KEY_MEDIA_SET_PATH); Path itemPath = Path.fromString(data.getString(KEY_MEDIA_ITEM_PATH)); - if (setPathString != null) { - mMediaSet = mActivity.getDataManager().getMediaSet(setPathString); + if (mSetPathString != null) { + mMediaSet = mActivity.getDataManager().getMediaSet(mSetPathString); mCurrentIndex = data.getInt(KEY_INDEX_HINT, 0); mMediaSet = (MediaSet) - mActivity.getDataManager().getMediaObject(setPathString); + mActivity.getDataManager().getMediaObject(mSetPathString); if (mMediaSet == null) { - Log.w(TAG, "failed to restore " + setPathString); + Log.w(TAG, "failed to restore " + mSetPathString); } PhotoDataAdapter pda = new PhotoDataAdapter( mActivity, mPhotoView, mMediaSet, itemPath, mCurrentIndex); @@ -438,6 +440,24 @@ public class PhotoPage extends ActivityState DataManager manager = mActivity.getDataManager(); int action = item.getItemId(); switch (action) { + case android.R.id.home: { + if (mSetPathString != null) { + if (mActivity.getStateManager().getStateCount() > 1) { + onBackPressed(); + } else { + Activity a = (Activity) mActivity; + Uri uri = mActivity.getDataManager().getContentUri( + Path.fromString(mSetPathString)); + Intent intent = new Intent(Intent.ACTION_VIEW) + .setClass(a, Gallery.class) + .setDataAndType(uri, ContentResolver.CURSOR_DIR_BASE_TYPE) + .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | + Intent.FLAG_ACTIVITY_NEW_TASK); + a.startActivity(intent); + } + } + return true; + } case R.id.action_slideshow: { Bundle data = new Bundle(); data.putString(SlideshowPage.KEY_SET_PATH, mMediaSet.getPath().toString()); @@ -610,6 +630,8 @@ public class PhotoPage extends ActivityState if (mMenuVisibilityListener == null) { mMenuVisibilityListener = new MyMenuVisibilityListener(); } + mActivity.getGalleryActionBar().setDisplayOptions(mSetPathString != null, true); + mActionBar.addOnMenuVisibilityListener(mMenuVisibilityListener); onUserInteraction(); } diff --git a/src/com/android/gallery3d/app/StateManager.java b/src/com/android/gallery3d/app/StateManager.java index b91eac644..5866be948 100644 --- a/src/com/android/gallery3d/app/StateManager.java +++ b/src/com/android/gallery3d/app/StateManager.java @@ -37,12 +37,10 @@ public class StateManager { private static final String KEY_DATA = "data"; private static final String KEY_STATE = "bundle"; private static final String KEY_CLASS = "class"; - private static final String KEY_LAUNCH_GALLERY_ON_TOP = "launch-gallery-on-top"; private GalleryActivity mContext; private Stack<StateEntry> mStack = new Stack<StateEntry>(); private ActivityState.ResultEntry mResult; - private boolean mLaunchGalleryOnTop = false; public StateManager(GalleryActivity context) { mContext = context; @@ -68,10 +66,6 @@ public class StateManager { if (mIsResumed) state.resume(); } - public void setLaunchGalleryOnTop(boolean enabled) { - mLaunchGalleryOnTop = enabled; - } - public void startStateForResult(Class<? extends ActivityState> klass, int requestCode, Bundle data) { Log.v(TAG, "startStateForResult " + klass + ", " + requestCode); @@ -135,18 +129,12 @@ public class StateManager { public boolean itemSelected(MenuItem item) { if (!mStack.isEmpty()) { + if (getTopState().onItemSelected(item)) return true; if (item.getItemId() == android.R.id.home) { if (mStack.size() > 1) { getTopState().onBackPressed(); - } else if (mLaunchGalleryOnTop) { - Activity activity = (Activity) mContext; - Intent intent = new Intent(activity, Gallery.class) - .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - ((Activity) mContext).startActivity(intent); } return true; - } else { - return getTopState().onItemSelected(item); } } return false; @@ -235,7 +223,6 @@ public class StateManager { @SuppressWarnings("unchecked") public void restoreFromState(Bundle inState) { Log.v(TAG, "restoreFromState"); - mLaunchGalleryOnTop = inState.getBoolean(KEY_LAUNCH_GALLERY_ON_TOP, false); Parcelable list[] = inState.getParcelableArray(KEY_MAIN); for (Parcelable parcelable : list) { Bundle bundle = (Bundle) parcelable; @@ -261,7 +248,6 @@ public class StateManager { public void saveState(Bundle outState) { Log.v(TAG, "saveState"); - outState.putBoolean(KEY_LAUNCH_GALLERY_ON_TOP, mLaunchGalleryOnTop); Parcelable list[] = new Parcelable[mStack.size()]; int i = 0; for (StateEntry entry : mStack) { diff --git a/src/com/android/gallery3d/data/LocalAlbum.java b/src/com/android/gallery3d/data/LocalAlbum.java index 1030c84e0..117dbb6fa 100644 --- a/src/com/android/gallery3d/data/LocalAlbum.java +++ b/src/com/android/gallery3d/data/LocalAlbum.java @@ -20,6 +20,7 @@ import android.content.ContentResolver; import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; +import android.provider.MediaStore; import android.provider.MediaStore.Images; import android.provider.MediaStore.Images.ImageColumns; import android.provider.MediaStore.Video; @@ -90,6 +91,19 @@ public class LocalAlbum extends MediaSet { } @Override + public Uri getContentUri() { + if (mIsImage) { + return MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon() + .appendQueryParameter(LocalSource.KEY_BUCKET_ID, + String.valueOf(mBucketId)).build(); + } else { + return MediaStore.Video.Media.EXTERNAL_CONTENT_URI.buildUpon() + .appendQueryParameter(LocalSource.KEY_BUCKET_ID, + String.valueOf(mBucketId)).build(); + } + } + + @Override public ArrayList<MediaItem> getMediaItem(int start, int count) { DataManager dataManager = mApplication.getDataManager(); Uri uri = mBaseUri.buildUpon() diff --git a/src/com/android/gallery3d/data/LocalAlbumSet.java b/src/com/android/gallery3d/data/LocalAlbumSet.java index a81391c4e..35d87d765 100644 --- a/src/com/android/gallery3d/data/LocalAlbumSet.java +++ b/src/com/android/gallery3d/data/LocalAlbumSet.java @@ -217,7 +217,7 @@ public class LocalAlbumSet extends MediaSet { Comparator<MediaItem> comp = DataManager.sDateTakenComparator; return new LocalMergeAlbum(path, comp, new MediaSet[] { getLocalAlbum(manager, MEDIA_TYPE_IMAGE, PATH_IMAGE, id, name), - getLocalAlbum(manager, MEDIA_TYPE_VIDEO, PATH_VIDEO, id, name)}); + getLocalAlbum(manager, MEDIA_TYPE_VIDEO, PATH_VIDEO, id, name)}, id); } throw new IllegalArgumentException(String.valueOf(type)); } diff --git a/src/com/android/gallery3d/data/LocalMergeAlbum.java b/src/com/android/gallery3d/data/LocalMergeAlbum.java index bb796d53a..1e34e7817 100644 --- a/src/com/android/gallery3d/data/LocalMergeAlbum.java +++ b/src/com/android/gallery3d/data/LocalMergeAlbum.java @@ -16,6 +16,9 @@ package com.android.gallery3d.data; +import android.net.Uri; +import android.provider.MediaStore; + import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.Comparator; @@ -38,16 +41,18 @@ public class LocalMergeAlbum extends MediaSet implements ContentListener { private String mName; private FetchCache[] mFetcher; private int mSupportedOperation; + private int mBucketId; // mIndex maps global position to the position of each underlying media sets. private TreeMap<Integer, int[]> mIndex = new TreeMap<Integer, int[]>(); public LocalMergeAlbum( - Path path, Comparator<MediaItem> comparator, MediaSet[] sources) { + Path path, Comparator<MediaItem> comparator, MediaSet[] sources, int bucketId) { super(path, INVALID_DATA_VERSION); mComparator = comparator; mSources = sources; mName = sources.length == 0 ? "" : sources[0].getName(); + mBucketId = bucketId; for (MediaSet set : mSources) { set.addContentListener(this); } @@ -76,6 +81,12 @@ public class LocalMergeAlbum extends MediaSet implements ContentListener { } @Override + public Uri getContentUri() { + return MediaStore.Files.getContentUri("external").buildUpon().appendQueryParameter( + LocalSource.KEY_BUCKET_ID, String.valueOf(mBucketId)).build(); + } + + @Override public String getName() { return mName; } diff --git a/src/com/android/gallery3d/data/LocalSource.java b/src/com/android/gallery3d/data/LocalSource.java index 9bb561b14..19b2fec4f 100644 --- a/src/com/android/gallery3d/data/LocalSource.java +++ b/src/com/android/gallery3d/data/LocalSource.java @@ -75,6 +75,8 @@ class LocalSource extends MediaSource { "external/images/media", LOCAL_IMAGE_ALBUM); mUriMatcher.addURI(MediaStore.AUTHORITY, "external/video/media", LOCAL_VIDEO_ALBUM); + mUriMatcher.addURI(MediaStore.AUTHORITY, + "external/file", LOCAL_ALL_ALBUM); } @Override @@ -98,7 +100,7 @@ class LocalSource extends MediaSource { LocalAlbumSet.PATH_VIDEO.getChild(bucketId)); Comparator<MediaItem> comp = DataManager.sDateTakenComparator; return new LocalMergeAlbum( - path, comp, new MediaSet[] {imageSet, videoSet}); + path, comp, new MediaSet[] {imageSet, videoSet}, bucketId); } case LOCAL_IMAGE_ITEM: return new LocalImage(path, mApplication, mMatcher.getIntVar(0)); @@ -122,6 +124,7 @@ class LocalSource extends MediaSource { } // The media type bit passed by the intent + private static final int MEDIA_TYPE_ALL = 0; private static final int MEDIA_TYPE_IMAGE = 1; private static final int MEDIA_TYPE_VIDEO = 4; @@ -165,6 +168,9 @@ class LocalSource extends MediaSource { case LOCAL_VIDEO_ALBUM: { return getAlbumPath(uri, MEDIA_TYPE_VIDEO); } + case LOCAL_ALL_ALBUM: { + return getAlbumPath(uri, MEDIA_TYPE_ALL); + } } } catch (NumberFormatException e) { Log.w(TAG, "uri: " + uri.toString(), e); |