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

Commit 7c2ca01a authored by Joel Galenson's avatar Joel Galenson
Browse files

Optimize Permissions Hub by not loading non-platform permission groups.

Added a flag when loading permission groups that controls whether or
not to load non-platform permission groups.  Some uses, including
Permissions Hub, only use the platform permissions, so we can save
time by ignoring the others.

On my dev phone this reduces the Permissions Hub loading time by about
a quarter.

Bug: 124052170
Test: Load Permissions Hub, see it is faster.
Test: Ensure App Permissions and search indexing still work.
Change-Id: I1489d227342e115464363cb78e914ce78ad88d5e
parent d451a24b
Loading
Loading
Loading
Loading
+29 −7
Original line number Diff line number Diff line
@@ -55,16 +55,19 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
    private final Context mContext;
    private final PermissionsGroupsChangeCallback mCallback;
    private final boolean mGetAppUiInfo;
    private final boolean mGetNonPlatformPermissions;

    public interface PermissionsGroupsChangeCallback {
        public void onPermissionGroupsChanged();
    }

    public PermissionGroups(Context context, LoaderManager loaderManager,
            PermissionsGroupsChangeCallback callback, boolean getAppUiInfo) {
            PermissionsGroupsChangeCallback callback, boolean getAppUiInfo,
            boolean getNonPlatformPermissions) {
        mContext = context;
        mCallback = callback;
        mGetAppUiInfo = getAppUiInfo;
        mGetNonPlatformPermissions = getNonPlatformPermissions;

        // Don't update immediately as otherwise we can get a callback before this object is
        // initialized.
@@ -73,7 +76,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr

    @Override
    public Loader<List<PermissionGroup>> onCreateLoader(int id, Bundle args) {
        return new PermissionsLoader(mContext, mGetAppUiInfo);
        return new PermissionsLoader(mContext, mGetAppUiInfo, mGetNonPlatformPermissions);
    }

    @Override
@@ -135,12 +138,15 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
     * @param context Context to use
     * @param isCanceled callback checked if the group resolution should be aborted
     * @param getAppUiInfo If the UI info for apps should be updated
     * @param getNonPlatformPermissions If we should get non-platform permission groups
     *
     * @return the list of all groups int the system
     */
    public static @NonNull List<PermissionGroup> getAllPermissionGroups(@NonNull Context context,
            @Nullable Supplier<Boolean> isCanceled, boolean getAppUiInfo) {
        return getPermissionGroups(context, isCanceled, getAppUiInfo, null, null);
            @Nullable Supplier<Boolean> isCanceled, boolean getAppUiInfo,
            boolean getNonPlatformPermissions) {
        return getPermissionGroups(context, isCanceled, getAppUiInfo, getNonPlatformPermissions,
                null, null);
    }

    /**
@@ -149,6 +155,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
     * @param context Context to use
     * @param isCanceled callback checked if the group resolution should be aborted
     * @param getAppUiInfo If the UI info for apps should be updated
     * @param getNonPlatformPermissions If we should get non-platform permission groups
     * @param groupName Optional group to filter for.
     * @param packageName Optional package to filter for.
     *
@@ -156,7 +163,8 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
     */
    public static @NonNull List<PermissionGroup> getPermissionGroups(@NonNull Context context,
            @Nullable Supplier<Boolean> isCanceled, boolean getAppUiInfo,
            @Nullable String groupName, @Nullable String packageName) {
            boolean getNonPlatformPermissions, @Nullable String groupName,
            @Nullable String packageName) {
        ArraySet<String> launcherPkgs = Utils.getLauncherPackages(context);
        PermissionApps.PmCache pmCache = new PermissionApps.PmCache(
                context.getPackageManager());
@@ -175,6 +183,11 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
                return Collections.emptyList();
            }

            // Ignore non-platform permissions and the UNDEFINED group.
            if (!getNonPlatformPermissions && !Utils.isModernPermissionGroup(groupInfo.name)) {
                continue;
            }

            // Get the permissions in this group.
            final List<PermissionInfo> groupPermissions;
            try {
@@ -248,6 +261,12 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
                    continue;
                }

                // Ignore non-platform permissions and the UNDEFINED group.
                if (!getNonPlatformPermissions && !Utils.isModernPermissionGroup(
                        permissionInfo.name)) {
                    continue;
                }

                // If no app uses this permission,
                if (!requestedPermissions.contains(permissionInfo.name)) {
                    continue;
@@ -303,10 +322,13 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
    private static final class PermissionsLoader extends AsyncTaskLoader<List<PermissionGroup>>
            implements PackageManager.OnPermissionsChangedListener {
        private final boolean mGetAppUiInfo;
        private final boolean mGetNonPlatformPermissions;

        PermissionsLoader(Context context, boolean getAppUiInfo) {
        PermissionsLoader(Context context, boolean getAppUiInfo,
                boolean getNonPlatformPermissions) {
            super(context);
            mGetAppUiInfo = getAppUiInfo;
            mGetNonPlatformPermissions = getNonPlatformPermissions;
        }

        @Override
@@ -323,7 +345,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
        @Override
        public List<PermissionGroup> loadInBackground() {
            return getAllPermissionGroups(getContext(), this::isLoadInBackgroundCanceled,
                    mGetAppUiInfo);
                    mGetAppUiInfo, mGetNonPlatformPermissions);
        }

        @Override
+12 −5
Original line number Diff line number Diff line
@@ -63,6 +63,8 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
    private static final String KEY_FILTER_END_TIME_MILLIS =  "KEY_FILTER_END_TIME_MILLIS";
    private static final String KEY_USAGE_FLAGS =  "KEY_USAGE_FLAGS";
    private static final String KEY_GET_UI_INFO =  "KEY_GET_UI_INFO";
    private static final String KEY_GET_NON_PLATFORM_PERMISSIONS =
            "KEY_GET_NON_PLATFORM_PERMISSIONS";

    private @Nullable PermissionsUsagesChangeCallback mCallback;

@@ -77,16 +79,18 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
    public void load(@Nullable String filterPackageName, @Nullable String filterPermissionGroup,
            long filterBeginTimeMillis, long filterEndTimeMillis, int usageFlags,
            @NonNull LoaderManager loaderManager, boolean getUiInfo,
            @NonNull PermissionsUsagesChangeCallback callback, boolean sync) {
            boolean getNonPlatformPermissions, @NonNull PermissionsUsagesChangeCallback callback,
            boolean sync) {
        load(Process.INVALID_UID, filterPackageName, filterPermissionGroup, filterBeginTimeMillis,
                filterEndTimeMillis, usageFlags, loaderManager, getUiInfo, callback, sync);
                filterEndTimeMillis, usageFlags, loaderManager, getUiInfo,
                getNonPlatformPermissions, callback, sync);
    }

    public void load(int filterUid, @Nullable String filterPackageName,
            @Nullable String filterPermissionGroup, long filterBeginTimeMillis,
            long filterEndTimeMillis, int usageFlags, @NonNull LoaderManager loaderManager,
            boolean getUiInfo, @NonNull PermissionsUsagesChangeCallback callback,
            boolean sync) {
            boolean getUiInfo, boolean getNonPlatformPermissions,
            @NonNull PermissionsUsagesChangeCallback callback, boolean sync) {
        mCallback = callback;
        final Bundle args = new Bundle();
        args.putInt(KEY_FILTER_UID, filterUid);
@@ -96,6 +100,7 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
        args.putLong(KEY_FILTER_END_TIME_MILLIS, filterEndTimeMillis);
        args.putInt(KEY_USAGE_FLAGS, usageFlags);
        args.putBoolean(KEY_GET_UI_INFO, getUiInfo);
        args.putBoolean(KEY_GET_NON_PLATFORM_PERMISSIONS, getNonPlatformPermissions);
        if (sync) {
            final UsageLoader loader = new UsageLoader(mContext, args);
            final List<AppPermissionUsage> usages = loader.loadInBackground();
@@ -166,6 +171,7 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
        private final long mFilterEndTimeMillis;
        private final int mUsageFlags;
        private final boolean mGetUiInfo;
        private final boolean mGetNonPlatformPermissions;

        UsageLoader(@NonNull Context context, @NonNull Bundle args) {
            super(context);
@@ -176,6 +182,7 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
            mFilterEndTimeMillis = args.getLong(KEY_FILTER_END_TIME_MILLIS);
            mUsageFlags = args.getInt(KEY_USAGE_FLAGS);
            mGetUiInfo = args.getBoolean(KEY_GET_UI_INFO);
            mGetNonPlatformPermissions = args.getBoolean(KEY_GET_NON_PLATFORM_PERMISSIONS);
        }

        @Override
@@ -187,7 +194,7 @@ public final class PermissionUsages implements LoaderCallbacks<List<AppPermissio
        public @NonNull List<AppPermissionUsage> loadInBackground() {
            final List<PermissionGroup> groups = PermissionGroups.getPermissionGroups(
                    getContext(), this::isLoadInBackgroundCanceled, mGetUiInfo,
                    mFilterPermissionGroup, mFilterPackageName);
                    mGetNonPlatformPermissions, mFilterPermissionGroup, mFilterPackageName);
            if (!Utils.isPermissionsHubEnabled()) {
                return Collections.emptyList();
            }
+1 −1
Original line number Diff line number Diff line
@@ -438,7 +438,7 @@ public final class PermissionControllerServiceImpl extends PermissionControllerS
        long filterTimeBeginMillis = Math.max(System.currentTimeMillis() - numMillis, 0);
        usages.load(null, null, filterTimeBeginMillis, Long.MAX_VALUE,
                PermissionUsages.USAGE_FLAG_LAST | PermissionUsages.USAGE_FLAG_HISTORICAL, null,
                false, null, true);
                false, false, null, true);

        List<AppPermissionUsage> appPermissionUsages = usages.getUsages();
        int numApps = appPermissionUsages.size();
+1 −1
Original line number Diff line number Diff line
@@ -275,6 +275,6 @@ public class AppPermissionUsageFragment extends SettingsWithButtonHeader impleme
        mPermissionUsages.load(mAppInfo.uid, mPackageName, null, beginTimeMillis, Long.MAX_VALUE,
                PermissionUsages.USAGE_FLAG_LAST | PermissionUsages.USAGE_FLAG_HISTORICAL,
                getActivity().getLoaderManager(),
                true, this::updateUi, false);
                true, false, this::updateUi, false);
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ abstract class ManagePermissionsFragment extends PermissionsFrameFragment
        }

        mPermissions = new PermissionGroups(getContext(), getActivity().getLoaderManager(), this,
                false);
                false, true);
        mCollator = Collator.getInstance(
                getContext().getResources().getConfiguration().getLocales().get(0));
    }
Loading