Merge "Import translations. DO NOT MERGE ANYWHERE" into main
diff --git a/quickstep/res/values/styles.xml b/quickstep/res/values/styles.xml
index c423d09..6ffcb9b 100644
--- a/quickstep/res/values/styles.xml
+++ b/quickstep/res/values/styles.xml
@@ -211,6 +211,7 @@
         <item name="android:enforceNavigationBarContrast">false</item>
         <item name="android:windowLightStatusBar">true</item>
         <item name="android:windowBackground">@android:color/transparent</item>
+        <item name="android:windowShowWallpaper">false</item>
     </style>
 
     <!--
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
index c0e921e..ea6d82b 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarBackgroundRenderer.kt
@@ -23,7 +23,6 @@
 import android.graphics.Path
 import android.graphics.RectF
 import com.android.app.animation.Interpolators
-import com.android.internal.policy.ScreenDecorationsUtils
 import com.android.launcher3.R
 import com.android.launcher3.Utilities
 import com.android.launcher3.Utilities.mapRange
@@ -98,12 +97,9 @@
             shadowAlpha = LIGHT_THEME_SHADOW_ALPHA
         }
 
-        if (context.areDesktopTasksVisible()) {
-            fullCornerRadius = ScreenDecorationsUtils.getWindowCornerRadius(context)
-            cornerRadius = fullCornerRadius
-        } else {
-            fullCornerRadius = context.cornerRadius.toFloat()
-            cornerRadius = fullCornerRadius
+        fullCornerRadius = context.cornerRadius.toFloat()
+        cornerRadius = fullCornerRadius
+        if (!context.areDesktopTasksVisible()) {
             setCornerRoundness(MAX_ROUNDNESS)
         }
     }
diff --git a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
index 0807ee9..7ab9ef3 100644
--- a/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
+++ b/quickstep/src/com/android/launcher3/taskbar/TaskbarManager.java
@@ -749,4 +749,9 @@
 
     private final DeviceProfile.OnDeviceProfileChangeListener mDebugActivityDeviceProfileChanged =
             dp -> debugWhyTaskbarNotDestroyed("mActivity onDeviceProfileChanged");
+
+    @VisibleForTesting
+    public Context getWindowContext() {
+        return mContext;
+    }
 }
diff --git a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
index d842138..d13e0c4 100644
--- a/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
+++ b/quickstep/src/com/android/launcher3/taskbar/bubbles/BubbleBarViewController.java
@@ -997,10 +997,9 @@
         }
     }
 
-    /** Marks as should show education and shows the bubble bar in a collapsed state */
+    /** Marks as should show education. */
     public void prepareToShowEducation() {
         mShouldShowEducation = true;
-        mBubbleStashController.showBubbleBar(false /* expand the bubbles */);
     }
 
     /**
diff --git a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
index 34d9a68..1baba74 100644
--- a/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
+++ b/quickstep/src/com/android/launcher3/uioverrides/QuickstepLauncher.java
@@ -304,7 +304,7 @@
 
         mTISBindHelper = new TISBindHelper(this, this::onTISConnected);
         mDepthController = new DepthController(this);
-        if (DesktopModeStatus.canEnterDesktopMode(this)) {
+        if (DesktopModeStatus.canEnterDesktopModeOrShowAppHandle(this)) {
             mSplitSelectStateController.initSplitFromDesktopController(this,
                     overviewComponentObserver);
         }
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
index 096f879..cd4e78b 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRule.kt
@@ -37,6 +37,7 @@
 import com.android.quickstep.AllAppsActionManager
 import java.lang.reflect.Field
 import java.lang.reflect.ParameterizedType
+import java.util.Locale
 import java.util.Optional
 import org.junit.Assume.assumeTrue
 import org.junit.rules.TestRule
@@ -119,6 +120,15 @@
                         }
                     }
 
+                if (description.getAnnotation(ForceRtl::class.java) != null) {
+                    // Needs to be set on window context instead of sandbox context, because it does
+                    // does not propagate between them. However, this change will impact created
+                    // TaskbarActivityContext instances, since they wrap the window context.
+                    taskbarManager.windowContext.resources.configuration.setLayoutDirection(
+                        RTL_LOCALE
+                    )
+                }
+
                 try {
                     TaskbarViewController.enableModelLoadingForTests(false)
 
@@ -191,4 +201,11 @@
     @Retention(AnnotationRetention.RUNTIME)
     @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
     annotation class NavBarKidsMode
+
+    /** Forces RTL UI for tests. */
+    @Retention(AnnotationRetention.RUNTIME)
+    @Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+    annotation class ForceRtl
 }
+
+private val RTL_LOCALE = Locale.of("ar", "XB")
diff --git a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
index 7daa142..b8b0b5d 100644
--- a/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
+++ b/quickstep/tests/multivalentTests/src/com/android/launcher3/taskbar/rules/TaskbarUnitTestRuleTest.kt
@@ -19,11 +19,13 @@
 import android.platform.test.annotations.DisableFlags
 import android.platform.test.annotations.EnableFlags
 import android.platform.test.flag.junit.SetFlagsRule
+import com.android.launcher3.Utilities
 import com.android.launcher3.taskbar.TaskbarActivityContext
 import com.android.launcher3.taskbar.TaskbarKeyguardController
 import com.android.launcher3.taskbar.TaskbarManager
 import com.android.launcher3.taskbar.TaskbarStashController
 import com.android.launcher3.taskbar.bubbles.BubbleBarController
+import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.ForceRtl
 import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.InjectController
 import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.NavBarKidsMode
 import com.android.launcher3.taskbar.rules.TaskbarUnitTestRule.UserSetupMode
@@ -197,6 +199,14 @@
         }
     }
 
+    @Test
+    fun testForceRtlAnnotation_setsActivityContextLayoutDirection() {
+        @ForceRtl class Rtl
+        onSetup(description = Description.createSuiteDescription(Rtl::class.java)) {
+            assertThat(Utilities.isRtl(activityContext.resources)).isTrue()
+        }
+    }
+
     /**
      * Executes [runTest] after the [testRule] setup phase completes.
      *
diff --git a/res/drawable/all_apps_tabs_background_selected.xml b/res/drawable/all_apps_tabs_background_selected.xml
index 47f95dd..6560632 100644
--- a/res/drawable/all_apps_tabs_background_selected.xml
+++ b/res/drawable/all_apps_tabs_background_selected.xml
@@ -15,10 +15,10 @@
 -->
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
         <item
-        android:bottom="@dimen/all_apps_tabs_focus_width"
-        android:end="@dimen/all_apps_tabs_focus_width"
-        android:start="@dimen/all_apps_tabs_focus_width"
-        android:top="@dimen/all_apps_tabs_focus_width">
+            android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+            android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+            android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+            android:top="@dimen/all_apps_tabs_focus_vertical_inset">
         <shape android:shape="rectangle">
             <corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
             <solid android:color="?attr/materialColorPrimary" />
diff --git a/res/drawable/all_apps_tabs_background_unselected.xml b/res/drawable/all_apps_tabs_background_unselected.xml
index ab592a8..ce7b334 100644
--- a/res/drawable/all_apps_tabs_background_unselected.xml
+++ b/res/drawable/all_apps_tabs_background_unselected.xml
@@ -15,10 +15,10 @@
 -->
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
      <item
-        android:bottom="@dimen/all_apps_tabs_focus_width"
-        android:end="@dimen/all_apps_tabs_focus_width"
-        android:start="@dimen/all_apps_tabs_focus_width"
-        android:top="@dimen/all_apps_tabs_focus_width">
+         android:bottom="@dimen/all_apps_tabs_focus_vertical_inset"
+         android:end="@dimen/all_apps_tabs_focus_horizontal_inset"
+         android:start="@dimen/all_apps_tabs_focus_horizontal_inset"
+         android:top="@dimen/all_apps_tabs_focus_vertical_inset">
         <shape android:shape="rectangle">
             <corners android:radius="@dimen/all_apps_header_pill_corner_radius" />
             <solid android:color="?attr/materialColorSurfaceBright" />
diff --git a/res/layout/all_apps_personal_work_tabs.xml b/res/layout/all_apps_personal_work_tabs.xml
index ecc5a14..b6a8ed8 100644
--- a/res/layout/all_apps_personal_work_tabs.xml
+++ b/res/layout/all_apps_personal_work_tabs.xml
@@ -21,8 +21,6 @@
     android:layout_width="match_parent"
     android:layout_height="@dimen/all_apps_header_pill_height"
     android:layout_gravity="center_horizontal"
-    android:paddingTop="@dimen/all_apps_tabs_vertical_padding_focus"
-    android:paddingBottom="@dimen/all_apps_tabs_vertical_padding_focus"
     android:layout_marginTop="@dimen/all_apps_tabs_margin_top"
     android:orientation="horizontal"
     style="@style/TextHeadline"
diff --git a/res/values/attrs.xml b/res/values/attrs.xml
index 8bd25dd..535d61f 100644
--- a/res/values/attrs.xml
+++ b/res/values/attrs.xml
@@ -210,10 +210,10 @@
         <attr name="layout_sticky" format="boolean" />
     </declare-styleable>
 
-    <declare-styleable name="NumRows">
+    <declare-styleable name="GridDimension">
         <attr name="minDeviceWidthPx" format="float"/>
         <attr name="minDeviceHeightPx" format="float"/>
-        <attr name="numRowsNew" format="integer"/>
+        <attr name="numGridDimension" format="integer"/>
         <attr name="dbFile" />
         <attr name="defaultLayoutId"/>
         <attr name="demoModeLayoutId"/>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 61d99d7..0d4e79b 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -125,9 +125,8 @@
     <dimen name="all_apps_work_profile_tab_footer_top_padding">16dp</dimen>
     <dimen name="all_apps_work_profile_tab_footer_bottom_padding">20dp</dimen>
     <dimen name="all_apps_tabs_button_horizontal_padding">4dp</dimen>
-    <dimen name="all_apps_tabs_vertical_padding">6dp</dimen>
-    <dimen name="all_apps_tabs_vertical_padding_focus">1dp</dimen>
-    <dimen name="all_apps_tabs_focus_width">5dp</dimen>
+    <dimen name="all_apps_tabs_focus_horizontal_inset">5dp</dimen>
+    <dimen name="all_apps_tabs_focus_vertical_inset">6dp</dimen>
     <dimen name="all_apps_tabs_focus_border">3dp</dimen>
     <dimen name="all_apps_tabs_focus_padding">2dp</dimen>
     <dimen name="all_apps_tabs_margin_top">8dp</dimen>
diff --git a/src/com/android/launcher3/ButtonDropTarget.java b/src/com/android/launcher3/ButtonDropTarget.java
index 3d715e5..867bf98 100644
--- a/src/com/android/launcher3/ButtonDropTarget.java
+++ b/src/com/android/launcher3/ButtonDropTarget.java
@@ -41,8 +41,11 @@
 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 @@
     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 @@
         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 @@
 
     @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/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java
index e18862a..e1d84be 100644
--- a/src/com/android/launcher3/InvariantDeviceProfile.java
+++ b/src/com/android/launcher3/InvariantDeviceProfile.java
@@ -651,14 +651,14 @@
     }
 
     /**
-     * Parses through the xml to find NumRows specs. Then calls findBestRowCount to get the correct
-     * row count for this GridOption.
+     * Parses through the xml to find GridDimension specs. Then calls findBestRowCount to get the
+     * correct row count for this GridOption.
      *
      * @return the result of {@link #findBestRowCount(List, Info)}.
      */
-    public static NumRows getRowCount(ResourceHelper resourceHelper, Context context,
+    public static GridDimension getRowCount(ResourceHelper resourceHelper, Context context,
             Info displayInfo) {
-        ArrayList<NumRows> rowCounts = new ArrayList<>();
+        ArrayList<GridDimension> rowCounts = new ArrayList<>();
 
         try (XmlResourceParser parser = resourceHelper.getXml()) {
             final int depth = parser.getDepth();
@@ -666,8 +666,8 @@
             while (((type = parser.next()) != XmlPullParser.END_TAG
                     || parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
                 if ((type == XmlPullParser.START_TAG)
-                        && "NumRows".equals(parser.getName())) {
-                    rowCounts.add(new NumRows(context, Xml.asAttributeSet(parser)));
+                        && "GridDimension".equals(parser.getName())) {
+                    rowCounts.add(new GridDimension(context, Xml.asAttributeSet(parser)));
                 }
             }
         } catch (IOException | XmlPullParserException e) {
@@ -678,10 +678,10 @@
     }
 
     /**
-     * @return the biggest row count that fits the display dimensions spec using NumRows to
+     * @return the biggest row count that fits the display dimensions spec using GridDimension to
      * determine that. If no best row count is found, return -1.
      */
-    public static NumRows findBestRowCount(List<NumRows> list, Info displayInfo) {
+    public static GridDimension findBestRowCount(List<GridDimension> list, Info displayInfo) {
         int minWidthPx = Integer.MAX_VALUE;
         int minHeightPx = Integer.MAX_VALUE;
         for (WindowBounds bounds : displayInfo.supportedBounds) {
@@ -700,10 +700,10 @@
             }
         }
 
-        NumRows selectedRow = null;
-        for (NumRows item: list) {
+        GridDimension selectedRow = null;
+        for (GridDimension item: list) {
             if (minWidthPx >= item.mMinDeviceWidthPx && minHeightPx >= item.mMinDeviceHeightPx) {
-                if (selectedRow == null || selectedRow.mNumRowsNew < item.mNumRowsNew) {
+                if (selectedRow == null || selectedRow.mNumGridDimension < item.mNumGridDimension) {
                     selectedRow = item;
                 }
             }
@@ -1045,8 +1045,8 @@
             mIsDualGrid = a.getBoolean(R.styleable.GridDisplayOption_isDualGrid, false);
             if (mRowCountSpecsId != INVALID_RESOURCE_HANDLE) {
                 ResourceHelper resourceHelper = new ResourceHelper(context, mRowCountSpecsId);
-                NumRows numR = getRowCount(resourceHelper, context, displayInfo);
-                numRows = numR.mNumRowsNew;
+                GridDimension numR = getRowCount(resourceHelper, context, displayInfo);
+                numRows = numR.mNumGridDimension;
                 dbFile = numR.mDbFile;
                 defaultLayoutId = numR.mDefaultLayoutId;
                 demoModeLayoutId = numR.mDemoModeLayoutId;
@@ -1235,8 +1235,8 @@
         }
     }
 
-    public static final class NumRows {
-        final int mNumRowsNew;
+    public static final class GridDimension {
+        final int mNumGridDimension;
         final float mMinDeviceWidthPx;
         final float mMinDeviceHeightPx;
         final String mDbFile;
@@ -1244,17 +1244,17 @@
         final int mDemoModeLayoutId;
 
 
-        NumRows(Context context, AttributeSet attrs) {
-            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.NumRows);
+        GridDimension(Context context, AttributeSet attrs) {
+            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.GridDimension);
 
-            mNumRowsNew = (int) a.getFloat(R.styleable.NumRows_numRowsNew, 0);
-            mMinDeviceWidthPx = a.getFloat(R.styleable.NumRows_minDeviceWidthPx, 0);
-            mMinDeviceHeightPx = a.getFloat(R.styleable.NumRows_minDeviceHeightPx, 0);
-            mDbFile = a.getString(R.styleable.NumRows_dbFile);
+            mNumGridDimension = (int) a.getFloat(R.styleable.GridDimension_numGridDimension, 0);
+            mMinDeviceWidthPx = a.getFloat(R.styleable.GridDimension_minDeviceWidthPx, 0);
+            mMinDeviceHeightPx = a.getFloat(R.styleable.GridDimension_minDeviceHeightPx, 0);
+            mDbFile = a.getString(R.styleable.GridDimension_dbFile);
             mDefaultLayoutId = a.getResourceId(
-                    R.styleable.NumRows_defaultLayoutId, 0);
+                    R.styleable.GridDimension_defaultLayoutId, 0);
             mDemoModeLayoutId = a.getResourceId(
-                    R.styleable.NumRows_demoModeLayoutId, mDefaultLayoutId);
+                    R.styleable.GridDimension_demoModeLayoutId, mDefaultLayoutId);
 
             a.recycle();
         }
diff --git a/src/com/android/launcher3/util/MSDLPlayerWrapper.java b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
index 1e53ac1..aab7009 100644
--- a/src/com/android/launcher3/util/MSDLPlayerWrapper.java
+++ b/src/com/android/launcher3/util/MSDLPlayerWrapper.java
@@ -28,6 +28,9 @@
 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 void playToken(MSDLToken token) {
         mMSDLPlayer.playToken(token, null);
     }
+
+    public List<MSDLEvent> getHistory() {
+        return mMSDLPlayer.getHistory();
+    }
 }
diff --git a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
index f8794f8..c4519eb 100644
--- a/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
+++ b/tests/multivalentTests/src/com/android/launcher3/AbstractDeviceProfileTest.kt
@@ -168,7 +168,6 @@
         isLandscape: Boolean = false,
         isGestureMode: Boolean = true,
         isFolded: Boolean = false,
-        isFixedLandscape: Boolean = false,
     ) {
         val (unfoldedNaturalX, unfoldedNaturalY) = deviceSpecUnfolded.naturalSize
         val unfoldedWindowsBounds =
@@ -195,7 +194,6 @@
                 rotation = if (isLandscape) Surface.ROTATION_90 else Surface.ROTATION_0,
                 isGestureMode = isGestureMode,
                 densityDpi = deviceSpecFolded.densityDpi,
-                isFixedLandscape = isFixedLandscape,
             )
         } else {
             initializeCommonVars(
@@ -204,7 +202,6 @@
                 rotation = if (isLandscape) Surface.ROTATION_0 else Surface.ROTATION_90,
                 isGestureMode = isGestureMode,
                 densityDpi = deviceSpecUnfolded.densityDpi,
-                isFixedLandscape = isFixedLandscape,
             )
         }
     }
diff --git a/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt b/tests/multivalentTests/src/com/android/launcher3/DeleteDropTargetTest.kt
index 46e66e4..42374a5 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 @@
         // 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<DragView<*>>()
+        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)
+    }
 }