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

Commit 24ecf022 authored by Roy Chou's avatar Roy Chou
Browse files

feat(#AlwaysOnMagnifier)!: Support always on feature in A11y controllers

Support always on feature in
MagnificationController/AccessibilityController/AccessibilityUserState.
It would check AlwaysOnMagnificationFeatureFlag and Settings to decide
whether to enable always on feature.

If both feature flag and settings preference are true, we would enable
the always on feature in FullScreenMagnificationController. Otherwise
the feature is disabled.

Bug: 146504200
Test: manual
      atest MagnificationControllerTest
      atest AccessibilityManagerServiceTest
      atest AccessibilityUserStateTest
Change-Id: Ie0ecf6276ac2323d05ddf6b185ba34d33bc8dd7d
parent 1286fd24
Loading
Loading
Loading
Loading
+26 −0
Original line number Diff line number Diff line
@@ -2725,6 +2725,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        somethingChanged |= readMagnificationModeForDefaultDisplayLocked(userState);
        somethingChanged |= readMagnificationCapabilitiesLocked(userState);
        somethingChanged |= readMagnificationFollowTypingLocked(userState);
        somethingChanged |= readAlwaysOnMagnificationLocked(userState);
        somethingChanged |= readUiContrastLocked(userState);
        return somethingChanged;
    }
@@ -4378,6 +4379,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        private final Uri mMagnificationFollowTypingUri = Settings.Secure.getUriFor(
                Settings.Secure.ACCESSIBILITY_MAGNIFICATION_FOLLOW_TYPING_ENABLED);

        // TODO: replace name with Settings Secure Key
        private final Uri mAlwaysOnMagnificationUri = Settings.Secure.getUriFor(
                "accessibility_magnification_always_on_enabled");

        private final Uri mUiContrastUri = Settings.Secure.getUriFor(
                CONTRAST_LEVEL);

@@ -4421,6 +4426,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    mMagnificationCapabilityUri, false, this, UserHandle.USER_ALL);
            contentResolver.registerContentObserver(
                    mMagnificationFollowTypingUri, false, this, UserHandle.USER_ALL);
            contentResolver.registerContentObserver(
                    mAlwaysOnMagnificationUri, false, this, UserHandle.USER_ALL);
            contentResolver.registerContentObserver(
                    mUiContrastUri, false, this, UserHandle.USER_ALL);
        }
@@ -4492,6 +4499,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
                    }
                } else if (mMagnificationFollowTypingUri.equals(uri)) {
                    readMagnificationFollowTypingLocked(userState);
                } else if (mAlwaysOnMagnificationUri.equals(uri)) {
                    readAlwaysOnMagnificationLocked(userState);
                } else if (mUiContrastUri.equals(uri)) {
                    if (readUiContrastLocked(userState)) {
                        updateUiContrastLocked(userState);
@@ -4605,6 +4614,23 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
        return false;
    }

    boolean readAlwaysOnMagnificationLocked(AccessibilityUserState userState) {
        // TODO: replace name const with Settings Secure Key
        final boolean isSettingsAlwaysOnEnabled = Settings.Secure.getIntForUser(
                mContext.getContentResolver(),
                "accessibility_magnification_always_on_enabled",
                0, userState.mUserId) == 1;
        final boolean isAlwaysOnFeatureFlagEnabled = mMagnificationController
                .isAlwaysOnMagnificationFeatureFlagEnabled();
        final boolean isAlwaysOnEnabled = isAlwaysOnFeatureFlagEnabled && isSettingsAlwaysOnEnabled;
        if (isAlwaysOnEnabled != userState.isAlwaysOnMagnificationEnabled()) {
            userState.setAlwaysOnMagnificationEnabled(isAlwaysOnEnabled);
            mMagnificationController.setAlwaysOnMagnificationEnabled(isAlwaysOnEnabled);
            return true;
        }
        return false;
    }

    @Override
    public void setGestureDetectionPassthroughRegion(int displayId, Region region) {
        mMainHandler.sendMessage(
+13 −0
Original line number Diff line number Diff line
@@ -136,6 +136,8 @@ class AccessibilityUserState {
    private int mMagnificationCapabilities = ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
    // Whether the following typing focus feature for magnification is enabled.
    private boolean mMagnificationFollowTypingEnabled = true;
    // Whether the always on magnification feature is enabled.
    private boolean mAlwaysOnMagnificationEnabled = false;

    /** The stroke width of the focus rectangle in pixels */
    private int mFocusStrokeWidth;
@@ -221,6 +223,7 @@ class AccessibilityUserState {
        mFocusStrokeWidth = mFocusStrokeWidthDefaultValue;
        mFocusColor = mFocusColorDefaultValue;
        mMagnificationFollowTypingEnabled = true;
        mAlwaysOnMagnificationEnabled = false;
        mUiContrast = CONTRAST_NOT_SET;
    }

@@ -531,6 +534,8 @@ class AccessibilityUserState {
                .append(String.valueOf(mIsAudioDescriptionByDefaultRequested));
        pw.append(", magnificationFollowTypingEnabled=")
                .append(String.valueOf(mMagnificationFollowTypingEnabled));
        pw.append(", alwaysOnMagnificationEnabled=")
                .append(String.valueOf(mAlwaysOnMagnificationEnabled));
        pw.append("}");
        pw.println();
        pw.append("     shortcut key:{");
@@ -711,6 +716,14 @@ class AccessibilityUserState {
        return mMagnificationFollowTypingEnabled;
    }

    public void setAlwaysOnMagnificationEnabled(boolean enabled) {
        mAlwaysOnMagnificationEnabled = enabled;
    }

    public boolean isAlwaysOnMagnificationEnabled() {
        return mAlwaysOnMagnificationEnabled;
    }

    /**
     * Sets the magnification mode to the given display.
     *
+13 −0
Original line number Diff line number Diff line
@@ -677,6 +677,19 @@ public class MagnificationController implements WindowMagnificationManager.Callb
        getFullScreenMagnificationController().setMagnificationFollowTypingEnabled(enabled);
    }

    /**
     * Called when the always on magnification feature is switched.
     *
     * @param enabled Enable the always on magnification feature
     */
    public void setAlwaysOnMagnificationEnabled(boolean enabled) {
        getFullScreenMagnificationController().setAlwaysOnMagnificationEnabled(enabled);
    }

    public boolean isAlwaysOnMagnificationFeatureFlagEnabled() {
        return AlwaysOnMagnificationFeatureFlag.isAlwaysOnMagnificationEnabled();
    }

    private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked(
            int displayId) {
        return mMagnificationEndRunnableSparseArray.get(displayId);
+37 −0
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import static com.google.common.truth.Truth.assertThat;

import static org.junit.Assert.assertThrows;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
@@ -438,6 +439,42 @@ public class AccessibilityManagerServiceTest {
        verify(mMockMagnificationController).setMagnificationFollowTypingEnabled(false);
    }

    @Test
    public void testSettingsAlwaysOn_setEnabled_featureFlagDisabled_doNothing() {
        when(mMockMagnificationController.isAlwaysOnMagnificationFeatureFlagEnabled())
                .thenReturn(false);

        final AccessibilityUserState userState = mA11yms.mUserStates.get(
                mA11yms.getCurrentUserIdLocked());
        Settings.Secure.putIntForUser(
                mTestableContext.getContentResolver(),
                // TODO: replace name with Settings Secure Key
                "accessibility_magnification_always_on_enabled",
                1, mA11yms.getCurrentUserIdLocked());

        mA11yms.readAlwaysOnMagnificationLocked(userState);

        verify(mMockMagnificationController, never()).setAlwaysOnMagnificationEnabled(anyBoolean());
    }

    @Test
    public void testSettingsAlwaysOn_setEnabled_featureFlagEnabled_propagateToController() {
        when(mMockMagnificationController.isAlwaysOnMagnificationFeatureFlagEnabled())
                .thenReturn(true);

        final AccessibilityUserState userState = mA11yms.mUserStates.get(
                mA11yms.getCurrentUserIdLocked());
        Settings.Secure.putIntForUser(
                mTestableContext.getContentResolver(),
                // TODO: replace name with Settings Secure Key
                "accessibility_magnification_always_on_enabled",
                1, mA11yms.getCurrentUserIdLocked());

        mA11yms.readAlwaysOnMagnificationLocked(userState);

        verify(mMockMagnificationController).setAlwaysOnMagnificationEnabled(eq(true));
    }

    @SmallTest
    @Test
    public void testOnClientChange_magnificationEnabledAndCapabilityAll_requestConnection() {
+10 −0
Original line number Diff line number Diff line
@@ -179,6 +179,7 @@ public class AccessibilityUserStateTest {
        assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked());
        assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked());
        assertTrue(mUserState.isMagnificationFollowTypingEnabled());
        assertFalse(mUserState.isAlwaysOnMagnificationEnabled());
    }

    @Test
@@ -389,6 +390,15 @@ public class AccessibilityUserStateTest {
        assertFalse(mUserState.isMagnificationFollowTypingEnabled());
    }

    @Test
    public void setAlwaysOnMagnificationEnabled_defaultFalseAndSetTrue_returnTrue() {
        assertFalse(mUserState.isAlwaysOnMagnificationEnabled());

        mUserState.setAlwaysOnMagnificationEnabled(true);

        assertTrue(mUserState.isAlwaysOnMagnificationEnabled());
    }

    @Test
    public void setFocusAppearanceData_returnExpectedFocusAppearanceData() {
        final int focusStrokeWidthValue = 100;
Loading