Loading core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -55132,6 +55132,7 @@ package android.view { method @FlaggedApi("android.companion.virtualdevice.flags.viewconfiguration_apis") public float getScrollFrictionAmount(); method public static int getTapTimeout(); method @FlaggedApi("android.companion.virtualdevice.flags.viewconfiguration_apis") public int getTapTimeoutMillis(); method @FlaggedApi("android.view.accessibility.text_cursor_blink_interval") public int getTextCursorBlinkIntervalMillis(); method @Deprecated public static int getTouchSlop(); method @Deprecated public static int getWindowTouchSlop(); method public static long getZoomControlsTimeout(); core/java/android/provider/Settings.java +11 −0 Original line number Diff line number Diff line Loading @@ -9631,6 +9631,17 @@ public final class Settings { public static final String REDUCE_BRIGHT_COLORS_PERSIST_ACROSS_REBOOTS = "reduce_bright_colors_persist_across_reboots"; /** * Integer setting that specifies the duration in ms required to invert the text cursor's * pixels. * * @see ViewConfiguration#getTextCursorBlinkIntervalMillis() * * @hide */ public static final String ACCESSIBILITY_TEXT_CURSOR_BLINK_INTERVAL_MS = "accessibility_text_cursor_blink_interval_ms"; /** * Setting that holds EM_VALUE (proprietary) * Loading core/java/android/view/ViewConfiguration.java +102 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,35 @@ public class ViewConfiguration { */ private static final int SMART_SELECTION_INITIALIZING_TIMEOUT_IN_MILLISECOND = 500; /** * The default number of milliseconds required to invert the text cursor's pixels. * * Keep in sync with core/res/res/values/integers.xml. * * @hide */ public static final int DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS = 500; /** * The minimum number of milliseconds required to invert the text cursor's pixels that is * comfortable for users with photosensitivity. * * Keep in sync with core/res/res/values/arrays.xml. * * @hide */ public static final int MIN_TEXT_CURSOR_BLINK_INTERVAL_MS = 333; /** * The number of milliseconds indicating a text cursor's pixels are never inverted, i.e. the * text cursor does not blink at all. * * Keep in sync with core/res/res/values/integers.xml. * * @hide */ public static final int NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS = 0; private static ResourceCache sResourceCache = new ResourceCache(); private final boolean mConstructedWithContext; Loading Loading @@ -770,6 +799,39 @@ public class ViewConfiguration { DEFAULT_KEY_REPEAT_DELAY_MS); } /** * Returns the duration in milliseconds of the text cursor blink interval, which is the elapsed * time between inversions of the color of the text cursor's pixels. * * <p>The value is user-configurable and is constrained to the following range: * <ul> * <li>0 (don't blink) * <li>>= 333 (fast blink, the minimum blink interval that is comfortable for * photosensitivity) * </ul> * * @return the duration in milliseconds of the text cursor blink interval */ @FlaggedApi(android.view.accessibility.Flags.FLAG_TEXT_CURSOR_BLINK_INTERVAL) public int getTextCursorBlinkIntervalMillis() { int value = AppGlobals.getIntCoreSetting( Settings.Secure.ACCESSIBILITY_TEXT_CURSOR_BLINK_INTERVAL_MS, sResourceCache.getDefaultTextCursorBlinkInterval()); int noBlink = sResourceCache.getNoBlinkTextCursorBlinkInterval(); int minBlink = sResourceCache.getMinTextCursorBlinkInterval(); if (value <= noBlink) { // Treat any negative value as no-blink. return noBlink; } else if (value <= minBlink) { // Constrain non-zero blink interval to >= minimum blink (333 ms). return minBlink; } return value; } /** * @return the duration in milliseconds we will wait to see if a touch event * is a tap or a scroll. If the user does not move within this interval, it is Loading Loading @@ -1557,6 +1619,9 @@ public class ViewConfiguration { private long mZoomControlsTimeout = -1L; private float mScrollFriction = -1f; private long mDefaultActionModeHideDuration = -1L; private int mDefaultTextCursorBlinkInterval = -1; private int mMinTextCursorBlinkInterval = -1; private int mNoBlinkTextCursorBlinkInterval = -1; public int getPressedStateDuration() { if (mPressedStateDuration < 0) { Loading Loading @@ -1648,6 +1713,43 @@ public class ViewConfiguration { return mDefaultActionModeHideDuration; } public int getDefaultTextCursorBlinkInterval() { if (mDefaultTextCursorBlinkInterval < 0) { Resources resources = getCurrentResources(); mDefaultTextCursorBlinkInterval = resources != null ? resources.getInteger( R.integer.def_accessibility_text_cursor_blink_interval_ms) : DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS; } return mDefaultTextCursorBlinkInterval; } public int getNoBlinkTextCursorBlinkInterval() { if (mNoBlinkTextCursorBlinkInterval < 0) { Resources resources = getCurrentResources(); mNoBlinkTextCursorBlinkInterval = resources != null ? resources.getInteger( R.integer.no_blink_accessibility_text_cursor_blink_interval_ms) : NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS; } return mNoBlinkTextCursorBlinkInterval; } public int getMinTextCursorBlinkInterval() { if (mMinTextCursorBlinkInterval < 0) { mMinTextCursorBlinkInterval = MIN_TEXT_CURSOR_BLINK_INTERVAL_MS; Resources resources = getCurrentResources(); if (resources != null) { int[] textCursorBlinkIntervals = resources.getIntArray( R.array.accessibility_text_cursor_blink_intervals); if (textCursorBlinkIntervals.length > 0) { mMinTextCursorBlinkInterval = textCursorBlinkIntervals[0]; } } } return mMinTextCursorBlinkInterval; } private static Resources getCurrentResources() { if (!android.companion.virtualdevice.flags.Flags .migrateViewconfigurationConstantsToResources()) { Loading core/java/android/widget/Editor.java +32 −6 Original line number Diff line number Diff line Loading @@ -183,7 +183,6 @@ public class Editor { private static final int DELAY_BEFORE_HANDLE_FADES_OUT = 4000; private static final int RECENT_CUT_COPY_DURATION_MS = 15 * 1000; // 15 seconds in millis static final int BLINK = 500; private static final int DRAG_SHADOW_MAX_TEXT_LENGTH = 20; private static final int UNSET_X_VALUE = -1; private static final int UNSET_LINE = -1; Loading Loading @@ -340,6 +339,7 @@ public class Editor { private long mShowCursor; private boolean mRenderCursorRegardlessTiming; private Blink mBlink; private int mBlinkInterval = ViewConfiguration.DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS; // Whether to let magnifier draw cursor on its surface. This is for floating cursor effect. // And it can only be true when |mNewMagnifierEnabled| is true. Loading Loading @@ -525,6 +525,11 @@ public class Editor { mLineChangeSlopMin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, LINE_CHANGE_SLOP_MIN_DP, mTextView.getContext().getResources().getDisplayMetrics()); if (android.view.accessibility.Flags.textCursorBlinkInterval()) { mBlinkInterval = ViewConfiguration.get(mTextView.getContext()) .getTextCursorBlinkIntervalMillis(); } } @VisibleForTesting Loading Loading @@ -552,6 +557,16 @@ public class Editor { mFlagInsertionHandleGesturesEnabled = enabled; } @VisibleForTesting public void setTextCursorBlinkIntervalMs(int intervalMs) { mBlinkInterval = intervalMs; } @VisibleForTesting public void setShowCursorTime(long time) { mShowCursor = time; } // Lazy creates the magnifier animator. private MagnifierMotionAnimator getMagnifierAnimator() { if (FLAG_USE_MAGNIFIER && mMagnifierAnimator == null) { Loading Loading @@ -982,15 +997,20 @@ public class Editor { return mCursorVisible && mTextView.isTextEditable(); } boolean shouldRenderCursor() { /** * Return true if the cursor should be rendered, false otherwise. */ @VisibleForTesting public boolean shouldRenderCursor() { if (!isCursorVisible()) { return false; } if (mRenderCursorRegardlessTiming) { if (mRenderCursorRegardlessTiming || mBlinkInterval == ViewConfiguration.NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS) { return true; } final long showCursorDelta = SystemClock.uptimeMillis() - mShowCursor; return showCursorDelta % (2 * BLINK) < BLINK; return showCursorDelta % (2L * mBlinkInterval) < mBlinkInterval; } void prepareCursorControllers() { Loading Loading @@ -1103,6 +1123,12 @@ public class Editor { if (mBlink != null) { mBlink.uncancel(); } if (android.view.accessibility.Flags.textCursorBlinkInterval()) { mBlinkInterval = ViewConfiguration.get(mTextView.getContext()) .getTextCursorBlinkIntervalMillis(); } // Moving makeBlink outside of the null check block ensures that mBlink object gets // instantiated when the view is added to the window if mBlink is still null. makeBlink(); Loading Loading @@ -2969,7 +2995,7 @@ public class Editor { // resume blinking unless uncancelled. mBlink.uncancel(); mTextView.removeCallbacks(mBlink); mTextView.postDelayed(mBlink, BLINK); mTextView.postDelayed(mBlink, mBlinkInterval); } else { if (mBlink != null) mTextView.removeCallbacks(mBlink); } Loading Loading @@ -3001,7 +3027,7 @@ public class Editor { mTextView.invalidateCursorPath(); } mTextView.postDelayed(this, BLINK); mTextView.postDelayed(this, mBlinkInterval); } } Loading core/res/res/values/arrays.xml +18 −0 Original line number Diff line number Diff line Loading @@ -233,4 +233,22 @@ <string-array name="demo_device_provisioning_known_signers"> <item>@string/config_retailDemoPackageSignature</item> </string-array> <!-- Non-zero text cursor blink intervals. The first value in the array is the minimum allowable blink interval. This array must adhere to the following constraints: 1) there is at least one value 2) the values are in ascending order. Keep in sync with ViewConfiguration. --> <integer-array name="accessibility_text_cursor_blink_intervals"> <item>333</item> <item>357</item> <item>385</item> <item>417</item> <item>455</item> <item>500</item> <item>556</item> <item>625</item> <item>714</item> <item>833</item> <item>1000</item> </integer-array> </resources> Loading
core/api/current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -55132,6 +55132,7 @@ package android.view { method @FlaggedApi("android.companion.virtualdevice.flags.viewconfiguration_apis") public float getScrollFrictionAmount(); method public static int getTapTimeout(); method @FlaggedApi("android.companion.virtualdevice.flags.viewconfiguration_apis") public int getTapTimeoutMillis(); method @FlaggedApi("android.view.accessibility.text_cursor_blink_interval") public int getTextCursorBlinkIntervalMillis(); method @Deprecated public static int getTouchSlop(); method @Deprecated public static int getWindowTouchSlop(); method public static long getZoomControlsTimeout();
core/java/android/provider/Settings.java +11 −0 Original line number Diff line number Diff line Loading @@ -9631,6 +9631,17 @@ public final class Settings { public static final String REDUCE_BRIGHT_COLORS_PERSIST_ACROSS_REBOOTS = "reduce_bright_colors_persist_across_reboots"; /** * Integer setting that specifies the duration in ms required to invert the text cursor's * pixels. * * @see ViewConfiguration#getTextCursorBlinkIntervalMillis() * * @hide */ public static final String ACCESSIBILITY_TEXT_CURSOR_BLINK_INTERVAL_MS = "accessibility_text_cursor_blink_interval_ms"; /** * Setting that holds EM_VALUE (proprietary) * Loading
core/java/android/view/ViewConfiguration.java +102 −0 Original line number Diff line number Diff line Loading @@ -351,6 +351,35 @@ public class ViewConfiguration { */ private static final int SMART_SELECTION_INITIALIZING_TIMEOUT_IN_MILLISECOND = 500; /** * The default number of milliseconds required to invert the text cursor's pixels. * * Keep in sync with core/res/res/values/integers.xml. * * @hide */ public static final int DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS = 500; /** * The minimum number of milliseconds required to invert the text cursor's pixels that is * comfortable for users with photosensitivity. * * Keep in sync with core/res/res/values/arrays.xml. * * @hide */ public static final int MIN_TEXT_CURSOR_BLINK_INTERVAL_MS = 333; /** * The number of milliseconds indicating a text cursor's pixels are never inverted, i.e. the * text cursor does not blink at all. * * Keep in sync with core/res/res/values/integers.xml. * * @hide */ public static final int NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS = 0; private static ResourceCache sResourceCache = new ResourceCache(); private final boolean mConstructedWithContext; Loading Loading @@ -770,6 +799,39 @@ public class ViewConfiguration { DEFAULT_KEY_REPEAT_DELAY_MS); } /** * Returns the duration in milliseconds of the text cursor blink interval, which is the elapsed * time between inversions of the color of the text cursor's pixels. * * <p>The value is user-configurable and is constrained to the following range: * <ul> * <li>0 (don't blink) * <li>>= 333 (fast blink, the minimum blink interval that is comfortable for * photosensitivity) * </ul> * * @return the duration in milliseconds of the text cursor blink interval */ @FlaggedApi(android.view.accessibility.Flags.FLAG_TEXT_CURSOR_BLINK_INTERVAL) public int getTextCursorBlinkIntervalMillis() { int value = AppGlobals.getIntCoreSetting( Settings.Secure.ACCESSIBILITY_TEXT_CURSOR_BLINK_INTERVAL_MS, sResourceCache.getDefaultTextCursorBlinkInterval()); int noBlink = sResourceCache.getNoBlinkTextCursorBlinkInterval(); int minBlink = sResourceCache.getMinTextCursorBlinkInterval(); if (value <= noBlink) { // Treat any negative value as no-blink. return noBlink; } else if (value <= minBlink) { // Constrain non-zero blink interval to >= minimum blink (333 ms). return minBlink; } return value; } /** * @return the duration in milliseconds we will wait to see if a touch event * is a tap or a scroll. If the user does not move within this interval, it is Loading Loading @@ -1557,6 +1619,9 @@ public class ViewConfiguration { private long mZoomControlsTimeout = -1L; private float mScrollFriction = -1f; private long mDefaultActionModeHideDuration = -1L; private int mDefaultTextCursorBlinkInterval = -1; private int mMinTextCursorBlinkInterval = -1; private int mNoBlinkTextCursorBlinkInterval = -1; public int getPressedStateDuration() { if (mPressedStateDuration < 0) { Loading Loading @@ -1648,6 +1713,43 @@ public class ViewConfiguration { return mDefaultActionModeHideDuration; } public int getDefaultTextCursorBlinkInterval() { if (mDefaultTextCursorBlinkInterval < 0) { Resources resources = getCurrentResources(); mDefaultTextCursorBlinkInterval = resources != null ? resources.getInteger( R.integer.def_accessibility_text_cursor_blink_interval_ms) : DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS; } return mDefaultTextCursorBlinkInterval; } public int getNoBlinkTextCursorBlinkInterval() { if (mNoBlinkTextCursorBlinkInterval < 0) { Resources resources = getCurrentResources(); mNoBlinkTextCursorBlinkInterval = resources != null ? resources.getInteger( R.integer.no_blink_accessibility_text_cursor_blink_interval_ms) : NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS; } return mNoBlinkTextCursorBlinkInterval; } public int getMinTextCursorBlinkInterval() { if (mMinTextCursorBlinkInterval < 0) { mMinTextCursorBlinkInterval = MIN_TEXT_CURSOR_BLINK_INTERVAL_MS; Resources resources = getCurrentResources(); if (resources != null) { int[] textCursorBlinkIntervals = resources.getIntArray( R.array.accessibility_text_cursor_blink_intervals); if (textCursorBlinkIntervals.length > 0) { mMinTextCursorBlinkInterval = textCursorBlinkIntervals[0]; } } } return mMinTextCursorBlinkInterval; } private static Resources getCurrentResources() { if (!android.companion.virtualdevice.flags.Flags .migrateViewconfigurationConstantsToResources()) { Loading
core/java/android/widget/Editor.java +32 −6 Original line number Diff line number Diff line Loading @@ -183,7 +183,6 @@ public class Editor { private static final int DELAY_BEFORE_HANDLE_FADES_OUT = 4000; private static final int RECENT_CUT_COPY_DURATION_MS = 15 * 1000; // 15 seconds in millis static final int BLINK = 500; private static final int DRAG_SHADOW_MAX_TEXT_LENGTH = 20; private static final int UNSET_X_VALUE = -1; private static final int UNSET_LINE = -1; Loading Loading @@ -340,6 +339,7 @@ public class Editor { private long mShowCursor; private boolean mRenderCursorRegardlessTiming; private Blink mBlink; private int mBlinkInterval = ViewConfiguration.DEFAULT_TEXT_CURSOR_BLINK_INTERVAL_MS; // Whether to let magnifier draw cursor on its surface. This is for floating cursor effect. // And it can only be true when |mNewMagnifierEnabled| is true. Loading Loading @@ -525,6 +525,11 @@ public class Editor { mLineChangeSlopMin = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, LINE_CHANGE_SLOP_MIN_DP, mTextView.getContext().getResources().getDisplayMetrics()); if (android.view.accessibility.Flags.textCursorBlinkInterval()) { mBlinkInterval = ViewConfiguration.get(mTextView.getContext()) .getTextCursorBlinkIntervalMillis(); } } @VisibleForTesting Loading Loading @@ -552,6 +557,16 @@ public class Editor { mFlagInsertionHandleGesturesEnabled = enabled; } @VisibleForTesting public void setTextCursorBlinkIntervalMs(int intervalMs) { mBlinkInterval = intervalMs; } @VisibleForTesting public void setShowCursorTime(long time) { mShowCursor = time; } // Lazy creates the magnifier animator. private MagnifierMotionAnimator getMagnifierAnimator() { if (FLAG_USE_MAGNIFIER && mMagnifierAnimator == null) { Loading Loading @@ -982,15 +997,20 @@ public class Editor { return mCursorVisible && mTextView.isTextEditable(); } boolean shouldRenderCursor() { /** * Return true if the cursor should be rendered, false otherwise. */ @VisibleForTesting public boolean shouldRenderCursor() { if (!isCursorVisible()) { return false; } if (mRenderCursorRegardlessTiming) { if (mRenderCursorRegardlessTiming || mBlinkInterval == ViewConfiguration.NO_BLINK_TEXT_CURSOR_BLINK_INTERVAL_MS) { return true; } final long showCursorDelta = SystemClock.uptimeMillis() - mShowCursor; return showCursorDelta % (2 * BLINK) < BLINK; return showCursorDelta % (2L * mBlinkInterval) < mBlinkInterval; } void prepareCursorControllers() { Loading Loading @@ -1103,6 +1123,12 @@ public class Editor { if (mBlink != null) { mBlink.uncancel(); } if (android.view.accessibility.Flags.textCursorBlinkInterval()) { mBlinkInterval = ViewConfiguration.get(mTextView.getContext()) .getTextCursorBlinkIntervalMillis(); } // Moving makeBlink outside of the null check block ensures that mBlink object gets // instantiated when the view is added to the window if mBlink is still null. makeBlink(); Loading Loading @@ -2969,7 +2995,7 @@ public class Editor { // resume blinking unless uncancelled. mBlink.uncancel(); mTextView.removeCallbacks(mBlink); mTextView.postDelayed(mBlink, BLINK); mTextView.postDelayed(mBlink, mBlinkInterval); } else { if (mBlink != null) mTextView.removeCallbacks(mBlink); } Loading Loading @@ -3001,7 +3027,7 @@ public class Editor { mTextView.invalidateCursorPath(); } mTextView.postDelayed(this, BLINK); mTextView.postDelayed(this, mBlinkInterval); } } Loading
core/res/res/values/arrays.xml +18 −0 Original line number Diff line number Diff line Loading @@ -233,4 +233,22 @@ <string-array name="demo_device_provisioning_known_signers"> <item>@string/config_retailDemoPackageSignature</item> </string-array> <!-- Non-zero text cursor blink intervals. The first value in the array is the minimum allowable blink interval. This array must adhere to the following constraints: 1) there is at least one value 2) the values are in ascending order. Keep in sync with ViewConfiguration. --> <integer-array name="accessibility_text_cursor_blink_intervals"> <item>333</item> <item>357</item> <item>385</item> <item>417</item> <item>455</item> <item>500</item> <item>556</item> <item>625</item> <item>714</item> <item>833</item> <item>1000</item> </integer-array> </resources>