diff options
6 files changed, 46 insertions, 17 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java index 26ceea6d1e4c..1fdd1a5a5a5f 100644 --- a/core/java/android/widget/AbsListView.java +++ b/core/java/android/widget/AbsListView.java @@ -80,6 +80,7 @@ import android.view.animation.LinearInterpolator; import android.view.autofill.AutofillId; import android.view.contentcapture.ContentCaptureManager; import android.view.contentcapture.ContentCaptureSession; +import android.view.flags.Flags; import android.view.inputmethod.BaseInputConnection; import android.view.inputmethod.CompletionInfo; import android.view.inputmethod.CorrectionInfo; @@ -92,7 +93,6 @@ import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.SurroundingText; import android.view.inspector.InspectableProperty; import android.view.inspector.InspectableProperty.EnumEntry; -import android.widget.flags.Flags; import android.widget.RemoteViews.InteractionHandler; import com.android.internal.R; @@ -4518,7 +4518,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te final int overscrollMode = getOverScrollMode(); if (!trackMotionScroll(delta, delta)) { - if (Flags.platformWidgetHapticScrollFeedback()) { + if (Flags.scrollFeedbackApi()) { initHapticScrollFeedbackProviderIfNotExists(); mHapticScrollFeedbackProvider.onScrollProgress( event.getDeviceId(), event.getSource(), axis, delta); @@ -4534,7 +4534,7 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te float overscroll = (delta - (motionViewRealTop - motionViewPrevTop)) / ((float) getHeight()); boolean hitTopLimit = delta > 0; - if (Flags.platformWidgetHapticScrollFeedback()) { + if (Flags.scrollFeedbackApi()) { initHapticScrollFeedbackProviderIfNotExists(); mHapticScrollFeedbackProvider.onScrollLimit( event.getDeviceId(), event.getSource(), axis, diff --git a/core/java/android/widget/DifferentialMotionFlingHelper.java b/core/java/android/widget/DifferentialMotionFlingHelper.java index 95d24ec31209..ef01c3b79059 100644 --- a/core/java/android/widget/DifferentialMotionFlingHelper.java +++ b/core/java/android/widget/DifferentialMotionFlingHelper.java @@ -21,6 +21,8 @@ import android.content.Context; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.ViewConfiguration; +import android.widget.flags.FeatureFlags; +import android.widget.flags.FeatureFlagsImpl; import com.android.internal.annotations.VisibleForTesting; @@ -50,6 +52,8 @@ public class DifferentialMotionFlingHelper { private final FlingVelocityThresholdCalculator mVelocityThresholdCalculator; private final DifferentialVelocityProvider mVelocityProvider; + private final FeatureFlags mWidgetFeatureFlags; + @Nullable private VelocityTracker mVelocityTracker; private float mLastFlingVelocity; @@ -134,7 +138,8 @@ public class DifferentialMotionFlingHelper { this(context, target, DifferentialMotionFlingHelper::calculateFlingVelocityThresholds, - DifferentialMotionFlingHelper::getCurrentVelocity); + DifferentialMotionFlingHelper::getCurrentVelocity, + /* widgetFeatureFlags= */ new FeatureFlagsImpl()); } @VisibleForTesting @@ -142,11 +147,13 @@ public class DifferentialMotionFlingHelper { Context context, DifferentialMotionFlingTarget target, FlingVelocityThresholdCalculator velocityThresholdCalculator, - DifferentialVelocityProvider velocityProvider) { + DifferentialVelocityProvider velocityProvider, + FeatureFlags widgetFeatureFlags) { mContext = context; mTarget = target; mVelocityThresholdCalculator = velocityThresholdCalculator; mVelocityProvider = velocityProvider; + mWidgetFeatureFlags = widgetFeatureFlags; } /** @@ -156,6 +163,9 @@ public class DifferentialMotionFlingHelper { * @param axis the axis being processed by the target View. */ public void onMotionEvent(MotionEvent event, int axis) { + if (!mWidgetFeatureFlags.enablePlatformWidgetDifferentialMotionFling()) { + return; + } boolean flingParamsChanged = calculateFlingVelocityThresholds(event, axis); if (mFlingVelocityThresholds[0] == Integer.MAX_VALUE) { // Integer.MAX_VALUE means that the device does not support fling for the current diff --git a/core/java/android/widget/ScrollView.java b/core/java/android/widget/ScrollView.java index e0e72ba1b9db..a1ebde76e98e 100644 --- a/core/java/android/widget/ScrollView.java +++ b/core/java/android/widget/ScrollView.java @@ -47,8 +47,8 @@ import android.view.ViewParent; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.animation.AnimationUtils; +import android.view.flags.Flags; import android.view.inspector.InspectableProperty; -import android.widget.flags.Flags; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; @@ -1011,14 +1011,14 @@ public class ScrollView extends FrameLayout { if (newScrollY != oldScrollY) { super.scrollTo(mScrollX, newScrollY); if (hitLimit) { - if (Flags.platformWidgetHapticScrollFeedback()) { + if (Flags.scrollFeedbackApi()) { initHapticScrollFeedbackProviderIfNotExists(); mHapticScrollFeedbackProvider.onScrollLimit( event.getDeviceId(), event.getSource(), axis, /* isStart= */ newScrollY == 0); } } else { - if (Flags.platformWidgetHapticScrollFeedback()) { + if (Flags.scrollFeedbackApi()) { initHapticScrollFeedbackProviderIfNotExists(); mHapticScrollFeedbackProvider.onScrollProgress( event.getDeviceId(), event.getSource(), axis, delta); diff --git a/core/java/android/widget/flags/differential_motion_fling_flags.aconfig b/core/java/android/widget/flags/differential_motion_fling_flags.aconfig new file mode 100644 index 000000000000..79cfe566ac05 --- /dev/null +++ b/core/java/android/widget/flags/differential_motion_fling_flags.aconfig @@ -0,0 +1,8 @@ +package: "android.widget.flags" + +flag { + namespace: "toolkit" + name: "enable_platform_widget_differential_motion_fling" + description: "Enables differential motion fling in platform widgets" + bug: "293332089" +}
\ No newline at end of file diff --git a/core/java/android/widget/flags/scroll_view_flags.aconfig b/core/java/android/widget/flags/scroll_view_flags.aconfig deleted file mode 100644 index f93ade28750b..000000000000 --- a/core/java/android/widget/flags/scroll_view_flags.aconfig +++ /dev/null @@ -1,8 +0,0 @@ -package: "android.widget.flags" - -flag { - namespace: "widget" - name: "platform_widget_haptic_scroll_feedback" - description: "Enables haptic scroll feedback in platform widgets" - bug: "287914819" -}
\ No newline at end of file diff --git a/core/tests/coretests/src/android/widget/DifferentialMotionFlingHelperTest.java b/core/tests/coretests/src/android/widget/DifferentialMotionFlingHelperTest.java index 51c8bc06e878..cce2faf71897 100644 --- a/core/tests/coretests/src/android/widget/DifferentialMotionFlingHelperTest.java +++ b/core/tests/coretests/src/android/widget/DifferentialMotionFlingHelperTest.java @@ -20,6 +20,8 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import android.view.MotionEvent; +import android.widget.flags.FakeFeatureFlagsImpl; +import android.widget.flags.Flags; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; @@ -54,6 +56,8 @@ public class DifferentialMotionFlingHelperTest { private final TestDifferentialMotionFlingTarget mFlingTarget = new TestDifferentialMotionFlingTarget(); + private final FakeFeatureFlagsImpl mFakeWidgetFeatureFlags = new FakeFeatureFlagsImpl(); + private DifferentialMotionFlingHelper mFlingHelper; @Before @@ -62,7 +66,10 @@ public class DifferentialMotionFlingHelperTest { ApplicationProvider.getApplicationContext(), mFlingTarget, mVelocityThresholdCalculator, - mVelocityProvider); + mVelocityProvider, + mFakeWidgetFeatureFlags); + mFakeWidgetFeatureFlags.setFlag( + Flags.FLAG_ENABLE_PLATFORM_WIDGET_DIFFERENTIAL_MOTION_FLING, true); } @Test @@ -139,6 +146,18 @@ public class DifferentialMotionFlingHelperTest { } @Test + public void flingFeatureFlagDisabled_noFlingCalculation() { + mFakeWidgetFeatureFlags.setFlag( + Flags.FLAG_ENABLE_PLATFORM_WIDGET_DIFFERENTIAL_MOTION_FLING, false); + mMinVelocity = 50; + mMaxVelocity = 100; + deliverEventWithVelocity(createPointerEvent(), MotionEvent.AXIS_VSCROLL, 60); + + assertFalse(mVelocityCalculated); + assertEquals(0, mFlingTarget.mLastFlingVelocity, /* delta= */ 0); + } + + @Test public void negativeFlingVelocityAboveMaximum_velocityClamped() { mMinVelocity = 50; mMaxVelocity = 100; |