Loading AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading src/com/android/packageinstaller/permission/model/PermissionApps.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading src/com/android/packageinstaller/permission/model/PermissionGroup.java +29 −3 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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()); Loading Loading @@ -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; } } src/com/android/packageinstaller/permission/model/PermissionGroups.java +36 −8 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr mContext = context; mLoaderManager = loaderManager; mCallback = callback; mLoaderManager.initLoader(0, null, this); } @Override Loading @@ -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; } Loading @@ -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<>(); Loading Loading @@ -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); } Loading Loading @@ -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); } } Loading Loading @@ -223,5 +246,10 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr } return icon; } @Override public void onPermissionsChanged(int uid) { forceLoad(); } } } src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java +3 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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 Loading
AndroidManifest.xml +1 −0 Original line number Diff line number Diff line Loading @@ -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" /> Loading
src/com/android/packageinstaller/permission/model/PermissionApps.java +18 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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) { Loading
src/com/android/packageinstaller/permission/model/PermissionGroup.java +29 −3 Original line number Diff line number Diff line Loading @@ -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() { Loading @@ -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()); Loading Loading @@ -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; } }
src/com/android/packageinstaller/permission/model/PermissionGroups.java +36 −8 Original line number Diff line number Diff line Loading @@ -53,6 +53,7 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr mContext = context; mLoaderManager = loaderManager; mCallback = callback; mLoaderManager.initLoader(0, null, this); } @Override Loading @@ -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; } Loading @@ -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<>(); Loading Loading @@ -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); } Loading Loading @@ -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); } } Loading Loading @@ -223,5 +246,10 @@ public final class PermissionGroups implements LoaderCallbacks<List<PermissionGr } return icon; } @Override public void onPermissionsChanged(int uid) { forceLoad(); } } }
src/com/android/packageinstaller/permission/ui/handheld/ManagePermissionsFragment.java +3 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading Loading @@ -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