diff options
author | George Mount <mount@google.com> | 2012-10-18 14:20:39 -0700 |
---|---|---|
committer | George Mount <mount@google.com> | 2012-10-18 16:32:48 -0700 |
commit | 16b3bfbbd2a6447684ac406554f862b29c873751 (patch) | |
tree | f2363be751273002eb7716404c601d230ce2cc18 /src/com/android/gallery3d/ui/ActionModeHandler.java | |
parent | 79b74e0fd52cd2ba92130c5131474d52170d6f7e (diff) | |
download | android_packages_apps_Snap-16b3bfbbd2a6447684ac406554f862b29c873751.tar.gz android_packages_apps_Snap-16b3bfbbd2a6447684ac406554f862b29c873751.tar.bz2 android_packages_apps_Snap-16b3bfbbd2a6447684ac406554f862b29c873751.zip |
Remove panorama checks from supported operations.
Bug 7351383
Bug 7349438
Move panorama support checks from getSupportedOperations so
that calls to getSupportedOperations are consistent. Panorama
checks are moved to only based on callbacks.
Change-Id: Id9ff138204df84c6fb0a4c971dcea59f1220aee2
Diffstat (limited to 'src/com/android/gallery3d/ui/ActionModeHandler.java')
-rw-r--r-- | src/com/android/gallery3d/ui/ActionModeHandler.java | 104 |
1 files changed, 86 insertions, 18 deletions
diff --git a/src/com/android/gallery3d/ui/ActionModeHandler.java b/src/com/android/gallery3d/ui/ActionModeHandler.java index 3384b88e3..bb195c91e 100644 --- a/src/com/android/gallery3d/ui/ActionModeHandler.java +++ b/src/com/android/gallery3d/ui/ActionModeHandler.java @@ -38,6 +38,7 @@ import com.android.gallery3d.common.ApiHelper; import com.android.gallery3d.common.Utils; import com.android.gallery3d.data.DataManager; import com.android.gallery3d.data.MediaObject; +import com.android.gallery3d.data.MediaObject.PanoramaSupportCallback; import com.android.gallery3d.data.Path; import com.android.gallery3d.ui.MenuExecutor.ProgressListener; import com.android.gallery3d.util.Future; @@ -54,8 +55,7 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi private static final int SUPPORT_MULTIPLE_MASK = MediaObject.SUPPORT_DELETE | MediaObject.SUPPORT_ROTATE | MediaObject.SUPPORT_SHARE - | MediaObject.SUPPORT_CACHE | MediaObject.SUPPORT_IMPORT - | MediaObject.SUPPORT_PANORAMA | MediaObject.SUPPORT_PANORAMA360; + | MediaObject.SUPPORT_CACHE | MediaObject.SUPPORT_IMPORT; public interface ActionModeListener { public boolean onActionItemClicked(MenuItem item); @@ -76,6 +76,49 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi private final Handler mMainHandler; private ActionMode mActionMode; + private static class GetAllPanoramaSupports implements PanoramaSupportCallback { + private int mNumInfoRequired; + private JobContext mJobContext; + public boolean mAllPanoramas = true; + public boolean mAllPanorama360 = true; + public boolean mHasPanorama360 = false; + private Object mLock = new Object(); + + public GetAllPanoramaSupports(ArrayList<MediaObject> mediaObjects, JobContext jc) { + mJobContext = jc; + mNumInfoRequired = mediaObjects.size(); + for (MediaObject mediaObject : mediaObjects) { + mediaObject.getPanoramaSupport(this); + } + } + + @Override + public void panoramaInfoAvailable(MediaObject mediaObject, boolean isPanorama, + boolean isPanorama360) { + synchronized (mLock) { + mNumInfoRequired--; + mAllPanoramas = isPanorama && mAllPanoramas; + mAllPanorama360 = isPanorama360 && mAllPanorama360; + mHasPanorama360 = mHasPanorama360 || isPanorama360; + if (mNumInfoRequired == 0 || mJobContext.isCancelled()) { + mLock.notifyAll(); + } + } + } + + public void waitForPanoramaSupport() { + synchronized (mLock) { + while (mNumInfoRequired != 0 && !mJobContext.isCancelled()) { + try { + mLock.wait(); + } catch (InterruptedException e) { + // May be a cancelled job context + } + } + } + } + } + public ActionModeHandler( AbstractGalleryActivity activity, SelectionManager selectionManager) { mActivity = Utils.checkNotNull(activity); @@ -211,28 +254,38 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi mSelectionManager.leaveSelectionMode(); } - // Menu options are determined by selection set itself. - // We cannot expand it because MenuExecuter executes it based on - // the selection set instead of the expanded result. - // e.g. LocalImage can be rotated but collections of them (LocalAlbum) can't. - private int computeMenuOptions(JobContext jc) { + private ArrayList<MediaObject> getSelectedMediaObjects(JobContext jc) { ArrayList<Path> unexpandedPaths = mSelectionManager.getSelected(false); if (unexpandedPaths.isEmpty()) { // This happens when starting selection mode from overflow menu // (instead of long press a media object) - return 0; + return null; } - int operation = MediaObject.SUPPORT_ALL; + ArrayList<MediaObject> selected = new ArrayList<MediaObject>(); DataManager manager = mActivity.getDataManager(); - int type = 0; for (Path path : unexpandedPaths) { - if (jc.isCancelled()) return 0; - int support = manager.getSupportedOperations(path, true); - type |= manager.getMediaType(path); + if (jc.isCancelled()) { + return null; + } + selected.add(manager.getMediaObject(path)); + } + + return selected; + } + // Menu options are determined by selection set itself. + // We cannot expand it because MenuExecuter executes it based on + // the selection set instead of the expanded result. + // e.g. LocalImage can be rotated but collections of them (LocalAlbum) can't. + private int computeMenuOptions(ArrayList<MediaObject> selected) { + int operation = MediaObject.SUPPORT_ALL; + int type = 0; + for (MediaObject mediaObject: selected) { + int support = mediaObject.getSupportedOperations(); + type |= mediaObject.getMediaType(); operation &= support; } - switch (unexpandedPaths.size()) { + switch (selected.size()) { case 1: final String mimeType = MenuExecutor.getMimeType(type); if (!GalleryUtils.isEditorAvailable(mActivity, mimeType)) { @@ -298,7 +351,7 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi final Intent intent = new Intent(); for (Path path : expandedPaths) { if (jc.isCancelled()) return null; - int support = manager.getSupportedOperations(path, true); + int support = manager.getSupportedOperations(path); type |= manager.getMediaType(path); if ((support & MediaObject.SUPPORT_SHARE) != 0) { @@ -346,21 +399,36 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi @Override public Void run(final JobContext jc) { // Pass1: Deal with unexpanded media object list for menu operation. - final int operation = computeMenuOptions(jc); + ArrayList<MediaObject> selected = getSelectedMediaObjects(jc); + if (selected == null) { + return null; + } + final int operation = computeMenuOptions(selected); + if (jc.isCancelled()) { + return null; + } + final GetAllPanoramaSupports supportCallback = new GetAllPanoramaSupports(selected, + jc); // Pass2: Deal with expanded media object list for sharing operation. final Intent share_panorama_intent = computePanoramaSharingIntent(jc); final Intent share_intent = computeSharingIntent(jc); + + supportCallback.waitForPanoramaSupport(); + if (jc.isCancelled()) { + return null; + } mMainHandler.post(new Runnable() { @Override public void run() { mMenuTask = null; if (jc.isCancelled()) return; MenuExecutor.updateMenuOperation(mMenu, operation); + MenuExecutor.updateMenuForPanorama(mMenu, supportCallback.mAllPanorama360, + supportCallback.mHasPanorama360); if (mSharePanoramaMenuItem != null) { mSharePanoramaMenuItem.setEnabled(true); - if ((operation & MediaObject.SUPPORT_PANORAMA360) != 0) { - mActivity.invalidateOptionsMenu(); + if (supportCallback.mAllPanorama360) { mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); mShareMenuItem.setTitle( mActivity.getResources().getString(R.string.share_as_photo)); |