summaryrefslogtreecommitdiff
path: root/services/accessibility
diff options
context:
space:
mode:
authorRhed Jao <rhedjao@google.com>2020-05-14 20:43:17 +0800
committerRhed Jao <rhedjao@google.com>2020-05-14 21:14:43 +0800
commit2d8bdb146ab3b273fffe6a970b20731ea4bb06db (patch)
treec46dac37567ea77f7094fcc5dbcdb73ec30e61b5 /services/accessibility
parent4b510ab9b8bebea3e7aca985e7e3d7af42c55ef9 (diff)
Removes shortcut target when an a11y service is unbound
The accessibility button and shortcut target is updated by the Settings app when the user turn on/off the a11y service. It worked fine before an a11y service disables and turns off itself using disableSelf api. The accessibility button and shortcut settings can not get update in this case. Removes shortcut target if an a11y service is unbound to fix this issue. Bug: 156237174 Test: atest AccessibilityShortcutTest Change-Id: Ie15f7fe06644bd35d30d87383b25df81bf29056d
Diffstat (limited to 'services/accessibility')
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java31
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java19
2 files changed, 50 insertions, 0 deletions
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 6d848d17eb70..c6243c7042cd 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -1540,6 +1540,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
} else {
if (service != null) {
service.unbindLocked();
+ removeShortcutTargetForUnboundServiceLocked(userState, service);
}
}
}
@@ -2314,6 +2315,36 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
scheduleNotifyClientsOfServicesStateChangeLocked(userState);
}
+ /**
+ * Remove the shortcut target for the unbound service which is requesting accessibility button
+ * and targeting sdk > Q from the accessibility button and shortcut.
+ *
+ * @param userState The accessibility user state.
+ * @param service The unbound service.
+ */
+ private void removeShortcutTargetForUnboundServiceLocked(AccessibilityUserState userState,
+ AccessibilityServiceConnection service) {
+ if (!service.mRequestAccessibilityButton
+ || service.getServiceInfo().getResolveInfo().serviceInfo.applicationInfo
+ .targetSdkVersion <= Build.VERSION_CODES.Q) {
+ return;
+ }
+ final ComponentName serviceName = service.getComponentName();
+ if (userState.removeShortcutTargetLocked(ACCESSIBILITY_SHORTCUT_KEY, serviceName)) {
+ final Set<String> currentTargets = userState.getShortcutTargetsLocked(
+ ACCESSIBILITY_SHORTCUT_KEY);
+ persistColonDelimitedSetToSettingLocked(
+ Settings.Secure.ACCESSIBILITY_SHORTCUT_TARGET_SERVICE,
+ userState.mUserId, currentTargets, str -> str);
+ }
+ if (userState.removeShortcutTargetLocked(ACCESSIBILITY_BUTTON, serviceName)) {
+ final Set<String> currentTargets = userState.getShortcutTargetsLocked(
+ ACCESSIBILITY_BUTTON);
+ persistColonDelimitedSetToSettingLocked(Settings.Secure.ACCESSIBILITY_BUTTON_TARGETS,
+ userState.mUserId, currentTargets, str -> str);
+ }
+ }
+
private void updateRecommendedUiTimeoutLocked(AccessibilityUserState userState) {
int newNonInteractiveUiTimeout = userState.getUserNonInteractiveUiTimeoutLocked();
int newInteractiveUiTimeout = userState.getUserInteractiveUiTimeoutLocked();
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index bad649ab6b02..43bb4b384bb2 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -631,6 +631,25 @@ class AccessibilityUserState {
}
/**
+ * Removes given shortcut target in the list.
+ *
+ * @param shortcutType The shortcut type.
+ * @param target The component name of the shortcut target.
+ * @return true if the shortcut target is removed.
+ */
+ public boolean removeShortcutTargetLocked(@ShortcutType int shortcutType,
+ ComponentName target) {
+ return getShortcutTargetsLocked(shortcutType).removeIf(name -> {
+ ComponentName componentName;
+ if (name == null
+ || (componentName = ComponentName.unflattenFromString(name)) == null) {
+ return false;
+ }
+ return componentName.equals(target);
+ });
+ }
+
+ /**
* Returns installed accessibility service info by the given service component name.
*/
public AccessibilityServiceInfo getInstalledServiceInfoLocked(ComponentName componentName) {