summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/accessibility/AccessibilityManager.java19
-rw-r--r--core/java/android/view/accessibility/IAccessibilityManager.aidl2
-rw-r--r--core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java7
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java36
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java10
5 files changed, 74 insertions, 0 deletions
diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java
index fc9e5e2ef04e..f9cdbd322c26 100644
--- a/core/java/android/view/accessibility/AccessibilityManager.java
+++ b/core/java/android/view/accessibility/AccessibilityManager.java
@@ -517,6 +517,25 @@ public final class AccessibilityManager {
}
/**
+ * Unregisters the IAccessibilityManagerClient from the backing service
+ * @hide
+ */
+ public boolean removeClient() {
+ synchronized (mLock) {
+ IAccessibilityManager service = getServiceLocked();
+ if (service == null) {
+ return false;
+ }
+ try {
+ return service.removeClient(mClient, mUserId);
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "AccessibilityManagerService is dead", re);
+ }
+ }
+ return false;
+ }
+
+ /**
* @hide
*/
@VisibleForTesting
diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl
index c71ea53c414d..078ab25e8b6c 100644
--- a/core/java/android/view/accessibility/IAccessibilityManager.aidl
+++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl
@@ -42,6 +42,8 @@ interface IAccessibilityManager {
long addClient(IAccessibilityManagerClient client, int userId);
+ boolean removeClient(IAccessibilityManagerClient client, int userId);
+
List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
index 115c266aaae6..212fdcace6ac 100644
--- a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
+++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java
@@ -116,6 +116,13 @@ public class AccessibilityManagerTest {
}
@Test
+ public void testRemoveManager() throws Exception {
+ AccessibilityManager manager = createManager(WITH_A11Y_ENABLED);
+ manager.removeClient();
+ verify(mMockService).removeClient(manager.getClient(), UserHandle.USER_CURRENT);
+ }
+
+ @Test
public void testGetAccessibilityServiceList() throws Exception {
// create a list of installed accessibility services the mock service returns
List<AccessibilityServiceInfo> expectedServices = new ArrayList<>();
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index 9abe00fba98c..7eecc453a8ce 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -710,6 +710,34 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
@Override
+ public boolean removeClient(IAccessibilityManagerClient callback, int userId) {
+ // TODO(b/190216606): Add tracing for removeClient when implementation is the same in master
+
+ synchronized (mLock) {
+ final int resolvedUserId = mSecurityPolicy
+ .resolveCallingUserIdEnforcingPermissionsLocked(userId);
+
+ AccessibilityUserState userState = getUserStateLocked(resolvedUserId);
+ if (mSecurityPolicy.isCallerInteractingAcrossUsers(userId)) {
+ boolean unregistered = mGlobalClients.unregister(callback);
+ if (DEBUG) {
+ Slog.i(LOG_TAG,
+ "Removed global client for pid:" + Binder.getCallingPid() + "state: "
+ + unregistered);
+ }
+ return unregistered;
+ } else {
+ boolean unregistered = userState.mUserClients.unregister(callback);
+ if (DEBUG) {
+ Slog.i(LOG_TAG, "Removed user client for pid:" + Binder.getCallingPid()
+ + " and userId:" + resolvedUserId + "state: " + unregistered);
+ }
+ return unregistered;
+ }
+ }
+ }
+
+ @Override
public void sendAccessibilityEvent(AccessibilityEvent event, int userId) {
if (mTraceManager.isA11yTracingEnabled()) {
mTraceManager.logTrace(LOG_TAG + ".sendAccessibilityEvent",
@@ -3271,6 +3299,14 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
pw.println();
}
mA11yWindowManager.dump(fd, pw, args);
+ pw.println("Global client list info:{");
+ mGlobalClients.dump(pw, " Client list ");
+ pw.println(" Registered clients:{");
+ for (int i = 0; i < mGlobalClients.getRegisteredCallbackCount(); i++) {
+ AccessibilityManagerService.Client client = (AccessibilityManagerService.Client)
+ mGlobalClients.getRegisteredCallbackCookie(i);
+ pw.append(Arrays.toString(client.mPackageNames));
+ }
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
index df349c863128..0fde0de59c07 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityUserState.java
@@ -51,6 +51,7 @@ import com.android.internal.accessibility.AccessibilityShortcutController;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -573,6 +574,15 @@ class AccessibilityUserState {
pw.append(componentName.toShortString());
}
}
+ pw.println("}");
+ pw.println(" Client list info:{");
+ mUserClients.dump(pw, " Client list ");
+ pw.println(" Registered clients:{");
+ for (int i = 0; i < mUserClients.getRegisteredCallbackCount(); i++) {
+ AccessibilityManagerService.Client client = (AccessibilityManagerService.Client)
+ mUserClients.getRegisteredCallbackCookie(i);
+ pw.append(Arrays.toString(client.mPackageNames));
+ }
pw.println("}]");
}