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

Commit 1a233222 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Load PermissionGroups completely async"

parents 1eb9b551 9337ca6d
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
    <uses-permission android:name="android.permission.REVOKE_RUNTIME_PERMISSIONS" />
    <uses-permission android:name="android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS" />
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
    <uses-permission android:name="android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS" />
    <uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
    <uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
+18 −0
Original line number Diff line number Diff line
@@ -79,7 +79,16 @@ public class PermissionApps {
        createMap(loadPermissionApps());
    }

    /**
     * Start an async refresh and call back the registered call back once done.
     *
     * @param getUiInfo If the UI info should be updated
     */
    public void refresh(boolean getUiInfo) {
        if (mCallback == null) {
            throw new IllegalStateException("callback needs to be set");
        }

        if (!mRefreshing) {
            mRefreshing = true;
            mSkipUi = !getUiInfo;
@@ -87,6 +96,15 @@ public class PermissionApps {
        }
    }

    /**
     * Refresh the state and do not return until it finishes. Should not be called while an {@link
     * #refresh async referesh} is in progress.
     */
    public void refreshSync() {
        mSkipUi = true;
        createMap(loadPermissionApps());
    }

    public int getGrantedCount(ArraySet<String> launcherPkgs) {
        int count = 0;
        for (PermissionApp app : mPermApps) {
+29 −3
Original line number Diff line number Diff line
@@ -23,13 +23,17 @@ public final class PermissionGroup implements Comparable<PermissionGroup> {
    private final String mDeclaringPackage;
    private final CharSequence mLabel;
    private final Drawable mIcon;
    private final int mTotal;
    private final int mGranted;

    PermissionGroup(String name, String declaringPackage,
            CharSequence label, Drawable icon) {
    PermissionGroup(String name, String declaringPackage, CharSequence label, Drawable icon,
            int total, int granted) {
        mDeclaringPackage = declaringPackage;
        mName = name;
        mLabel = label;
        mIcon = icon;
        mTotal = total;
        mGranted = granted;
    }

    public String getName() {
@@ -48,6 +52,20 @@ public final class PermissionGroup implements Comparable<PermissionGroup> {
        return mIcon;
    }

    /**
     * @return The number of apps that might request permissions of this group
     */
    public int getTotal() {
        return mTotal;
    }

    /**
     * @return The number of apps that were granted permissions of this group
     */
    public int getGranted() {
        return mGranted;
    }

    @Override
    public int compareTo(PermissionGroup another) {
        return mLabel.toString().compareTo(another.mLabel.toString());
@@ -77,11 +95,19 @@ public final class PermissionGroup implements Comparable<PermissionGroup> {
            return false;
        }

        if (mTotal != other.mTotal) {
            return false;
        }

        if (mGranted != other.mGranted) {
            return false;
        }

        return true;
    }

    @Override
    public int hashCode() {
        return mName != null ? mName.hashCode() : 0;
        return mName != null ? mName.hashCode() + mTotal + mGranted : mTotal + mGranted;
    }
}
+36 −8
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
        mContext = context;
        mLoaderManager = loaderManager;
        mCallback = callback;
        mLoaderManager.initLoader(0, null, this);
    }

    @Override
@@ -77,11 +78,6 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
        mCallback.onPermissionGroupsChanged();
    }

    public void refresh() {
        mLoaderManager.restartLoader(0, null, this);
        mLoaderManager.getLoader(0).forceLoad();
    }

    public List<PermissionGroup> getGroups() {
        return mGroups;
    }
@@ -95,14 +91,30 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
        return null;
    }

    private static final class PermissionsLoader extends AsyncTaskLoader<List<PermissionGroup>> {
    private static final class PermissionsLoader extends AsyncTaskLoader<List<PermissionGroup>>
            implements PackageManager.OnPermissionsChangedListener {

        public PermissionsLoader(Context context) {
            super(context);
        }

        @Override
        protected void onStartLoading() {
            getContext().getPackageManager().addOnPermissionsChangeListener(this);
            forceLoad();
        }

        @Override
        protected void onStopLoading() {
            getContext().getPackageManager().removeOnPermissionsChangeListener(this);
        }

        @Override
        public List<PermissionGroup> loadInBackground() {
            ArraySet<String> launcherPkgs = Utils.getLauncherPackages(getContext());
            PermissionApps.PmCache pmCache = new PermissionApps.PmCache(
                    getContext().getPackageManager());

            List<PermissionGroup> groups = new ArrayList<>();
            Set<String> seenPermissions = new ArraySet<>();

@@ -144,9 +156,14 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
                CharSequence label = loadItemInfoLabel(groupInfo);
                Drawable icon = loadItemInfoIcon(groupInfo);

                PermissionApps permApps = new PermissionApps(getContext(), groupInfo.name, null,
                        pmCache);
                permApps.refreshSync();

                // Create the group and add to the list.
                PermissionGroup group = new PermissionGroup(groupInfo.name,
                        groupInfo.packageName, label, icon);
                        groupInfo.packageName, label, icon, permApps.getTotalCount(launcherPkgs),
                        permApps.getGrantedCount(launcherPkgs));
                groups.add(group);
            }

@@ -193,9 +210,15 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
                    CharSequence label = loadItemInfoLabel(permissionInfo);
                    Drawable icon = loadItemInfoIcon(permissionInfo);

                    PermissionApps permApps = new PermissionApps(getContext(), permissionInfo.name,
                            null, pmCache);
                    permApps.refreshSync();

                    // Create the group and add to the list.
                    PermissionGroup group = new PermissionGroup(permissionInfo.name,
                            permissionInfo.packageName, label, icon);
                            permissionInfo.packageName, label, icon,
                            permApps.getTotalCount(launcherPkgs),
                            permApps.getGrantedCount(launcherPkgs));
                    groups.add(group);
                }
            }
@@ -223,5 +246,10 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr
            }
            return icon;
        }

        @Override
        public void onPermissionsChanged(int uid) {
            forceLoad();
        }
    }
}
+3 −19
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.util.ArraySet;
import android.util.Log;

import com.android.packageinstaller.R;
import com.android.packageinstaller.permission.model.PermissionApps;
import com.android.packageinstaller.permission.model.PermissionApps.PmCache;
import com.android.packageinstaller.permission.model.PermissionGroup;
import com.android.packageinstaller.permission.model.PermissionGroups;
@@ -58,13 +57,7 @@ abstract class ManagePermissionsFragment extends PermissionsFrameFragment
            ab.setDisplayHomeAsUpEnabled(true);
        }
        mLauncherPkgs = Utils.getLauncherPackages(getContext());
        mPermissions = new PermissionGroups(getActivity(), getLoaderManager(), this);
    }

    @Override
    public void onStart() {
        super.onStart();
        mPermissions.refresh();
        mPermissions = new PermissionGroups(getContext(), getLoaderManager(), this);
    }

    @Override
@@ -148,17 +141,8 @@ abstract class ManagePermissionsFragment extends PermissionsFrameFragment
                    preference.setPersistent(false);
                    screen.addPreference(preference);
                }
                final Preference finalPref = preference;

                new PermissionApps(getContext(), group.getName(), permissionApps -> {
                    if (getActivity() == null) {
                        return;
                    }
                    int granted = permissionApps.getGrantedCount(mLauncherPkgs);
                    int total = permissionApps.getTotalCount(mLauncherPkgs);
                    finalPref.setSummary(getString(R.string.app_permissions_group_summary,
                            granted, total));
                }, cache).refresh(false);
                preference.setSummary(getString(R.string.app_permissions_group_summary,
                        group.getGranted(), group.getTotal()));
            }
        }
        if (screen.getPreferenceCount() != 0) {
Loading