diff options
Diffstat (limited to 'src/com/android/launcher3/Workspace.java')
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 215 |
1 files changed, 92 insertions, 123 deletions
diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 340177d38..ae3463820 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -28,7 +28,6 @@ import android.annotation.SuppressLint; import android.app.WallpaperManager; import android.appwidget.AppWidgetHostView; import android.appwidget.AppWidgetProviderInfo; -import android.content.ComponentName; import android.content.Context; import android.content.res.Resources; import android.graphics.Bitmap; @@ -53,11 +52,12 @@ import android.view.accessibility.AccessibilityManager; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import android.widget.TextView; +import android.widget.Toast; import com.android.launcher3.Launcher.CustomContentCallbacks; import com.android.launcher3.Launcher.LauncherOverlay; import com.android.launcher3.UninstallDropTarget.DropTargetSource; -import com.android.launcher3.accessibility.AccessibileDragListenerAdapter; +import com.android.launcher3.accessibility.AccessibleDragListenerAdapter; import com.android.launcher3.accessibility.OverviewAccessibilityDelegate; import com.android.launcher3.accessibility.OverviewScreenAccessibilityDelegate; import com.android.launcher3.accessibility.WorkspaceAccessibilityHelper; @@ -74,6 +74,7 @@ import com.android.launcher3.dragndrop.SpringLoadedDragController; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; import com.android.launcher3.graphics.DragPreviewProvider; +import com.android.launcher3.shortcuts.DeepShortcutsContainer; import com.android.launcher3.userevent.nano.LauncherLogProto; import com.android.launcher3.userevent.nano.LauncherLogProto.Target; import com.android.launcher3.util.ItemInfoMatcher; @@ -303,7 +304,7 @@ public class Workspace extends PagedView LauncherOverlay mLauncherOverlay; boolean mScrollInteractionBegan; boolean mStartedSendingScrollEvents; - float mLastOverlaySroll = 0; + float mLastOverlayScroll = 0; // Total over scrollX in the overlay direction. private int mUnboundedScrollX; private boolean mForceDrawAdjacentPages = false; @@ -407,7 +408,12 @@ public class Workspace extends PagedView @Override public void onDragStart(DropTarget.DragObject dragObject, DragOptions options) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragStart", 0, 0); + enforceDragParity("onDragStart", 0, 0); + } + + if (mDragInfo != null && mDragInfo.cell != null) { + CellLayout layout = (CellLayout) mDragInfo.cell.getParent().getParent(); + layout.markCellsAsUnoccupiedForView(mDragInfo.cell); } if (mOutlineProvider != null) { @@ -464,7 +470,7 @@ public class Workspace extends PagedView @Override public void onDragEnd() { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragEnd", 0, 0); + enforceDragParity("onDragEnd", 0, 0); } if (!mDeferRemoveExtraEmptyScreen) { @@ -477,6 +483,8 @@ public class Workspace extends PagedView // Re-enable any Un/InstallShortcutReceiver and now process any queued items InstallShortcutReceiver.disableAndFlushInstallQueue(getContext()); + mOutlineProvider = null; + mDragInfo = null; mDragSourceInternal = null; mLauncher.onInteractionEnd(); } @@ -553,24 +561,6 @@ public class Workspace extends PagedView cl.getBackgroundAlpha() > 0); } - /** - * @return The open folder on the current screen, or null if there is none - */ - public Folder getOpenFolder() { - DragLayer dragLayer = mLauncher.getDragLayer(); - // Iterate in reverse order. Folder is added later to the dragLayer, - // and will be one of the last views. - for (int i = dragLayer.getChildCount() - 1; i >= 0; i--) { - View child = dragLayer.getChildAt(i); - if (child instanceof Folder) { - Folder folder = (Folder) child; - if (folder.getInfo().opened) - return folder; - } - } - return null; - } - boolean isTouchActive() { return mTouchState != TOUCH_STATE_REST; } @@ -582,7 +572,7 @@ public class Workspace extends PagedView /** * Initializes and binds the first page - * @param qsb an exisitng qsb to recycle or null. + * @param qsb an existing qsb to recycle or null. */ public void bindAndInitFirstWorkspaceScreen(View qsb) { if (!FeatureFlags.QSB_ON_FIRST_SCREEN) { @@ -737,11 +727,7 @@ public class Workspace extends PagedView addFullScreenPage(customScreen); // Update the custom content hint - if (mRestorePage != INVALID_RESTORE_PAGE) { - mRestorePage = mRestorePage + 1; - } else { - setCurrentPage(getCurrentPage() + 1); - } + setCurrentPage(getCurrentPage() + 1); } public void removeCustomContentPage() { @@ -762,11 +748,7 @@ public class Workspace extends PagedView mCustomContentCallbacks = null; // Update the custom content hint - if (mRestorePage != INVALID_RESTORE_PAGE) { - mRestorePage = mRestorePage - 1; - } else { - setCurrentPage(getCurrentPage() - 1); - } + setCurrentPage(getCurrentPage() - 1); } public void addToCustomContentPage(View customContent, CustomContentCallbacks callbacks, @@ -1470,7 +1452,7 @@ public class Workspace extends PagedView boolean shouldScrollOverlay = mLauncherOverlay != null && ((amount <= 0 && !mIsRtl) || (amount >= 0 && mIsRtl)); - boolean shouldZeroOverlay = mLauncherOverlay != null && mLastOverlaySroll != 0 && + boolean shouldZeroOverlay = mLauncherOverlay != null && mLastOverlayScroll != 0 && ((amount >= 0 && !mIsRtl) || (amount <= 0 && mIsRtl)); if (shouldScrollOverlay) { @@ -1479,8 +1461,8 @@ public class Workspace extends PagedView mLauncherOverlay.onScrollInteractionBegin(); } - mLastOverlaySroll = Math.abs(amount / getViewportWidth()); - mLauncherOverlay.onScrollChange(mLastOverlaySroll, mIsRtl); + mLastOverlayScroll = Math.abs(amount / getViewportWidth()); + mLauncherOverlay.onScrollChange(mLastOverlayScroll, mIsRtl); } else if (shouldOverScroll) { dampedOverScroll(amount); } @@ -1624,7 +1606,7 @@ public class Workspace extends PagedView } @Override - protected void getEdgeVerticalPostion(int[] pos) { + protected void getEdgeVerticalPosition(int[] pos) { View child = getChildAt(getPageCount() - 1); pos[0] = child.getTop(); pos[1] = child.getBottom(); @@ -1756,7 +1738,7 @@ public class Workspace extends PagedView } public boolean isOnOrMovingToCustomContent() { - return hasCustomContent() && getNextPage() == 0 && mRestorePage == INVALID_RESTORE_PAGE; + return hasCustomContent() && getNextPage() == 0; } private void updateStateForCustomContent(int screenCenter) { @@ -2009,7 +1991,7 @@ public class Workspace extends PagedView public void exitWidgetResizeMode() { DragLayer dragLayer = mLauncher.getDragLayer(); - dragLayer.clearAllResizeFrames(); + dragLayer.clearResizeFrame(); } @Override @@ -2270,11 +2252,9 @@ public class Workspace extends PagedView mDragInfo = cellInfo; child.setVisibility(INVISIBLE); - CellLayout layout = (CellLayout) child.getParent().getParent(); - layout.prepareChildForDrag(child); if (options.isAccessibleDrag) { - mDragController.addDragListener(new AccessibileDragListenerAdapter( + mDragController.addDragListener(new AccessibleDragListenerAdapter( this, CellLayout.WORKSPACE_ACCESSIBILITY_DRAG) { @Override protected void enableAccessibleDrag(boolean enable) { @@ -2348,6 +2328,15 @@ public class Workspace extends PagedView mDragSourceInternal = (ShortcutAndWidgetContainer) child.getParent(); } + if (child instanceof BubbleTextView) { + DeepShortcutsContainer dsc = DeepShortcutsContainer.showForIcon((BubbleTextView) child); + if (dsc != null) { + dragOptions.preDragCondition = dsc.createPreDragCondition(); + + mLauncher.getUserEventDispatcher().resetElapsedContainerMillis(); + } + } + DragView dv = mDragController.startDrag(b, dragLayerX, dragLayerY, source, dragObject, dragVisualizeOffset, dragRect, scale, dragOptions); dv.setIntrinsicIconScaleFactor(source.getIntrinsicIconScaleFactor()); @@ -2423,18 +2412,7 @@ public class Workspace extends PagedView // Don't accept the drop if there's no room for the item if (!foundCell) { - // Don't show the message if we are dropping on the AllApps button and the hotseat - // is full - boolean isHotseat = mLauncher.isHotseatLayout(dropTargetLayout); - if (mTargetCell != null && isHotseat && !FeatureFlags.NO_ALL_APPS_ICON) { - Hotseat hotseat = mLauncher.getHotseat(); - if (mLauncher.getDeviceProfile().inv.isAllAppsButtonRank( - hotseat.getOrderInHotseat(mTargetCell[0], mTargetCell[1]))) { - return false; - } - } - - mLauncher.showOutOfSpaceMessage(isHotseat); + onNoCellFound(dropTargetLayout); return false; } } @@ -2710,7 +2688,7 @@ public class Workspace extends PagedView public void run() { if (!isPageMoving() && !mIsSwitchingState) { DragLayer dragLayer = mLauncher.getDragLayer(); - dragLayer.addResizeFrame(info, hostView, cellLayout); + dragLayer.addResizeFrame(hostView, cellLayout); } } }; @@ -2720,6 +2698,8 @@ public class Workspace extends PagedView LauncherModel.modifyItemInDatabase(mLauncher, info, container, screenId, lp.cellX, lp.cellY, item.spanX, item.spanY); } else { + onNoCellFound(dropTargetLayout); + // If we can't find a drop location, we return the item to its original position CellLayout.LayoutParams lp = (CellLayout.LayoutParams) cell.getLayoutParams(); mTargetCell[0] = lp.cellX; @@ -2765,6 +2745,26 @@ public class Workspace extends PagedView } } + public void onNoCellFound(View dropTargetLayout) { + if (mLauncher.isHotseatLayout(dropTargetLayout)) { + Hotseat hotseat = mLauncher.getHotseat(); + boolean droppedOnAllAppsIcon = !FeatureFlags.NO_ALL_APPS_ICON + && mTargetCell != null && !mLauncher.getDeviceProfile().inv.isAllAppsButtonRank( + hotseat.getOrderInHotseat(mTargetCell[0], mTargetCell[1])); + if (!droppedOnAllAppsIcon) { + // Only show message when hotseat is full and drop target was not AllApps button + showOutOfSpaceMessage(true); + } + } else { + showOutOfSpaceMessage(false); + } + } + + private void showOutOfSpaceMessage(boolean isHotseatLayout) { + int strId = (isHotseatLayout ? R.string.hotseat_out_of_space : R.string.out_of_space); + Toast.makeText(mLauncher, mLauncher.getString(strId), Toast.LENGTH_SHORT).show(); + } + /** * Computes the area relative to dragLayer which is used to display a page. */ @@ -2790,7 +2790,7 @@ public class Workspace extends PagedView @Override public void onDragEnter(DragObject d) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragEnter", 1, 1); + enforceDragParity("onDragEnter", 1, 1); } mCreateUserFolderOnDrop = false; @@ -2807,7 +2807,7 @@ public class Workspace extends PagedView @Override public void onDragExit(DragObject d) { if (ENFORCE_DRAG_EVENT_ORDER) { - enfoceDragParity("onDragExit", -1, 0); + enforceDragParity("onDragExit", -1, 0); } // Here we store the final page that will be dropped to, if the workspace in fact @@ -2840,14 +2840,14 @@ public class Workspace extends PagedView mLauncher.getDragLayer().hidePageHints(); } - private void enfoceDragParity(String event, int update, int expectedValue) { - enfoceDragParity(this, event, update, expectedValue); + private void enforceDragParity(String event, int update, int expectedValue) { + enforceDragParity(this, event, update, expectedValue); for (int i = 0; i < getChildCount(); i++) { - enfoceDragParity(getChildAt(i), event, update, expectedValue); + enforceDragParity(getChildAt(i), event, update, expectedValue); } } - private void enfoceDragParity(View v, String event, int update, int expectedValue) { + private void enforceDragParity(View v, String event, int update, int expectedValue) { Object tag = v.getTag(R.id.drag_event_parity); int value = tag == null ? 0 : (Integer) tag; value += update; @@ -2968,7 +2968,7 @@ public class Workspace extends PagedView mTempXY[0] = (int) xy[0]; mTempXY[1] = (int) xy[1]; mLauncher.getDragLayer().getDescendantCoordRelativeToSelf(this, mTempXY, true); - mLauncher.getDragLayer().mapCoordInSelfToDescendent(hotseat.getLayout(), mTempXY); + mLauncher.getDragLayer().mapCoordInSelfToDescendant(hotseat.getLayout(), mTempXY); xy[0] = mTempXY[0]; xy[1] = mTempXY[1]; @@ -3685,8 +3685,6 @@ public class Workspace extends PagedView && mDragInfo.cell != null) { mDragInfo.cell.setVisibility(VISIBLE); } - mOutlineProvider = null; - mDragInfo = null; if (!isFlingToDelete) { // Fling to delete already exits spring loaded mode after the animation finishes. @@ -3813,7 +3811,7 @@ public class Workspace extends PagedView if (!workspaceInModalState() && !mIsSwitchingState) { super.scrollLeft(); } - Folder openFolder = getOpenFolder(); + Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } @@ -3824,7 +3822,7 @@ public class Workspace extends PagedView if (!workspaceInModalState() && !mIsSwitchingState) { super.scrollRight(); } - Folder openFolder = getOpenFolder(); + Folder openFolder = Folder.getOpen(mLauncher); if (openFolder != null) { openFolder.completeDragExit(); } @@ -3843,7 +3841,7 @@ public class Workspace extends PagedView } boolean result = false; - if (!workspaceInModalState() && !mIsSwitchingState && getOpenFolder() == null) { + if (!workspaceInModalState() && !mIsSwitchingState && Folder.getOpen(mLauncher) == null) { mInScrollArea = true; final int page = getNextPage() + @@ -4003,63 +4001,34 @@ public class Workspace extends PagedView for (final CellLayout layoutParent: cellLayouts) { final ViewGroup layout = layoutParent.getShortcutsAndWidgets(); - final HashMap<ItemInfo, View> children = new HashMap<>(); + LongArrayMap<View> idToViewMap = new LongArrayMap<>(); + ArrayList<ItemInfo> items = new ArrayList<>(); for (int j = 0; j < layout.getChildCount(); j++) { final View view = layout.getChildAt(j); - children.put((ItemInfo) view.getTag(), view); - } - - final ArrayList<View> childrenToRemove = new ArrayList<>(); - final HashMap<FolderInfo, ArrayList<ShortcutInfo>> folderAppsToRemove = new HashMap<>(); - LauncherModel.ItemInfoFilter filter = new LauncherModel.ItemInfoFilter() { - @Override - public boolean filterItem(ItemInfo parent, ItemInfo info, - ComponentName cn) { - if (parent instanceof FolderInfo) { - if (matcher.matches(info, cn)) { - FolderInfo folder = (FolderInfo) parent; - ArrayList<ShortcutInfo> appsToRemove; - if (folderAppsToRemove.containsKey(folder)) { - appsToRemove = folderAppsToRemove.get(folder); - } else { - appsToRemove = new ArrayList<ShortcutInfo>(); - folderAppsToRemove.put(folder, appsToRemove); - } - appsToRemove.add((ShortcutInfo) info); - return true; - } - } else { - if (matcher.matches(info, cn)) { - childrenToRemove.add(children.get(info)); - return true; - } - } - return false; - } - }; - LauncherModel.filterItemInfos(children.keySet(), filter); - - // Remove all the apps from their folders - for (FolderInfo folder : folderAppsToRemove.keySet()) { - ArrayList<ShortcutInfo> appsToRemove = folderAppsToRemove.get(folder); - for (ShortcutInfo info : appsToRemove) { - folder.remove(info, false); + if (view.getTag() instanceof ItemInfo) { + ItemInfo item = (ItemInfo) view.getTag(); + items.add(item); + idToViewMap.put(item.id, view); } } - // Remove all the other children - for (View child : childrenToRemove) { - // Note: We can not remove the view directly from CellLayoutChildren as this - // does not re-mark the spaces as unoccupied. - layoutParent.removeViewInLayout(child); - if (child instanceof DropTarget) { - mDragController.removeDropTarget((DropTarget) child); - } - } + for (ItemInfo itemToRemove : matcher.filterItemInfos(items)) { + View child = idToViewMap.get(itemToRemove.id); - if (childrenToRemove.size() > 0) { - layout.requestLayout(); - layout.invalidate(); + if (child != null) { + // Note: We can not remove the view directly from CellLayoutChildren as this + // does not re-mark the spaces as unoccupied. + layoutParent.removeViewInLayout(child); + if (child instanceof DropTarget) { + mDragController.removeDropTarget((DropTarget) child); + } + } else if (itemToRemove.container >= 0) { + // The item may belong to a folder. + View parent = idToViewMap.get(itemToRemove.container); + if (parent != null) { + ((FolderInfo) parent.getTag()).remove((ShortcutInfo) itemToRemove, false); + } + } } } @@ -4160,8 +4129,9 @@ public class Workspace extends PagedView public void removeAbandonedPromise(String packageName, UserHandleCompat user) { HashSet<String> packages = new HashSet<>(1); packages.add(packageName); - LauncherModel.deletePackageFromDatabase(mLauncher, packageName, user); - removeItemsByMatcher(ItemInfoMatcher.ofPackages(packages, user)); + ItemInfoMatcher matcher = ItemInfoMatcher.ofPackages(packages, user); + LauncherModel.deleteItemsFromDatabase(mLauncher, matcher); + removeItemsByMatcher(matcher); } public void updateRestoreItems(final HashSet<ItemInfo> updates) { @@ -4286,7 +4256,7 @@ public class Workspace extends PagedView } @Override - public void fillInLaunchSourceData(View v, ItemInfo info, Target target, Target targetParent) { + public void fillInLogContainerData(View v, ItemInfo info, Target target, Target targetParent) { target.gridX = info.cellX; target.gridY = info.cellY; target.pageIndex = getCurrentPage(); @@ -4338,7 +4308,6 @@ public class Workspace extends PagedView @Override public boolean evaluate(ItemInfo info, View view) { if (view instanceof PendingAppWidgetHostView && mInfos.contains(info)) { - PendingAppWidgetHostView hostView = (PendingAppWidgetHostView) view; mLauncher.removeItem(view, info, false /* deleteFromDb */); mLauncher.bindAppWidget((LauncherAppWidgetInfo) info); } |