Improve the speed of AccessibilitySettings#containsTargetNameInList to

help reduce the a11y settings' cold start latency.

Bug: 327052480
Flag: EXEMPT bugfix low risk
Test: atest com.android.settings.accessibility
Test: manual (a11y settings page still shows up with correct content)
Change-Id: Ib9980756d88a218ebb10f17d6a3b0d9a406a0ddd
This commit is contained in:
Chun-Ku Lin
2024-06-07 00:11:23 +00:00
parent b2f88a16c9
commit 7e03bf65c7
4 changed files with 34 additions and 25 deletions

View File

@@ -21,7 +21,6 @@ import android.accessibilityservice.AccessibilityShortcutInfo;
import android.app.settings.SettingsEnums;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.ServiceInfo;
import android.hardware.input.InputManager;
import android.os.Bundle;
@@ -30,6 +29,7 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Pair;
import android.view.InputDevice;
import android.view.accessibility.AccessibilityManager;
@@ -57,6 +57,8 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/** Activity with the accessibility settings. */
@SearchIndexable(forTarget = SearchIndexable.ALL & ~SearchIndexable.ARC)
@@ -454,17 +456,22 @@ public class AccessibilitySettings extends DashboardFragment implements
final List<AccessibilityShortcutInfo> installedShortcutList =
a11yManager.getInstalledAccessibilityShortcutListAsUser(context,
UserHandle.myUserId());
final List<AccessibilityActivityPreference> activityList =
preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList);
final Set<Pair<String, CharSequence>> packageLabelPairs =
activityList.stream()
.map(a11yActivityPref -> new Pair<>(
a11yActivityPref.getPackageName(), a11yActivityPref.getLabel())
).collect(Collectors.toSet());
// Remove duplicate item here, new a ArrayList to copy unmodifiable list result
// (getInstalledAccessibilityServiceList).
final List<AccessibilityServiceInfo> installedServiceList = new ArrayList<>(
a11yManager.getInstalledAccessibilityServiceList());
installedServiceList.removeIf(
target -> containsTargetNameInList(installedShortcutList, target));
final List<RestrictedPreference> activityList =
preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList);
if (!packageLabelPairs.isEmpty()) {
installedServiceList.removeIf(
target -> containsPackageAndLabelInList(packageLabelPairs, target));
}
final List<RestrictedPreference> serviceList =
preferenceHelper.createAccessibilityServicePreferenceList(installedServiceList);
@@ -475,22 +482,14 @@ public class AccessibilitySettings extends DashboardFragment implements
return preferenceList;
}
private boolean containsTargetNameInList(List<AccessibilityShortcutInfo> shortcutInfos,
private boolean containsPackageAndLabelInList(
Set<Pair<String, CharSequence>> packageLabelPairs,
AccessibilityServiceInfo targetServiceInfo) {
final ServiceInfo serviceInfo = targetServiceInfo.getResolveInfo().serviceInfo;
final String servicePackageName = serviceInfo.packageName;
final CharSequence serviceLabel = serviceInfo.loadLabel(getPackageManager());
for (int i = 0, count = shortcutInfos.size(); i < count; ++i) {
final ActivityInfo activityInfo = shortcutInfos.get(i).getActivityInfo();
final String activityPackageName = activityInfo.packageName;
final CharSequence activityLabel = activityInfo.loadLabel(getPackageManager());
if (servicePackageName.equals(activityPackageName)
&& serviceLabel.equals(activityLabel)) {
return true;
}
}
return false;
return packageLabelPairs.contains(new Pair<>(servicePackageName, serviceLabel));
}
private void initializePreBundledServicesMapFromArray(String categoryKey, int key) {