From a91fbb2efd9000e9e38a2738e36cbd322030019c Mon Sep 17 00:00:00 2001 From: Juan Sebastian Martinez Date: Thu, 21 Nov 2024 15:49:33 -0800 Subject: [PATCH] Adding MSDL haptics for dragging app icons in Workspace and Hotseat. The feedback occurs when an icon hovers over an empty available space in Workspace and Hotseat, as well as over other icons to create folders. This is now compliant with the Multi-sensory Design Language spec. Test: manual. Verified haptics while dragging icons over Workspace and Hotseat. Test: manual. Verified haptics with adb shell dumpsys of Launcher and checking the MSDL token history. Flag: com.android.launcher3.msdl_feedback Bug: 371314631 Change-Id: I7d039ddf9d05faa39a6e6e3f9a84217d8916adc0 --- src/com/android/launcher3/CellLayout.java | 10 ++++++++++ src/com/android/launcher3/Workspace.java | 10 +++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/com/android/launcher3/CellLayout.java b/src/com/android/launcher3/CellLayout.java index ee72c222eb..df5f52029d 100644 --- a/src/com/android/launcher3/CellLayout.java +++ b/src/com/android/launcher3/CellLayout.java @@ -71,6 +71,7 @@ import com.android.launcher3.model.data.ItemInfo; import com.android.launcher3.model.data.LauncherAppWidgetInfo; import com.android.launcher3.util.CellAndSpan; import com.android.launcher3.util.GridOccupancy; +import com.android.launcher3.util.MSDLPlayerWrapper; import com.android.launcher3.util.MultiTranslateDelegate; import com.android.launcher3.util.ParcelableSparseArray; import com.android.launcher3.util.Themes; @@ -78,6 +79,8 @@ import com.android.launcher3.util.Thunk; import com.android.launcher3.views.ActivityContext; import com.android.launcher3.widget.LauncherAppWidgetHostView; +import com.google.android.msdl.data.model.MSDLToken; + import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -204,6 +207,8 @@ public class CellLayout extends ViewGroup { private static final Paint sPaint = new Paint(); + private final MSDLPlayerWrapper mMSDLPlayerWrapper; + // Related to accessible drag and drop DragAndDropAccessibilityDelegate mTouchHelper; @@ -237,6 +242,8 @@ public class CellLayout extends ViewGroup { mContainerType = a.getInteger(R.styleable.CellLayout_containerType, WORKSPACE); a.recycle(); + mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context); + // A ViewGroup usually does not draw, but CellLayout needs to draw a rectangle to show // the user where a dragged item will land when dropped. setWillNotDraw(false); @@ -1153,6 +1160,9 @@ public class CellLayout extends ViewGroup { DropTarget.DragObject dragObject) { if (mDragCell[0] != cellX || mDragCell[1] != cellY || mDragCellSpan[0] != spanX || mDragCellSpan[1] != spanY) { + if (Flags.msdlFeedback()) { + mMSDLPlayerWrapper.playToken(MSDLToken.DRAG_INDICATOR_DISCRETE); + } mDragCell[0] = cellX; mDragCell[1] = cellY; mDragCellSpan[0] = spanX; diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 95dbf5f4ba..69a5a8386b 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -116,6 +116,7 @@ import com.android.launcher3.util.IntArray; import com.android.launcher3.util.IntSet; import com.android.launcher3.util.IntSparseArrayMap; import com.android.launcher3.util.LauncherBindableItemsContainer; +import com.android.launcher3.util.MSDLPlayerWrapper; import com.android.launcher3.util.OverlayEdgeEffect; import com.android.launcher3.util.PackageUserKey; import com.android.launcher3.util.RunnableList; @@ -133,6 +134,8 @@ import com.android.launcher3.widget.util.WidgetSizes; import com.android.systemui.plugins.shared.LauncherOverlayManager.LauncherOverlayCallbacks; import com.android.systemui.plugins.shared.LauncherOverlayManager.LauncherOverlayTouchProxy; +import com.google.android.msdl.data.model.MSDLToken; + import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -299,6 +302,8 @@ public class Workspace extends PagedView private final StatsLogManager mStatsLogManager; + private final MSDLPlayerWrapper mMSDLPlayerWrapper; + /** * Used to inflate the Workspace from XML. * @@ -331,6 +336,7 @@ public class Workspace extends PagedView setMotionEventSplittingEnabled(true); setOnTouchListener(new WorkspaceTouchListener(mLauncher, this)); mStatsLogManager = StatsLogManager.newInstance(context); + mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context); } @Override @@ -2679,7 +2685,9 @@ public class Workspace extends PagedView ItemInfo info = dragObject.dragInfo; boolean userFolderPending = willCreateUserFolder(info, mDragOverView, false); if (mDragMode == DRAG_MODE_NONE && userFolderPending) { - + if (Flags.msdlFeedback()) { + mMSDLPlayerWrapper.playToken(MSDLToken.DRAG_INDICATOR_DISCRETE); + } mFolderCreateBg = new PreviewBackground(getContext()); mFolderCreateBg.setup(mLauncher, mLauncher, null, mDragOverView.getMeasuredWidth(), mDragOverView.getPaddingTop());