Fix for A11y Service bug regarding large parcel volumes

Bug: 282016107
Test: atest AccessibilityEndToEndTest#testInstallAppWithLargeServiceVolume_displaysServicesSuccessfully

Change-Id: Id2013ba1200aab98e4c0534ff3242d2ed7522055
This commit is contained in:
Riley Jones
2023-06-07 23:29:12 +00:00
parent 0fdc0ad3a3
commit 22a7cab159
6 changed files with 18 additions and 10 deletions

View File

@@ -848,7 +848,7 @@ public final class AccessibilityManager {
List<AccessibilityServiceInfo> services = null;
try {
services = service.getInstalledAccessibilityServiceList(userId);
services = service.getInstalledAccessibilityServiceList(userId).getList();
if (DEBUG) {
Log.i(LOG_TAG, "Installed AccessibilityServices " + services);
}

View File

@@ -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<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
ParceledListSlice<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId);
@UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList(int feedbackType, int userId);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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 =

View File

@@ -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<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId) {
public ParceledListSlice<AccessibilityServiceInfo> 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