diff options
author | Bobby Georgescu <georgescu@google.com> | 2013-04-15 19:30:02 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2013-04-15 19:30:02 +0000 |
commit | e5cee4bf6cea89360dd5823d47eb8b836bc371de (patch) | |
tree | 8fa154a7da16643422658d03ee408ad6425d6eef /src/com/android | |
parent | cb482deecb95a140b63d4bd43e2560fb9033df86 (diff) | |
parent | 3952c323a14e55ba176e63197f5c6aa6c9cbdb7e (diff) | |
download | android_packages_apps_Snap-e5cee4bf6cea89360dd5823d47eb8b836bc371de.tar.gz android_packages_apps_Snap-e5cee4bf6cea89360dd5823d47eb8b836bc371de.tar.bz2 android_packages_apps_Snap-e5cee4bf6cea89360dd5823d47eb8b836bc371de.zip |
Merge "Fix performance and other issues related to multi-selection" into gb-ub-photos-bryce
Diffstat (limited to 'src/com/android')
-rw-r--r-- | src/com/android/gallery3d/ui/ActionModeHandler.java | 53 | ||||
-rw-r--r-- | src/com/android/gallery3d/ui/SelectionManager.java | 40 |
2 files changed, 68 insertions, 25 deletions
diff --git a/src/com/android/gallery3d/ui/ActionModeHandler.java b/src/com/android/gallery3d/ui/ActionModeHandler.java index cd3ca091d..c8a1977ca 100644 --- a/src/com/android/gallery3d/ui/ActionModeHandler.java +++ b/src/com/android/gallery3d/ui/ActionModeHandler.java @@ -53,6 +53,9 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi @SuppressWarnings("unused") private static final String TAG = "ActionModeHandler"; + private static final int MAX_SELECTED_ITEMS_FOR_SHARE_INTENT = 100; + private static final int MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT = 10; + private static final int SUPPORT_MULTIPLE_MASK = MediaObject.SUPPORT_DELETE | MediaObject.SUPPORT_ROTATE | MediaObject.SUPPORT_SHARE | MediaObject.SUPPORT_CACHE; @@ -314,10 +317,10 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi // Share intent needs to expand the selection set so we can get URI of // each media item - private Intent computePanoramaSharingIntent(JobContext jc) { - ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true); - if (expandedPaths.size() == 0) { - return null; + private Intent computePanoramaSharingIntent(JobContext jc, int maxItems) { + ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true, maxItems); + if (expandedPaths == null || expandedPaths.size() == 0) { + return new Intent(); } final ArrayList<Uri> uris = new ArrayList<Uri>(); DataManager manager = mActivity.getDataManager(); @@ -344,11 +347,11 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi return intent; } - private Intent computeSharingIntent(JobContext jc) { - ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true); - if (expandedPaths.size() == 0) { + private Intent computeSharingIntent(JobContext jc, int maxItems) { + ArrayList<Path> expandedPaths = mSelectionManager.getSelected(true, maxItems); + if (expandedPaths == null || expandedPaths.size() == 0) { setNfcBeamPushUris(null); - return null; + return new Intent(); } final ArrayList<Uri> uris = new ArrayList<Uri>(); DataManager manager = mActivity.getDataManager(); @@ -421,14 +424,27 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi if (jc.isCancelled()) { return null; } - final GetAllPanoramaSupports supportCallback = new GetAllPanoramaSupports(selected, - jc); + int numSelected = selected.size(); + final boolean canSharePanoramas = + numSelected < MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT; + final boolean canShare = + numSelected < MAX_SELECTED_ITEMS_FOR_SHARE_INTENT; - // Pass2: Deal with expanded media object list for sharing operation. - final Intent share_panorama_intent = computePanoramaSharingIntent(jc); - final Intent share_intent = computeSharingIntent(jc); + final GetAllPanoramaSupports supportCallback = canSharePanoramas ? + new GetAllPanoramaSupports(selected, jc) + : null; - supportCallback.waitForPanoramaSupport(); + // Pass2: Deal with expanded media object list for sharing operation. + final Intent share_panorama_intent = canSharePanoramas ? + computePanoramaSharingIntent(jc, MAX_SELECTED_ITEMS_FOR_PANORAMA_SHARE_INTENT) + : new Intent(); + final Intent share_intent = canShare ? + computeSharingIntent(jc, MAX_SELECTED_ITEMS_FOR_SHARE_INTENT) + : new Intent(); + + if (canSharePanoramas) { + supportCallback.waitForPanoramaSupport(); + } if (jc.isCancelled()) { return null; } @@ -438,11 +454,12 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi mMenuTask = null; if (jc.isCancelled()) return; MenuExecutor.updateMenuOperation(mMenu, operation); - MenuExecutor.updateMenuForPanorama(mMenu, supportCallback.mAllPanorama360, - supportCallback.mHasPanorama360); + MenuExecutor.updateMenuForPanorama(mMenu, + canSharePanoramas && supportCallback.mAllPanorama360, + canSharePanoramas && supportCallback.mHasPanorama360); if (mSharePanoramaMenuItem != null) { mSharePanoramaMenuItem.setEnabled(true); - if (supportCallback.mAllPanorama360) { + if (canSharePanoramas && supportCallback.mAllPanorama360) { mShareMenuItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER); mShareMenuItem.setTitle( mActivity.getResources().getString(R.string.share_as_photo)); @@ -455,7 +472,7 @@ public class ActionModeHandler implements Callback, PopupList.OnPopupItemClickLi mSharePanoramaActionProvider.setShareIntent(share_panorama_intent); } if (mShareMenuItem != null) { - mShareMenuItem.setEnabled(true); + mShareMenuItem.setEnabled(canShare); mShareActionProvider.setShareIntent(share_intent); } } diff --git a/src/com/android/gallery3d/ui/SelectionManager.java b/src/com/android/gallery3d/ui/SelectionManager.java index a6be0dd9f..9a2396d42 100644 --- a/src/com/android/gallery3d/ui/SelectionManager.java +++ b/src/com/android/gallery3d/ui/SelectionManager.java @@ -146,10 +146,12 @@ public class SelectionManager { } } - private static void expandMediaSet(ArrayList<Path> items, MediaSet set) { + private static boolean expandMediaSet(ArrayList<Path> items, MediaSet set, int maxSelection) { int subCount = set.getSubMediaSetCount(); for (int i = 0; i < subCount; i++) { - expandMediaSet(items, set.getSubMediaSet(i)); + if (!expandMediaSet(items, set.getSubMediaSet(i), maxSelection)) { + return false; + } } int total = set.getMediaItemCount(); int batch = 50; @@ -160,14 +162,23 @@ public class SelectionManager { ? batch : total - index; ArrayList<MediaItem> list = set.getMediaItem(index, count); + if (list != null + && list.size() > (maxSelection - items.size())) { + return false; + } for (MediaItem item : list) { items.add(item.getPath()); } index += batch; } + return true; } public ArrayList<Path> getSelected(boolean expandSet) { + return getSelected(expandSet, Integer.MAX_VALUE); + } + + public ArrayList<Path> getSelected(boolean expandSet, int maxSelection) { ArrayList<Path> selected = new ArrayList<Path>(); if (mIsAlbumSet) { if (mInverseSelection) { @@ -176,19 +187,26 @@ public class SelectionManager { MediaSet set = mSourceMediaSet.getSubMediaSet(i); Path id = set.getPath(); if (!mClickedSet.contains(id)) { - if (expandSet) { - expandMediaSet(selected, set); + if (expandSet && !expandMediaSet(selected, set, maxSelection)) { + return null; } else { selected.add(id); + if (selected.size() > maxSelection) { + return null; + } } } } } else { for (Path id : mClickedSet) { - if (expandSet) { - expandMediaSet(selected, mDataManager.getMediaSet(id)); + if (expandSet && !expandMediaSet(selected, + mDataManager.getMediaSet(id), maxSelection)) { + return null; } else { selected.add(id); + if (selected.size() > maxSelection) { + return null; + } } } } @@ -201,13 +219,21 @@ public class SelectionManager { ArrayList<MediaItem> list = mSourceMediaSet.getMediaItem(index, count); for (MediaItem item : list) { Path id = item.getPath(); - if (!mClickedSet.contains(id)) selected.add(id); + if (!mClickedSet.contains(id)) { + selected.add(id); + if (selected.size() > maxSelection) { + return null; + } + } } index += count; } } else { for (Path id : mClickedSet) { selected.add(id); + if (selected.size() > maxSelection) { + return null; + } } } } |