From d36f0d2b7a19eba610702c9aa7e342ef450bdc05 Mon Sep 17 00:00:00 2001 From: Juan Sebastian Martinez Date: Tue, 12 Nov 2024 11:37:53 -0800 Subject: [PATCH] Adding MSDL feedback to dragging apps and widgest over drop targets. The ButtonDropTarget class delivers MSDL feedback onDragEnter. Test: DeleteDropTargetTest Test: manual. Verified haptics when dragging apps and widgtes over "Remove" and secondary drop areas. Flag: com.android.launcher3.msdl_feedback Bug: 371249457 Bug: 371315650 Change-Id: Ic3f79ab5e3da7bb26797f2a1bfb79b5e37b3ac97 --- .../android/launcher3/ButtonDropTarget.java | 9 ++++++++ .../launcher3/util/MSDLPlayerWrapper.java | 7 ++++++ .../android/launcher3/DeleteDropTargetTest.kt | 22 +++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java index 3d715e59a8..867bf98e47 100644 --- a/src/com/android/launcher3/ButtonDropTarget.java +++ b/src/com/android/launcher3/ButtonDropTarget.java @@ -41,8 +41,11 @@ import com.android.launcher3.dragndrop.DragLayer; import com.android.launcher3.dragndrop.DragOptions; import com.android.launcher3.dragndrop.DragView; import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.util.MSDLPlayerWrapper; import com.android.launcher3.views.ActivityContext; +import com.google.android.msdl.data.model.MSDLToken; + /** * Implements a DropTarget. */ @@ -62,6 +65,7 @@ public abstract class ButtonDropTarget extends TextView protected final ActivityContext mActivityContext; protected final DropTargetHandler mDropTargetHandler; protected DropTargetBar mDropTargetBar; + private final MSDLPlayerWrapper mMSDLPlayerWrapper; /** Whether this drop target is active for the current drag */ protected boolean mActive; @@ -94,6 +98,7 @@ public abstract class ButtonDropTarget extends TextView super(context, attrs, defStyle); mActivityContext = ActivityContext.lookupContext(context); mDropTargetHandler = mActivityContext.getDropTargetHandler(); + mMSDLPlayerWrapper = MSDLPlayerWrapper.INSTANCE.get(context); Resources resources = getResources(); mDragDistanceThreshold = resources.getDimensionPixelSize(R.dimen.drag_distanceThreshold); @@ -142,6 +147,10 @@ public abstract class ButtonDropTarget extends TextView @Override public final void onDragEnter(DragObject d) { + // Perform Haptic feedback + if (Flags.msdlFeedback()) { + mMSDLPlayerWrapper.playToken(MSDLToken.SWIPE_THRESHOLD_INDICATOR); + } if (!mAccessibleDrag && !mTextVisible) { // Show tooltip hideTooltip(); diff --git a/src/com/android/launcher3/util/MSDLPlayerWrapper.java b/src/com/android/launcher3/util/MSDLPlayerWrapper.java index 1e53ac1e8a..aab70090a0 100644 --- a/src/com/android/launcher3/util/MSDLPlayerWrapper.java +++ b/src/com/android/launcher3/util/MSDLPlayerWrapper.java @@ -28,6 +28,9 @@ import com.android.launcher3.dagger.LauncherBaseAppComponent; import com.google.android.msdl.data.model.MSDLToken; import com.google.android.msdl.domain.InteractionProperties; import com.google.android.msdl.domain.MSDLPlayer; +import com.google.android.msdl.logging.MSDLEvent; + +import java.util.List; import javax.inject.Inject; @@ -58,4 +61,8 @@ public class MSDLPlayerWrapper { public void playToken(MSDLToken token) { mMSDLPlayer.playToken(token, null); } + + public List getHistory() { + return mMSDLPlayer.getHistory(); + } } diff --git a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt index 46e66e404d..42374a569b 100644 --- a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt +++ b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt @@ -1,20 +1,29 @@ package com.android.launcher3 import android.content.Context +import android.platform.test.annotations.EnableFlags +import android.platform.test.flag.junit.SetFlagsRule import androidx.test.core.app.ApplicationProvider.getApplicationContext import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.launcher3.Utilities.* +import com.android.launcher3.dragndrop.DragView import com.android.launcher3.util.ActivityContextWrapper +import com.android.launcher3.util.MSDLPlayerWrapper +import com.google.android.msdl.data.model.MSDLToken import com.google.common.truth.Truth.assertThat import org.junit.Before +import org.junit.Rule import org.junit.Test import org.junit.runner.RunWith +import org.mockito.kotlin.mock @SmallTest @RunWith(AndroidJUnit4::class) class DeleteDropTargetTest { + @get:Rule val mSetFlagsRule = SetFlagsRule() + private var mContext: Context = ActivityContextWrapper(getApplicationContext()) // Use a non-abstract class implementation @@ -37,4 +46,17 @@ class DeleteDropTargetTest { // A lot of space for text so the text should not be clipped assertThat(buttonDropTarget.isTextClippedVertically(1000)).isFalse() } + + @Test + @EnableFlags(Flags.FLAG_MSDL_FEEDBACK) + fun onDragEnter_performsMSDLSwipeThresholdFeedback() { + val target = DropTarget.DragObject(mContext) + target.dragView = mock>() + buttonDropTarget.onDragEnter(target) + val wrapper = MSDLPlayerWrapper.INSTANCE.get(mContext) + + val history = wrapper.history + assertThat(history.size).isEqualTo(1) + assertThat(history[0].tokenName).isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR.name) + } }