summaryrefslogtreecommitdiff
path: root/services/accessibility/java
diff options
context:
space:
mode:
author Katie Dektar <katydek@google.com> 2025-01-28 16:50:01 +0000
committer Katie Dektar <katydek@google.com> 2025-01-29 20:48:22 +0000
commit4b515bb25406850d29620d3b718f455bbc956196 (patch)
tree6e75c3dffb1b4797a2d3b41c1f519d534d6216ff /services/accessibility/java
parentd8c4e73baae9d7f7c9a25e3d187bfb21d51fb2ad (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')
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java36
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java29
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;