Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 12ce1533 authored by Amanda Lin Dietz's avatar Amanda Lin Dietz Committed by Android (Google) Code Review
Browse files

Merge "[Blinking Text Cursor Setting] Add ViewConfiguration API for getting...

Merge "[Blinking Text Cursor Setting] Add ViewConfiguration API for getting text cursor blink interval from Settings" into main
parents dbce09e3 55b77b43
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -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();
+11 −0
Original line number Diff line number Diff line
@@ -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)
         *
+102 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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) {
@@ -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()) {
+32 −6
Original line number Diff line number Diff line
@@ -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;
@@ -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.
@@ -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
@@ -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) {
@@ -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() {
@@ -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();
@@ -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);
        }
@@ -3001,7 +3027,7 @@ public class Editor {
                    mTextView.invalidateCursorPath();
                }

                mTextView.postDelayed(this, BLINK);
                mTextView.postDelayed(this, mBlinkInterval);
            }
        }

+18 −0
Original line number Diff line number Diff line
@@ -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