From c331032de550ec01813cee3798d0bdbd51a35289 Mon Sep 17 00:00:00 2001 From: Shu Chen Date: Thu, 12 Mar 2020 10:55:07 +0800 Subject: [PATCH] Makes the finger-to-cursor distance configurable via DeviceConfig. Bug: 149885871 Test: manual tested. Change-Id: I545be8aa594dde6c3412167fcdf1bad3403a11a3 --- core/java/android/widget/Editor.java | 16 +++++++++++++--- core/java/android/widget/WidgetFlags.java | 19 +++++++++++++++++++ .../server/am/CoreSettingsObserver.java | 4 ++++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index 816612f1dcc7e..16d9ed369f544 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -4589,7 +4589,7 @@ public class Editor { private float mTouchOffsetY; // Where the touch position should be on the handle to ensure a maximum cursor visibility. // This is the distance in pixels from the top of the handle view. - private float mIdealVerticalOffset; + private final float mIdealVerticalOffset; // Parent's (TextView) previous position in window private int mLastParentX, mLastParentY; // Parent's (TextView) previous position on screen @@ -4638,8 +4638,18 @@ public class Editor { final int handleHeight = getPreferredHeight(); mTouchOffsetY = -0.3f * handleHeight; - mIdealVerticalOffset = 0.7f * handleHeight; - mIdealFingerToCursorOffset = (int)(mIdealVerticalOffset - mTouchOffsetY); + final int distance = AppGlobals.getIntCoreSetting( + WidgetFlags.KEY_FINGER_TO_CURSOR_DISTANCE, + WidgetFlags.FINGER_TO_CURSOR_DISTANCE_DEFAULT); + if (distance < 0 || distance > 100) { + mIdealVerticalOffset = 0.7f * handleHeight; + mIdealFingerToCursorOffset = (int)(mIdealVerticalOffset - mTouchOffsetY); + } else { + mIdealFingerToCursorOffset = (int) TypedValue.applyDimension( + TypedValue.COMPLEX_UNIT_DIP, distance, + mTextView.getContext().getResources().getDisplayMetrics()); + mIdealVerticalOffset = mIdealFingerToCursorOffset + mTouchOffsetY; + } } public float getIdealVerticalOffset() { diff --git a/core/java/android/widget/WidgetFlags.java b/core/java/android/widget/WidgetFlags.java index bce5497a7c2de..09ab5aa17782e 100644 --- a/core/java/android/widget/WidgetFlags.java +++ b/core/java/android/widget/WidgetFlags.java @@ -40,6 +40,25 @@ public final class WidgetFlags { */ public static final boolean ENABLE_CURSOR_DRAG_FROM_ANYWHERE_DEFAULT = true; + /** + * The flag of finger-to-cursor distance in DP for cursor dragging. + * The value unit is DP and the range is {0..100}. If the value is out of range, the legacy + * value, which is based on handle size, will be used. + */ + public static final String FINGER_TO_CURSOR_DISTANCE = + "CursorControlFeature__finger_to_cursor_distance"; + + /** + * The key used in app core settings for the flag {@link #FINGER_TO_CURSOR_DISTANCE}. + */ + public static final String KEY_FINGER_TO_CURSOR_DISTANCE = + "widget__finger_to_cursor_distance"; + + /** + * Default value for the flag {@link #FINGER_TO_CURSOR_DISTANCE}. + */ + public static final int FINGER_TO_CURSOR_DISTANCE_DEFAULT = -1; + /** * Whether additional gestures should be enabled for the insertion cursor handle (e.g. * long-press or double-tap on the handle to trigger selection). diff --git a/services/core/java/com/android/server/am/CoreSettingsObserver.java b/services/core/java/com/android/server/am/CoreSettingsObserver.java index 48ceba976502a..8527ae9713524 100644 --- a/services/core/java/com/android/server/am/CoreSettingsObserver.java +++ b/services/core/java/com/android/server/am/CoreSettingsObserver.java @@ -115,6 +115,10 @@ final class CoreSettingsObserver extends ContentObserver { DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.ENABLE_CURSOR_DRAG_FROM_ANYWHERE, WidgetFlags.KEY_ENABLE_CURSOR_DRAG_FROM_ANYWHERE, boolean.class, WidgetFlags.ENABLE_CURSOR_DRAG_FROM_ANYWHERE_DEFAULT)); + sDeviceConfigEntries.add(new DeviceConfigEntry( + DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.FINGER_TO_CURSOR_DISTANCE, + WidgetFlags.KEY_FINGER_TO_CURSOR_DISTANCE, int.class, + WidgetFlags.FINGER_TO_CURSOR_DISTANCE_DEFAULT)); sDeviceConfigEntries.add(new DeviceConfigEntry( DeviceConfig.NAMESPACE_WIDGET, WidgetFlags.ENABLE_INSERTION_HANDLE_GESTURES, WidgetFlags.KEY_ENABLE_INSERTION_HANDLE_GESTURES, boolean.class,