summaryrefslogtreecommitdiffstats
path: root/src/com/android/launcher3/Workspace.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/launcher3/Workspace.java')
-rw-r--r--src/com/android/launcher3/Workspace.java215
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);
}