diff options
author | Winson <winsonc@google.com> | 2015-09-14 12:01:13 -0700 |
---|---|---|
committer | Winson Chung <winsonc@google.com> | 2015-09-14 19:47:19 +0000 |
commit | fa56b3f2f1271d6045594eed294b22841c79c783 (patch) | |
tree | 28aae9ace0e3fcdf84f91de4f818040541fc6959 /src/com/android/launcher3 | |
parent | 787e3fbcaf4920b8fe1c7f78dc32deffbfc166ab (diff) | |
download | android_packages_apps_Trebuchet-fa56b3f2f1271d6045594eed294b22841c79c783.tar.gz android_packages_apps_Trebuchet-fa56b3f2f1271d6045594eed294b22841c79c783.tar.bz2 android_packages_apps_Trebuchet-fa56b3f2f1271d6045594eed294b22841c79c783.zip |
Requiring key chord to delete icons and folders on the workspace
- Also fixing case where the all apps button to search for more apps
was not focusable
Bug: 20639227
Change-Id: Ie4d9092e654d3cafc0eb346b3bb744ec3e295e92
Diffstat (limited to 'src/com/android/launcher3')
-rw-r--r-- | src/com/android/launcher3/DeleteDropTarget.java | 6 | ||||
-rw-r--r-- | src/com/android/launcher3/FocusHelper.java | 46 | ||||
-rw-r--r-- | src/com/android/launcher3/Folder.java | 29 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 19 | ||||
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 4 |
5 files changed, 73 insertions, 31 deletions
diff --git a/src/com/android/launcher3/DeleteDropTarget.java b/src/com/android/launcher3/DeleteDropTarget.java index 163ffb6e7..c3eea2f08 100644 --- a/src/com/android/launcher3/DeleteDropTarget.java +++ b/src/com/android/launcher3/DeleteDropTarget.java @@ -70,8 +70,10 @@ public class DeleteDropTarget extends ButtonDropTarget { * @return true if the item was removed. */ public static boolean removeWorkspaceOrFolderItem(Launcher launcher, ItemInfo item, View view) { - // Remove the item from launcher and the db - launcher.removeItem(view, item, true /* deleteFromDb */); + // Remove the item from launcher and the db, we can ignore the containerInfo in this call + // because we already remove the drag view from the folder (if the drag originated from + // a folder) in Folder.beginDrag() + launcher.removeItem(view, null, item, true /* deleteFromDb */); launcher.getWorkspace().stripEmptyScreens(); return true; } diff --git a/src/com/android/launcher3/FocusHelper.java b/src/com/android/launcher3/FocusHelper.java index eca5eec2a..5c91cc0f0 100644 --- a/src/com/android/launcher3/FocusHelper.java +++ b/src/com/android/launcher3/FocusHelper.java @@ -72,7 +72,6 @@ public class FocusHelper { KeyEvent.keyCodeToString(keyCode))); } - if (!(v.getParent() instanceof ShortcutAndWidgetContainer)) { if (LauncherAppState.isDogfoodBuild()) { throw new IllegalStateException("Parent of the focused item is not supported."); @@ -195,10 +194,11 @@ public class FocusHelper { } // Initialize the variables. + final Workspace workspace = (Workspace) v.getRootView().findViewById(R.id.workspace); final ShortcutAndWidgetContainer hotseatParent = (ShortcutAndWidgetContainer) v.getParent(); final CellLayout hotseatLayout = (CellLayout) hotseatParent.getParent(); - Workspace workspace = (Workspace) v.getRootView().findViewById(R.id.workspace); + final ItemInfo itemInfo = (ItemInfo) v.getTag(); int pageIndex = workspace.getNextPage(); int pageCount = workspace.getChildCount(); int countX = -1; @@ -240,9 +240,14 @@ public class FocusHelper { } else if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT && profile.isVerticalBarLayout()) { keyCode = KeyEvent.KEYCODE_PAGE_DOWN; - } else if (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) { - ItemInfo info = (ItemInfo) v.getTag(); - launcher.removeItem(v, info, true /* deleteFromDb */); + } else if (isUninstallKeyChord(e)) { + matrix = FocusLogic.createSparseMatrix(iconLayout); + if (UninstallDropTarget.supportsDrop(launcher, itemInfo)) { + UninstallDropTarget.startUninstallActivity(launcher, itemInfo); + } + } else if (isDeleteKeyChord(e)) { + matrix = FocusLogic.createSparseMatrix(iconLayout); + launcher.removeItem(v, null, itemInfo, true /* deleteFromDb */); } else { // For other KEYCODE_DPAD_LEFT and KEYCODE_DPAD_RIGHT navigation, do not use the // matrix extended with hotseat. @@ -304,6 +309,7 @@ public class FocusHelper { final ViewGroup tabs = (ViewGroup) dragLayer.findViewById(R.id.search_drop_target_bar); final Hotseat hotseat = (Hotseat) dragLayer.findViewById(R.id.hotseat); + final ItemInfo itemInfo = (ItemInfo) v.getTag(); final int iconIndex = parent.indexOfChild(v); final int pageIndex = workspace.indexOfChild(iconLayout); final int pageCount = workspace.getChildCount(); @@ -328,10 +334,14 @@ public class FocusHelper { profile.inv.hotseatAllAppsRank, !hotseat.hasIcons() /* ignore all apps icon, unless there are no other icons */); countX = countX + 1; - } else if (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) { - ItemInfo info = (ItemInfo) v.getTag(); - launcher.removeItem(v, info, true /* deleteFromDb */); - return consume; + } else if (isUninstallKeyChord(e)) { + matrix = FocusLogic.createSparseMatrix(iconLayout); + if (UninstallDropTarget.supportsDrop(launcher, itemInfo)) { + UninstallDropTarget.startUninstallActivity(launcher, itemInfo); + } + } else if (isDeleteKeyChord(e)) { + matrix = FocusLogic.createSparseMatrix(iconLayout); + launcher.removeItem(v, null, itemInfo, true /* deleteFromDb */); } else { matrix = FocusLogic.createSparseMatrix(iconLayout); } @@ -461,4 +471,22 @@ public class FocusHelper { break; } } + + /** + * Returns whether the key event represents a valid uninstall key chord. + */ + private static boolean isUninstallKeyChord(KeyEvent event) { + int keyCode = event.getKeyCode(); + return (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) && + event.hasModifiers(KeyEvent.META_CTRL_ON | KeyEvent.META_SHIFT_ON); + } + + /** + * Returns whether the key event represents a valid delete key chord. + */ + private static boolean isDeleteKeyChord(KeyEvent event) { + int keyCode = event.getKeyCode(); + return (keyCode == KeyEvent.KEYCODE_DEL || keyCode == KeyEvent.KEYCODE_FORWARD_DEL) && + event.hasModifiers(KeyEvent.META_CTRL_ON); + } } diff --git a/src/com/android/launcher3/Folder.java b/src/com/android/launcher3/Folder.java index f59c87e34..d4e5d6d05 100644 --- a/src/com/android/launcher3/Folder.java +++ b/src/com/android/launcher3/Folder.java @@ -1113,26 +1113,29 @@ public class Folder extends LinearLayout implements DragSource, View.OnClickList public void run() { CellLayout cellLayout = mLauncher.getCellLayout(mInfo.container, mInfo.screenId); - View child = null; - // Move the item from the folder to the workspace, in the position of the folder - if (getItemCount() == 1) { - ShortcutInfo finalItem = mInfo.contents.get(0); - child = mLauncher.createShortcut(cellLayout, finalItem); - LauncherModel.addOrMoveItemInDatabase(mLauncher, finalItem, mInfo.container, - mInfo.screenId, mInfo.cellX, mInfo.cellY); - } + // Remove the folder if (getItemCount() <= 1) { - mLauncher.removeItem(mFolderIcon, mInfo, true /* deleteFromDb */); + mLauncher.removeItem(mFolderIcon, null, mInfo, true /* deleteFromDb */); if (mFolderIcon instanceof DropTarget) { mDragController.removeDropTarget((DropTarget) mFolderIcon); } } - // We add the child after removing the folder to prevent both from existing at - // the same time in the CellLayout. We need to add the new item with addInScreenFromBind() - // to ensure that hotseat items are placed correctly. - if (child != null) { + + // Move the item from the folder to the workspace, in the position of the folder + if (getItemCount() == 1) { + ShortcutInfo finalItem = mInfo.contents.get(0); + View child = mLauncher.createShortcut(cellLayout, finalItem); + LauncherModel.addOrMoveItemInDatabase(mLauncher, finalItem, mInfo.container, + mInfo.screenId, mInfo.cellX, mInfo.cellY); + + // We add the child after removing the folder to prevent both from existing at + // the same time in the CellLayout. We need to add the new item with addInScreenFromBind() + // to ensure that hotseat items are placed correctly. mLauncher.getWorkspace().addInScreenFromBind(child, mInfo.container, mInfo.screenId, mInfo.cellX, mInfo.cellY, mInfo.spanX, mInfo.spanY); + + // Focus the newly created child + child.requestFocus(); } } }; diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 65aa68ab5..bb739d1b2 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -2390,13 +2390,22 @@ public class Launcher extends Activity } /** - * Unbinds the view for the specified item, and removes the item and all its children items - * from the database. For folders, this incl udes the folder contents. AppWidgets will also - * have their widget ids deleted. + * Unbinds the view for the specified item, and removes the item and all its children. + * + * @param v the view being removed. + * @param containerInfo the {@link FolderInfo} container of this view (can be null). + * @param itemInfo the {@link ItemInfo} for this view. + * @param deleteFromDb whether or not to delete this item from the db. */ - public boolean removeItem(View v, ItemInfo itemInfo, boolean deleteFromDb) { + public boolean removeItem(View v, FolderInfo containerInfo, ItemInfo itemInfo, + boolean deleteFromDb) { if (itemInfo instanceof ShortcutInfo) { - mWorkspace.removeWorkspaceItem(v); + // Remove the shortcut from the folder before removing it from launcher + if (containerInfo != null) { + containerInfo.remove((ShortcutInfo) itemInfo); + } else { + mWorkspace.removeWorkspaceItem(v); + } if (deleteFromDb) { LauncherModel.deleteItemFromDatabase(this, itemInfo); } diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index dc73635db..f11ca5a1b 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -1120,7 +1120,7 @@ public class Workspace extends PagedView if (lahv != null && lahv.isReinflateRequired()) { // Remove and rebind the current widget (which was inflated in the wrong // orientation), but don't delete it from the database - mLauncher.removeItem(lahv, info, false /* deleteFromDb */); + mLauncher.removeItem(lahv, null, info, false /* deleteFromDb */); mLauncher.bindAppWidget(info); } } @@ -4521,7 +4521,7 @@ public class Workspace extends PagedView if (info.hostView instanceof PendingAppWidgetHostView) { // Remove and rebind the current widget, but don't delete it from the database PendingAppWidgetHostView view = (PendingAppWidgetHostView) info.hostView; - mLauncher.removeItem(view, info, false /* deleteFromDb */); + mLauncher.removeItem(view, null, info, false /* deleteFromDb */); mLauncher.bindAppWidget(info); } } |