Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit bcb87740 authored by Chun-Ku Lin's avatar Chun-Ku Lin Committed by Android (Google) Code Review
Browse files

Merge "Improve the speed of AccessibilitySettings#containsTargetNameInList to...

Merge "Improve the speed of AccessibilitySettings#containsTargetNameInList to help reduce the a11y settings' cold start latency." into main
parents f567d196 7e03bf65
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -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;
+17 −18
Original line number Diff line number Diff line
@@ -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());
        if (!packageLabelPairs.isEmpty()) {
            installedServiceList.removeIf(
                target -> containsTargetNameInList(installedShortcutList, target));

        final List<RestrictedPreference> activityList =
                preferenceHelper.createAccessibilityActivityPreferenceList(installedShortcutList);

                    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) {
+6 −5
Original line number Diff line number Diff line
@@ -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<RestrictedPreference> createAccessibilityActivityPreferenceList(
    public List<AccessibilityActivityPreference> createAccessibilityActivityPreferenceList(
            List<AccessibilityShortcutInfo> installedShortcuts) {
        final Set<ComponentName> enabledServices =
                AccessibilityUtils.getEnabledServicesFromSettings(mContext);
@@ -115,7 +116,7 @@ public class RestrictedPreferenceHelper {
                UserHandle.myUserId());

        final int installedShortcutsSize = installedShortcuts.size();
        final List<RestrictedPreference> preferenceList = new ArrayList<>(
        final List<AccessibilityActivityPreference> 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);
+1 −1
Original line number Diff line number Diff line
@@ -137,7 +137,7 @@ public class RestrictedPreferenceHelperTest {
        final List<AccessibilityShortcutInfo> infoList = new ArrayList<>(
                singletonList(mShortcutInfo));

        final List<RestrictedPreference> preferenceList =
        final List<AccessibilityActivityPreference> preferenceList =
                mHelper.createAccessibilityActivityPreferenceList(infoList);
        final RestrictedPreference preference = preferenceList.get(0);