Loading services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +26 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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( Loading services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -221,6 +223,7 @@ class AccessibilityUserState { mFocusStrokeWidth = mFocusStrokeWidthDefaultValue; mFocusColor = mFocusColorDefaultValue; mMagnificationFollowTypingEnabled = true; mAlwaysOnMagnificationEnabled = false; mUiContrast = CONTRAST_NOT_SET; } Loading Loading @@ -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:{"); Loading Loading @@ -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. * Loading services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +13 −0 Original line number Diff line number Diff line Loading @@ -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); Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +37 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ public class AccessibilityUserStateTest { assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked()); assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked()); assertTrue(mUserState.isMagnificationFollowTypingEnabled()); assertFalse(mUserState.isAlwaysOnMagnificationEnabled()); } @Test Loading Loading @@ -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 Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +26 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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( Loading
services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java +13 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -221,6 +223,7 @@ class AccessibilityUserState { mFocusStrokeWidth = mFocusStrokeWidthDefaultValue; mFocusColor = mFocusColorDefaultValue; mMagnificationFollowTypingEnabled = true; mAlwaysOnMagnificationEnabled = false; mUiContrast = CONTRAST_NOT_SET; } Loading Loading @@ -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:{"); Loading Loading @@ -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. * Loading
services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +13 −0 Original line number Diff line number Diff line Loading @@ -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); Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityManagerServiceTest.java +37 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading
services/tests/servicestests/src/com/android/server/accessibility/AccessibilityUserStateTest.java +10 −0 Original line number Diff line number Diff line Loading @@ -179,6 +179,7 @@ public class AccessibilityUserStateTest { assertEquals(mFocusStrokeWidthDefaultValue, mUserState.getFocusStrokeWidthLocked()); assertEquals(mFocusColorDefaultValue, mUserState.getFocusColorLocked()); assertTrue(mUserState.isMagnificationFollowTypingEnabled()); assertFalse(mUserState.isAlwaysOnMagnificationEnabled()); } @Test Loading Loading @@ -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