Merge "Improve the speed of AccessibilitySettings#containsTargetNameInList to help reduce the a11y settings' cold start latency." into main
This commit is contained in:
@@ -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;
|
||||||
|
@@ -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());
|
||||||
installedServiceList.removeIf(
|
if (!packageLabelPairs.isEmpty()) {
|
||||||
target -> containsTargetNameInList(installedShortcutList, target));
|
installedServiceList.removeIf(
|
||||||
|
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) {
|
||||||
|
@@ -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);
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user