Merge "Improve the speed of AccessibilitySettings#containsTargetNameInList to help reduce the a11y settings' cold start latency." into main

This commit is contained in:
Chun-Ku Lin
2024-06-07 21:17:44 +00:00
committed by Android (Google) Code Review
4 changed files with 34 additions and 25 deletions

View File

@@ -50,6 +50,7 @@ public class AccessibilityActivityPreference extends RestrictedPreference {
private final AccessibilityShortcutInfo mA11yShortcutInfo; private final AccessibilityShortcutInfo mA11yShortcutInfo;
private final PackageManager mPm; private final PackageManager mPm;
private final ComponentName mComponentName; private final ComponentName mComponentName;
private final CharSequence mLabel;
private final ListenableFuture mExtraArgumentsFuture; private final ListenableFuture mExtraArgumentsFuture;
public AccessibilityActivityPreference(Context context, String packageName, int uid, public AccessibilityActivityPreference(Context context, String packageName, int uid,
@@ -58,9 +59,10 @@ public class AccessibilityActivityPreference extends RestrictedPreference {
mPm = context.getPackageManager(); mPm = context.getPackageManager();
mA11yShortcutInfo = a11yShortcutInfo; mA11yShortcutInfo = a11yShortcutInfo;
mComponentName = a11yShortcutInfo.getComponentName(); mComponentName = a11yShortcutInfo.getComponentName();
mLabel = a11yShortcutInfo.getActivityInfo().loadLabel(mPm);
// setup basic info for a preference // setup basic info for a preference
setKey(mComponentName.flattenToString()); setKey(mComponentName.flattenToString());
setTitle(a11yShortcutInfo.getActivityInfo().loadLabel(mPm)); setTitle(mLabel);
setSummary(a11yShortcutInfo.loadSummary(mPm)); setSummary(a11yShortcutInfo.loadSummary(mPm));
setFragment(TARGET_FRAGMENT); setFragment(TARGET_FRAGMENT);
setIconSize(ICON_SIZE_MEDIUM); setIconSize(ICON_SIZE_MEDIUM);
@@ -92,6 +94,13 @@ public class AccessibilityActivityPreference extends RestrictedPreference {
super.performClick(); super.performClick();
} }
/**
* Returns the label of the Accessibility Activity
*/
public CharSequence getLabel() {
return mLabel;
}
private Drawable getA11yActivityIcon() { private Drawable getA11yActivityIcon() {
ActivityInfo activityInfo = mA11yShortcutInfo.getActivityInfo(); ActivityInfo activityInfo = mA11yShortcutInfo.getActivityInfo();
Drawable serviceIcon; Drawable serviceIcon;

View File

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

View File

@@ -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 * @param installedShortcuts The list of {@link AccessibilityShortcutInfo}s of the
* installed accessibility shortcuts * installed accessibility shortcuts
* @return The list of {@link RestrictedPreference} * @return The list of {@link AccessibilityActivityPreference}
*/ */
public List<RestrictedPreference> createAccessibilityActivityPreferenceList( public List<AccessibilityActivityPreference> createAccessibilityActivityPreferenceList(
List<AccessibilityShortcutInfo> installedShortcuts) { List<AccessibilityShortcutInfo> installedShortcuts) {
final Set<ComponentName> enabledServices = final Set<ComponentName> enabledServices =
AccessibilityUtils.getEnabledServicesFromSettings(mContext); AccessibilityUtils.getEnabledServicesFromSettings(mContext);
@@ -115,7 +116,7 @@ public class RestrictedPreferenceHelper {
UserHandle.myUserId()); UserHandle.myUserId());
final int installedShortcutsSize = installedShortcuts.size(); final int installedShortcutsSize = installedShortcuts.size();
final List<RestrictedPreference> preferenceList = new ArrayList<>( final List<AccessibilityActivityPreference> preferenceList = new ArrayList<>(
installedShortcutsSize); installedShortcutsSize);
for (int i = 0; i < installedShortcutsSize; ++i) { for (int i = 0; i < installedShortcutsSize; ++i) {
@@ -124,7 +125,7 @@ public class RestrictedPreferenceHelper {
final ComponentName componentName = info.getComponentName(); final ComponentName componentName = info.getComponentName();
final boolean serviceEnabled = enabledServices.contains(componentName); final boolean serviceEnabled = enabledServices.contains(componentName);
RestrictedPreference preference = new AccessibilityActivityPreference( AccessibilityActivityPreference preference = new AccessibilityActivityPreference(
mContext, componentName.getPackageName(), activityInfo.applicationInfo.uid, mContext, componentName.getPackageName(), activityInfo.applicationInfo.uid,
info); info);
setRestrictedPreferenceEnabled(preference, permittedServices, serviceEnabled); setRestrictedPreferenceEnabled(preference, permittedServices, serviceEnabled);

View File

@@ -137,7 +137,7 @@ public class RestrictedPreferenceHelperTest {
final List<AccessibilityShortcutInfo> infoList = new ArrayList<>( final List<AccessibilityShortcutInfo> infoList = new ArrayList<>(
singletonList(mShortcutInfo)); singletonList(mShortcutInfo));
final List<RestrictedPreference> preferenceList = final List<AccessibilityActivityPreference> preferenceList =
mHelper.createAccessibilityActivityPreferenceList(infoList); mHelper.createAccessibilityActivityPreferenceList(infoList);
final RestrictedPreference preference = preferenceList.get(0); final RestrictedPreference preference = preferenceList.get(0);