summaryrefslogtreecommitdiffstats
path: root/src/com/android/gallery3d/ui
diff options
context:
space:
mode:
authorBobby Georgescu <georgescu@google.com>2013-04-12 15:11:39 -0700
committerBobby Georgescu <georgescu@google.com>2013-04-12 17:07:37 -0700
commit3952c323a14e55ba176e63197f5c6aa6c9cbdb7e (patch)
tree092ed671ee73221491bde8767ea3d312d2443a04 /src/com/android/gallery3d/ui
parenta3211b06f224ea79db8dac02b5ed19ccdb9f9094 (diff)
downloadandroid_packages_apps_Snap-3952c323a14e55ba176e63197f5c6aa6c9cbdb7e.tar.gz
android_packages_apps_Snap-3952c323a14e55ba176e63197f5c6aa6c9cbdb7e.tar.bz2
android_packages_apps_Snap-3952c323a14e55ba176e63197f5c6aa6c9cbdb7e.zip
Fix performance and other issues related to multi-selection
Bug: 8606565 Bug: 8607510 Change-Id: I5bd01745b6d1047571d562e1637a2999afddfec2
Diffstat (limited to 'src/com/android/gallery3d/ui')
-rw-r--r--src/com/android/gallery3d/ui/ActionModeHandler.java53
-rw-r--r--src/com/android/gallery3d/ui/SelectionManager.java40
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;
+ }
}
}
}