From 22a7cab159be20a052fb258b622c3b1a20f7f799 Mon Sep 17 00:00:00 2001 From: Riley Jones Date: Wed, 7 Jun 2023 23:29:12 +0000 Subject: [PATCH] Fix for A11y Service bug regarding large parcel volumes Bug: 282016107 Test: atest AccessibilityEndToEndTest#testInstallAppWithLargeServiceVolume_displaysServicesSuccessfully Change-Id: Id2013ba1200aab98e4c0534ff3242d2ed7522055 --- .../view/accessibility/AccessibilityManager.java | 2 +- .../view/accessibility/IAccessibilityManager.aidl | 3 ++- .../accessibility/AccessibilityManagerTest.java | 3 ++- .../AccessibilityShortcutChooserActivityTest.java | 4 +++- .../AccessibilityShortcutControllerTest.java | 3 ++- .../accessibility/AccessibilityManagerService.java | 13 ++++++++----- 6 files changed, 18 insertions(+), 10 deletions(-) diff --git a/core/java/android/view/accessibility/AccessibilityManager.java b/core/java/android/view/accessibility/AccessibilityManager.java index 11b0d5ffd092e..b220c4d0c7638 100644 --- a/core/java/android/view/accessibility/AccessibilityManager.java +++ b/core/java/android/view/accessibility/AccessibilityManager.java @@ -848,7 +848,7 @@ public final class AccessibilityManager { List services = null; try { - services = service.getInstalledAccessibilityServiceList(userId); + services = service.getInstalledAccessibilityServiceList(userId).getList(); if (DEBUG) { Log.i(LOG_TAG, "Installed AccessibilityServices " + services); } diff --git a/core/java/android/view/accessibility/IAccessibilityManager.aidl b/core/java/android/view/accessibility/IAccessibilityManager.aidl index 390503b80badf..7a1112f1446fb 100644 --- a/core/java/android/view/accessibility/IAccessibilityManager.aidl +++ b/core/java/android/view/accessibility/IAccessibilityManager.aidl @@ -21,6 +21,7 @@ import android.accessibilityservice.AccessibilityServiceInfo; import android.accessibilityservice.IAccessibilityServiceConnection; import android.accessibilityservice.IAccessibilityServiceClient; import android.content.ComponentName; +import android.content.pm.ParceledListSlice; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.IAccessibilityInteractionConnection; @@ -47,7 +48,7 @@ interface IAccessibilityManager { boolean removeClient(IAccessibilityManagerClient client, int userId); - List getInstalledAccessibilityServiceList(int userId); + ParceledListSlice getInstalledAccessibilityServiceList(int userId); @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) List getEnabledAccessibilityServiceList(int feedbackType, int userId); diff --git a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java index 7cbf3ffa509cc..84252f97d8e5f 100644 --- a/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java +++ b/core/tests/coretests/src/android/view/accessibility/AccessibilityManagerTest.java @@ -32,6 +32,7 @@ import android.app.Instrumentation; import android.app.PendingIntent; import android.app.RemoteAction; import android.content.Intent; +import android.content.pm.ParceledListSlice; import android.graphics.drawable.Icon; import android.os.UserHandle; @@ -135,7 +136,7 @@ public class AccessibilityManagerTest { // configure the mock service behavior when(mMockService.getInstalledAccessibilityServiceList(anyInt())) - .thenReturn(expectedServices); + .thenReturn(new ParceledListSlice<>(expectedServices)); // invoke the method under test AccessibilityManager manager = createManager(true); diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java index 57a1376a6cd1e..681ba9c353e55 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutChooserActivityTest.java @@ -43,6 +43,7 @@ import android.content.ComponentName; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.os.Handler; @@ -111,7 +112,8 @@ public class AccessibilityShortcutChooserActivityTest { when(mResolveInfo.loadLabel(any(PackageManager.class))).thenReturn(TEST_LABEL); when(mAccessibilityServiceInfo.getComponentName()).thenReturn(TEST_COMPONENT_NAME); when(mAccessibilityManagerService.getInstalledAccessibilityServiceList( - anyInt())).thenReturn(Collections.singletonList(mAccessibilityServiceInfo)); + anyInt())).thenReturn(new ParceledListSlice<>( + Collections.singletonList(mAccessibilityServiceInfo))); when(mAccessibilityManagerService.isAccessibilityTargetAllowed( anyString(), anyInt(), anyInt())).thenReturn(true); TestAccessibilityShortcutChooserActivity.setupForTesting(mAccessibilityManagerService); diff --git a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java index 9763679c7ad98..2de1230cf7067 100644 --- a/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java +++ b/core/tests/coretests/src/com/android/internal/accessibility/AccessibilityShortcutControllerTest.java @@ -55,6 +55,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.content.res.Resources; @@ -150,7 +151,7 @@ public class AccessibilityShortcutControllerTest { when(mContext.getContentResolver()).thenReturn(mContentResolver); when(mAccessibilityManagerService.getInstalledAccessibilityServiceList(anyInt())) - .thenReturn(Collections.singletonList(mServiceInfo)); + .thenReturn(new ParceledListSlice<>(Collections.singletonList(mServiceInfo))); // Use the extra level of indirection in the object to mock framework objects AccessibilityManager accessibilityManager = diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 21986b73c8084..466cda3f21314 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -74,6 +74,7 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.pm.PackageManager; import android.content.pm.PackageManagerInternal; +import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.content.pm.ServiceInfo; import android.database.ContentObserver; @@ -1250,7 +1251,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } @Override - public List getInstalledAccessibilityServiceList(int userId) { + public ParceledListSlice getInstalledAccessibilityServiceList( + int userId) { if (mTraceManager.isA11yTracingEnabledForTypes(FLAGS_ACCESSIBILITY_MANAGER)) { mTraceManager.logTrace(LOG_TAG + ".getInstalledAccessibilityServiceList", FLAGS_ACCESSIBILITY_MANAGER, "userId=" + userId); @@ -1262,8 +1264,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub final int deviceId = mProxyManager.getFirstDeviceIdForUidLocked( Binder.getCallingUid()); if (mProxyManager.isProxyedDeviceId(deviceId)) { - return mProxyManager.getInstalledAndEnabledServiceInfosLocked( - AccessibilityServiceInfo.FEEDBACK_ALL_MASK, deviceId); + return new ParceledListSlice<>( + mProxyManager.getInstalledAndEnabledServiceInfosLocked( + AccessibilityServiceInfo.FEEDBACK_ALL_MASK, deviceId)); } // We treat calls from a profile as if made by its parent as profiles // share the accessibility state of the parent. The call below @@ -1275,7 +1278,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub } if (Binder.getCallingPid() == OWN_PROCESS_ID) { - return serviceInfos; + return new ParceledListSlice<>(serviceInfos); } final PackageManagerInternal pm = LocalServices.getService( PackageManagerInternal.class); @@ -1287,7 +1290,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub serviceInfos.remove(i); } } - return serviceInfos; + return new ParceledListSlice<>(serviceInfos); } @Override