diff options
| author | 2025-01-28 16:50:01 +0000 | |
|---|---|---|
| committer | 2025-01-29 20:48:22 +0000 | |
| commit | 4b515bb25406850d29620d3b718f455bbc956196 (patch) | |
| tree | 6e75c3dffb1b4797a2d3b41c1f519d534d6216ff /services/accessibility/java | |
| parent | d8c4e73baae9d7f7c9a25e3d187bfb21d51fb2ad (diff) | |
Magnification continuous zooming/panning uses repeat keys settings
Magnification allows continuous zoom/pan control only when repeat
keys is enabled, and matches the initial timeout before behavior
repeats to repeat keys timeout.
Test: atest MagnificationControllerTest, AccessibilityManagerServiceTest, manual
Bug: b/388847283
Flag: com.android.server.accessibility.enable_magnification_keyboard_control
Change-Id: I90347125dca7beece53dad3a65469869e9084360
Diffstat (limited to 'services/accessibility/java')
2 files changed, 54 insertions, 11 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 8e0a7785c597..67fdca446ba4 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -36,6 +36,7 @@ import static android.accessibilityservice.AccessibilityTrace.FLAGS_PACKAGE_BROA import static android.accessibilityservice.AccessibilityTrace.FLAGS_USER_BROADCAST_RECEIVER; import static android.accessibilityservice.AccessibilityTrace.FLAGS_WINDOW_MANAGER_INTERNAL; import static android.content.Context.DEVICE_ID_DEFAULT; +import static android.hardware.input.InputSettings.isRepeatKeysFeatureFlagEnabled; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_FLOATING_MENU; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_GESTURE; import static android.provider.Settings.Secure.ACCESSIBILITY_BUTTON_MODE_NAVIGATION_BAR; @@ -156,6 +157,7 @@ import android.view.KeyEvent; import android.view.MagnificationSpec; import android.view.MotionEvent; import android.view.SurfaceControl; +import android.view.ViewConfiguration; import android.view.WindowInfo; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; @@ -3494,6 +3496,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub somethingChanged |= readMagnificationFollowTypingLocked(userState); somethingChanged |= readAlwaysOnMagnificationLocked(userState); somethingChanged |= readMouseKeysEnabledLocked(userState); + somethingChanged |= readRepeatKeysSettingsLocked(userState); return somethingChanged; } @@ -5771,6 +5774,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub private final Uri mUserSetupCompleteUri = Settings.Secure.getUriFor( Settings.Secure.USER_SETUP_COMPLETE); + private final Uri mRepeatKeysEnabledUri = Settings.Secure.getUriFor( + Settings.Secure.KEY_REPEAT_ENABLED); + + private final Uri mRepeatKeysTimeoutMsUri = Settings.Secure.getUriFor( + Settings.Secure.KEY_REPEAT_TIMEOUT_MS); + public AccessibilityContentObserver(Handler handler) { super(handler); } @@ -5827,6 +5836,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mNavigationModeUri, false, this, UserHandle.USER_ALL); contentResolver.registerContentObserver( mUserSetupCompleteUri, false, this, UserHandle.USER_ALL); + if (isRepeatKeysFeatureFlagEnabled() && Flags.enableMagnificationKeyboardControl()) { + contentResolver.registerContentObserver( + mRepeatKeysEnabledUri, false, this, UserHandle.USER_ALL); + contentResolver.registerContentObserver( + mRepeatKeysTimeoutMsUri, false, this, UserHandle.USER_ALL); + } } @Override @@ -5917,6 +5932,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } } else if (mNavigationModeUri.equals(uri) || mUserSetupCompleteUri.equals(uri)) { updateShortcutsForCurrentNavigationMode(); + } else if (mRepeatKeysEnabledUri.equals(uri) + || mRepeatKeysTimeoutMsUri.equals(uri)) { + readRepeatKeysSettingsLocked(userState); } } } @@ -6055,6 +6073,24 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub return false; } + boolean readRepeatKeysSettingsLocked(AccessibilityUserState userState) { + if (!isRepeatKeysFeatureFlagEnabled() || !Flags.enableMagnificationKeyboardControl()) { + return false; + } + final boolean isRepeatKeysEnabled = Settings.Secure.getIntForUser( + mContext.getContentResolver(), + Settings.Secure.KEY_REPEAT_ENABLED, + 1, userState.mUserId) == 1; + final int repeatKeysTimeoutMs = Settings.Secure.getIntForUser( + mContext.getContentResolver(), Settings.Secure.KEY_REPEAT_TIMEOUT_MS, + ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT, userState.mUserId); + mMagnificationController.setRepeatKeysEnabled(isRepeatKeysEnabled); + mMagnificationController.setRepeatKeysTimeoutMs(repeatKeysTimeoutMs); + + // No need to update any other state, so always return false. + return false; + } + boolean readMouseKeysEnabledLocked(AccessibilityUserState userState) { if (!keyboardA11yMouseKeys()) { return false; diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 486f1f449691..e757dd5a77b7 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -50,6 +50,7 @@ import android.util.SparseIntArray; import android.util.SparseLongArray; import android.util.TypedValue; import android.view.Display; +import android.view.ViewConfiguration; import android.view.accessibility.MagnificationAnimationCallback; import com.android.internal.accessibility.util.AccessibilityStatsLogUtils; @@ -122,9 +123,8 @@ public class MagnificationController implements MagnificationConnectionManager.C private @ZoomDirection int mActiveZoomDirection = ZOOM_DIRECTION_IN; private int mActiveZoomDisplay = Display.INVALID_DISPLAY; - // TODO(b/355499907): Get initial repeat interval from repeat keys settings. - @VisibleForTesting - public static final int INITIAL_KEYBOARD_REPEAT_INTERVAL_MS = 500; + private int mInitialKeyboardRepeatIntervalMs = + ViewConfiguration.DEFAULT_LONG_PRESS_TIMEOUT; @VisibleForTesting public static final int KEYBOARD_REPEAT_INTERVAL_MS = 60; @@ -321,12 +321,6 @@ public class MagnificationController implements MagnificationConnectionManager.C mAlwaysOnMagnificationFeatureFlag = new AlwaysOnMagnificationFeatureFlag(context); mAlwaysOnMagnificationFeatureFlag.addOnChangedListener( mBackgroundExecutor, mAms::updateAlwaysOnMagnification); - - // TODO(b/355499907): Add an observer for repeat keys enabled changes, - // rather than initializing once at startup. - mRepeatKeysEnabled = Settings.Secure.getIntForUser( - mContext.getContentResolver(), Settings.Secure.KEY_REPEAT_ENABLED, 1, - UserHandle.USER_CURRENT) != 0; } @VisibleForTesting @@ -383,7 +377,7 @@ public class MagnificationController implements MagnificationConnectionManager.C if (mRepeatKeysEnabled) { mHandler.sendMessageDelayed( PooledLambda.obtainMessage(MagnificationController::maybeContinuePan, this), - INITIAL_KEYBOARD_REPEAT_INTERVAL_MS); + mInitialKeyboardRepeatIntervalMs); } } @@ -404,7 +398,7 @@ public class MagnificationController implements MagnificationConnectionManager.C if (mRepeatKeysEnabled) { mHandler.sendMessageDelayed( PooledLambda.obtainMessage(MagnificationController::maybeContinueZoom, this), - INITIAL_KEYBOARD_REPEAT_INTERVAL_MS); + mInitialKeyboardRepeatIntervalMs); } } @@ -434,6 +428,19 @@ public class MagnificationController implements MagnificationConnectionManager.C } } + public void setRepeatKeysEnabled(boolean isRepeatKeysEnabled) { + mRepeatKeysEnabled = isRepeatKeysEnabled; + } + + public void setRepeatKeysTimeoutMs(int repeatKeysTimeoutMs) { + mInitialKeyboardRepeatIntervalMs = repeatKeysTimeoutMs; + } + + @VisibleForTesting + public int getInitialKeyboardRepeatIntervalMs() { + return mInitialKeyboardRepeatIntervalMs; + } + private void handleUserInteractionChanged(int displayId, int mode) { if (mMagnificationCapabilities != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_ALL) { return; |