diff options
-rw-r--r-- | services/accessibility/accessibility.aconfig | 10 | ||||
-rw-r--r-- | services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java | 80 |
2 files changed, 59 insertions, 31 deletions
diff --git a/services/accessibility/accessibility.aconfig b/services/accessibility/accessibility.aconfig index a754ba547767..69efdf65bb94 100644 --- a/services/accessibility/accessibility.aconfig +++ b/services/accessibility/accessibility.aconfig @@ -83,6 +83,16 @@ flag { } flag { + name: "manager_avoid_receiver_timeout" + namespace: "accessibility" + description: "Avoid broadcast receiver timeout by offloading potentially slow operations to the background thread." + bug: "333890389" + metadata { + purpose: PURPOSE_BUGFIX + } +} + +flag { name: "pinch_zoom_zero_min_span" namespace: "accessibility" description: "Whether to set min span of ScaleGestureDetector to zero." diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index cbb66dc18f28..ab55eb7a11ac 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -1028,37 +1028,10 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub "context=" + context + ";intent=" + intent); } - String action = intent.getAction(); - if (Intent.ACTION_USER_SWITCHED.equals(action)) { - switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); - } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) { - unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); - } else if (Intent.ACTION_USER_REMOVED.equals(action)) { - removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); - } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) { - final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME); - if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) { - synchronized (mLock) { - restoreEnabledAccessibilityServicesLocked( - intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE), - intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE), - intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, - 0)); - } - } else if (ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(which)) { - synchronized (mLock) { - restoreLegacyDisplayMagnificationNavBarIfNeededLocked( - intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE), - intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, - 0)); - } - } else if (Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS.equals(which)) { - synchronized (mLock) { - restoreAccessibilityButtonTargetsLocked( - intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE), - intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE)); - } - } + if (com.android.server.accessibility.Flags.managerAvoidReceiverTimeout()) { + BackgroundThread.getHandler().post(() -> processBroadcast(intent)); + } else { + processBroadcast(intent); } } }, UserHandle.ALL, intentFilter, null, null); @@ -1981,6 +1954,19 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub mA11yWindowManager.onTouchInteractionEnd(); } + private void processBroadcast(Intent intent) { + String action = intent.getAction(); + if (Intent.ACTION_USER_SWITCHED.equals(action)) { + switchUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + } else if (Intent.ACTION_USER_UNLOCKED.equals(action)) { + unlockUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + } else if (Intent.ACTION_USER_REMOVED.equals(action)) { + removeUser(intent.getIntExtra(Intent.EXTRA_USER_HANDLE, 0)); + } else if (Intent.ACTION_SETTING_RESTORED.equals(action)) { + restoreSetting(intent); + } + } + @VisibleForTesting void switchUser(int userId) { mMagnificationController.updateUserIdIfNeeded(userId); @@ -2079,6 +2065,38 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub getMagnificationController().onUserRemoved(userId); } + private void restoreSetting(Intent intent) { + final String which = intent.getStringExtra(Intent.EXTRA_SETTING_NAME); + if (Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES.equals(which)) { + synchronized (mLock) { + restoreEnabledAccessibilityServicesLocked( + intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE), + intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE), + intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, + 0)); + } + } else if (ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED.equals(which)) { + synchronized (mLock) { + restoreLegacyDisplayMagnificationNavBarIfNeededLocked( + intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE), + intent.getIntExtra(Intent.EXTRA_SETTING_RESTORED_FROM_SDK_INT, + 0)); + } + } else if (Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS.equals(which)) { + synchronized (mLock) { + restoreAccessibilityButtonTargetsLocked( + intent.getStringExtra(Intent.EXTRA_SETTING_PREVIOUS_VALUE), + intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE)); + } + } else if (Settings.Secure.ACCESSIBILITY_QS_TARGETS.equals(which)) { + if (!android.view.accessibility.Flags.a11yQsShortcut()) { + return; + } + restoreAccessibilityQsTargets( + intent.getStringExtra(Intent.EXTRA_SETTING_NEW_VALUE)); + } + } + // Called only during settings restore; currently supports only the owner user // TODO: http://b/22388012 void restoreEnabledAccessibilityServicesLocked(String oldSetting, String newSetting, |