From 7e03bf65c7cc9ce2a241425dc9cccfad7c07d1ec Mon Sep 17 00:00:00 2001 From: Chun-Ku Lin Date: Fri, 7 Jun 2024 00:11:23 +0000 Subject: [PATCH] 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 --- .../AccessibilityActivityPreference.java | 11 +++++- .../accessibility/AccessibilitySettings.java | 35 +++++++++---------- .../RestrictedPreferenceHelper.java | 11 +++--- .../RestrictedPreferenceHelperTest.java | 2 +- 4 files changed, 34 insertions(+), 25 deletions(-) diff --git a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java index e5568f6ccd0..914d9cf3f84 100644 --- a/src/com/android/settings/accessibility/AccessibilityActivityPreference.java +++ b/src/com/android/settings/accessibility/AccessibilityActivityPreference.java @@ -50,6 +50,7 @@ public class AccessibilityActivityPreference extends RestrictedPreference { private final AccessibilityShortcutInfo mA11yShortcutInfo; private final PackageManager mPm; private final ComponentName mComponentName; + private final CharSequence mLabel; private final ListenableFuture mExtraArgumentsFuture; public AccessibilityActivityPreference(Context context, String packageName, int uid, @@ -58,9 +59,10 @@ public class AccessibilityActivityPreference extends RestrictedPreference { mPm = context.getPackageManager(); mA11yShortcutInfo = a11yShortcutInfo; mComponentName = a11yShortcutInfo.getComponentName(); + mLabel = a11yShortcutInfo.getActivityInfo().loadLabel(mPm); // setup basic info for a preference setKey(mComponentName.flattenToString()); - setTitle(a11yShortcutInfo.getActivityInfo().loadLabel(mPm)); + setTitle(mLabel); setSummary(a11yShortcutInfo.loadSummary(mPm)); setFragment(TARGET_FRAGMENT); setIconSize(ICON_SIZE_MEDIUM); @@ -92,6 +94,13 @@ public class AccessibilityActivityPreference extends RestrictedPreference { super.performClick(); } + /** + * Returns the label of the Accessibility Activity + */ + public CharSequence getLabel() { + return mLabel; + } + private Drawable getA11yActivityIcon() { ActivityInfo activityInfo = mA11yShortcutInfo.getActivityInfo(); Drawable serviceIcon; diff --git a/src/com/android/settings/accessibility/AccessibilitySettings.java b/src/com/android/settings/accessibility/AccessibilitySettings.java index b5df0e22c80..8441c2acaa5 100644 --- a/src/com/android/settings/accessibility/AccessibilitySettings.java +++ b/src/com/android/settings/accessibility/AccessibilitySettings.java @@ -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 installedShortcutList = a11yManager.getInstalledAccessibilityShortcutListAsUser(context, UserHandle.myUserId()); + final List activityList = + preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList); + final Set> 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 installedServiceList = new ArrayList<>( a11yManager.getInstalledAccessibilityServiceList()); - installedServiceList.removeIf( - target -> containsTargetNameInList(installedShortcutList, target)); - - final List activityList = - preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList); - + if (!packageLabelPairs.isEmpty()) { + installedServiceList.removeIf( + target -> containsPackageAndLabelInList(packageLabelPairs, target)); + } final List serviceList = preferenceHelper.createAccessibilityServicePreferenceList(installedServiceList); @@ -475,22 +482,14 @@ public class AccessibilitySettings extends DashboardFragment implements return preferenceList; } - private boolean containsTargetNameInList(List shortcutInfos, + private boolean containsPackageAndLabelInList( + Set> 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) { diff --git a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java index 34646ba7fcb..2cabc76eab0 100644 --- a/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java +++ b/src/com/android/settings/accessibility/RestrictedPreferenceHelper.java @@ -101,13 +101,14 @@ public class RestrictedPreferenceHelper { } /** - * Creates the list of {@link RestrictedPreference} with the installedShortcuts arguments. + * Creates the list of {@link AccessibilityActivityPreference} with the installedShortcuts + * arguments. * * @param installedShortcuts The list of {@link AccessibilityShortcutInfo}s of the * installed accessibility shortcuts - * @return The list of {@link RestrictedPreference} + * @return The list of {@link AccessibilityActivityPreference} */ - public List createAccessibilityActivityPreferenceList( + public List createAccessibilityActivityPreferenceList( List installedShortcuts) { final Set enabledServices = AccessibilityUtils.getEnabledServicesFromSettings(mContext); @@ -115,7 +116,7 @@ public class RestrictedPreferenceHelper { UserHandle.myUserId()); final int installedShortcutsSize = installedShortcuts.size(); - final List preferenceList = new ArrayList<>( + final List preferenceList = new ArrayList<>( installedShortcutsSize); for (int i = 0; i < installedShortcutsSize; ++i) { @@ -124,7 +125,7 @@ public class RestrictedPreferenceHelper { final ComponentName componentName = info.getComponentName(); final boolean serviceEnabled = enabledServices.contains(componentName); - RestrictedPreference preference = new AccessibilityActivityPreference( + AccessibilityActivityPreference preference = new AccessibilityActivityPreference( mContext, componentName.getPackageName(), activityInfo.applicationInfo.uid, info); setRestrictedPreferenceEnabled(preference, permittedServices, serviceEnabled); diff --git a/tests/robotests/src/com/android/settings/accessibility/RestrictedPreferenceHelperTest.java b/tests/robotests/src/com/android/settings/accessibility/RestrictedPreferenceHelperTest.java index bc9c1d83fb1..b4f4dc1127e 100644 --- a/tests/robotests/src/com/android/settings/accessibility/RestrictedPreferenceHelperTest.java +++ b/tests/robotests/src/com/android/settings/accessibility/RestrictedPreferenceHelperTest.java @@ -137,7 +137,7 @@ public class RestrictedPreferenceHelperTest { final List infoList = new ArrayList<>( singletonList(mShortcutInfo)); - final List preferenceList = + final List preferenceList = mHelper.createAccessibilityActivityPreferenceList(infoList); final RestrictedPreference preference = preferenceList.get(0);