Loading src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java +106 −53 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.Fragment; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.os.Bundle; import android.os.UserHandle; import android.preference.Preference; Loading @@ -38,6 +39,7 @@ import android.widget.Toast; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; import com.android.packageinstaller.permission.utils.Utils; Loading @@ -63,6 +65,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { return fragment; } private PackageManager mPackageManager; private List<AppPermissionGroup> mToggledGroups; private AppPermissions mAppPermissions; Loading Loading @@ -103,11 +106,12 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); Activity activity = getActivity(); PackageManager pm = activity.getPackageManager(); mPackageManager = activity.getPackageManager(); PackageInfo packageInfo; try { packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); packageInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); packageInfo = null; Loading Loading @@ -149,7 +153,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { private void initializePermissionGroupList() { final String packageName = mAppPermissions.getPackageInfo().packageName; List<AppPermissionGroup> groups = mAppPermissions.getPermissionGroups(); List<SwitchPreference> nonSystemGroups = new ArrayList<>(); List<SwitchPreference> nonSystemPreferences = new ArrayList<>(); if (!groups.isEmpty()) { getPreferenceScreen().removePreference(findPreference(KEY_NO_PERMISSIONS)); Loading @@ -162,7 +166,56 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())) { // If permission is controlled individually, we show all requested permission // inside this group. for (PermissionInfo perm : getPermissionInfosFromGroup(group)) { final SwitchPreference pref = createSwitchPreferenceForPermission(group, perm); showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform); } } else { final SwitchPreference pref = createSwitchPreferenceForGroup(group); showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform); } } // Now add the non-system settings to the end of the list for (SwitchPreference nonSystemPreference : nonSystemPreferences) { getPreferenceScreen().addPreference(nonSystemPreference); } } private void showOrAddToNonSystemPreferences(SwitchPreference pref, List<SwitchPreference> nonSystemPreferences, // Mutate boolean isPlatform) { // The UI shows System settings first, then non-system settings if (isPlatform) { getPreferenceScreen().addPreference(pref); } else { nonSystemPreferences.add(pref); } } private SwitchPreference createSwitchPreferenceForPermission(AppPermissionGroup group, PermissionInfo perm) { final SwitchPreference pref = new PermissionSwitchPreference(getActivity()); pref.setKey(perm.name); pref.setTitle(perm.loadLabel(mPackageManager)); pref.setChecked(group.areRuntimePermissionsGranted(new String[]{ perm.name })); pref.setOnPreferenceChangeListener((p, newVal) -> { if((Boolean) newVal) { group.grantRuntimePermissions(false, new String[]{ perm.name }); } else { group.revokeRuntimePermissions(true, new String[]{ perm.name }); } return true; }); return pref; } private SwitchPreference createSwitchPreferenceForGroup(AppPermissionGroup group) { final SwitchPreference pref = new PermissionSwitchPreference(getActivity()); pref.setKey(group.getName()); pref.setTitle(group.getLabel()); pref.setChecked(group.areRuntimePermissionsGranted()); Loading Loading @@ -207,19 +260,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { return true; }); } // The UI shows System settings first, then non-system settings if (isPlatform) { getPreferenceScreen().addPreference(pref); } else { nonSystemGroups.add(pref); } } // Now add the non-system settings to the end of the list for (SwitchPreference nonSystemGroup : nonSystemGroups) { getPreferenceScreen().addPreference(nonSystemGroup); } return pref; } private void setPermission(AppPermissionGroup group, SwitchPreference pref, boolean grant) { Loading Loading @@ -251,4 +292,16 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { mToggledGroups = null; } } private List<PermissionInfo> getPermissionInfosFromGroup(AppPermissionGroup group) { ArrayList<PermissionInfo> permInfos = new ArrayList<>(group.getPermissions().size()); for(Permission perm : group.getPermissions()) { try { permInfos.add(mPackageManager.getPermissionInfo(perm.getName(), 0)); } catch (PackageManager.NameNotFoundException e) { Log.w(LOG_TAG, "No permission:" + perm.getName()); } } return permInfos; } } src/com/android/packageinstaller/permission/utils/Utils.java +10 −0 Original line number Diff line number Diff line Loading @@ -145,4 +145,14 @@ public final class Utils { return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 && !launcherPkgs.contains(info.packageName); } public static boolean areGroupPermissionsIndividuallyControlled(Context context, String group) { if (!context.getResources().getBoolean( com.android.internal.R.bool.config_permissionReviewRequired)) { return false; } return Manifest.permission_group.SMS.equals(group) || Manifest.permission_group.PHONE.equals(group) || Manifest.permission_group.CONTACTS.equals(group); } } Loading
src/com/android/packageinstaller/permission/ui/wear/AppPermissionsFragmentWear.java +106 −53 Original line number Diff line number Diff line Loading @@ -22,6 +22,7 @@ import android.app.Fragment; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PermissionInfo; import android.os.Bundle; import android.os.UserHandle; import android.preference.Preference; Loading @@ -38,6 +39,7 @@ import android.widget.Toast; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.AppPermissions; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.utils.LocationUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; import com.android.packageinstaller.permission.utils.Utils; Loading @@ -63,6 +65,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { return fragment; } private PackageManager mPackageManager; private List<AppPermissionGroup> mToggledGroups; private AppPermissions mAppPermissions; Loading Loading @@ -103,11 +106,12 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { String packageName = getArguments().getString(Intent.EXTRA_PACKAGE_NAME); Activity activity = getActivity(); PackageManager pm = activity.getPackageManager(); mPackageManager = activity.getPackageManager(); PackageInfo packageInfo; try { packageInfo = pm.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); packageInfo = mPackageManager.getPackageInfo(packageName, PackageManager.GET_PERMISSIONS); } catch (PackageManager.NameNotFoundException e) { Log.i(LOG_TAG, "No package:" + activity.getCallingPackage(), e); packageInfo = null; Loading Loading @@ -149,7 +153,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { private void initializePermissionGroupList() { final String packageName = mAppPermissions.getPackageInfo().packageName; List<AppPermissionGroup> groups = mAppPermissions.getPermissionGroups(); List<SwitchPreference> nonSystemGroups = new ArrayList<>(); List<SwitchPreference> nonSystemPreferences = new ArrayList<>(); if (!groups.isEmpty()) { getPreferenceScreen().removePreference(findPreference(KEY_NO_PERMISSIONS)); Loading @@ -162,7 +166,56 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { boolean isPlatform = group.getDeclaringPackage().equals(Utils.OS_PKG); if (Utils.areGroupPermissionsIndividuallyControlled(getContext(), group.getName())) { // If permission is controlled individually, we show all requested permission // inside this group. for (PermissionInfo perm : getPermissionInfosFromGroup(group)) { final SwitchPreference pref = createSwitchPreferenceForPermission(group, perm); showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform); } } else { final SwitchPreference pref = createSwitchPreferenceForGroup(group); showOrAddToNonSystemPreferences(pref, nonSystemPreferences, isPlatform); } } // Now add the non-system settings to the end of the list for (SwitchPreference nonSystemPreference : nonSystemPreferences) { getPreferenceScreen().addPreference(nonSystemPreference); } } private void showOrAddToNonSystemPreferences(SwitchPreference pref, List<SwitchPreference> nonSystemPreferences, // Mutate boolean isPlatform) { // The UI shows System settings first, then non-system settings if (isPlatform) { getPreferenceScreen().addPreference(pref); } else { nonSystemPreferences.add(pref); } } private SwitchPreference createSwitchPreferenceForPermission(AppPermissionGroup group, PermissionInfo perm) { final SwitchPreference pref = new PermissionSwitchPreference(getActivity()); pref.setKey(perm.name); pref.setTitle(perm.loadLabel(mPackageManager)); pref.setChecked(group.areRuntimePermissionsGranted(new String[]{ perm.name })); pref.setOnPreferenceChangeListener((p, newVal) -> { if((Boolean) newVal) { group.grantRuntimePermissions(false, new String[]{ perm.name }); } else { group.revokeRuntimePermissions(true, new String[]{ perm.name }); } return true; }); return pref; } private SwitchPreference createSwitchPreferenceForGroup(AppPermissionGroup group) { final SwitchPreference pref = new PermissionSwitchPreference(getActivity()); pref.setKey(group.getName()); pref.setTitle(group.getLabel()); pref.setChecked(group.areRuntimePermissionsGranted()); Loading Loading @@ -207,19 +260,7 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { return true; }); } // The UI shows System settings first, then non-system settings if (isPlatform) { getPreferenceScreen().addPreference(pref); } else { nonSystemGroups.add(pref); } } // Now add the non-system settings to the end of the list for (SwitchPreference nonSystemGroup : nonSystemGroups) { getPreferenceScreen().addPreference(nonSystemGroup); } return pref; } private void setPermission(AppPermissionGroup group, SwitchPreference pref, boolean grant) { Loading Loading @@ -251,4 +292,16 @@ public final class AppPermissionsFragmentWear extends PreferenceFragment { mToggledGroups = null; } } private List<PermissionInfo> getPermissionInfosFromGroup(AppPermissionGroup group) { ArrayList<PermissionInfo> permInfos = new ArrayList<>(group.getPermissions().size()); for(Permission perm : group.getPermissions()) { try { permInfos.add(mPackageManager.getPermissionInfo(perm.getName(), 0)); } catch (PackageManager.NameNotFoundException e) { Log.w(LOG_TAG, "No permission:" + perm.getName()); } } return permInfos; } }
src/com/android/packageinstaller/permission/utils/Utils.java +10 −0 Original line number Diff line number Diff line Loading @@ -145,4 +145,14 @@ public final class Utils { return info.isSystemApp() && (info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 0 && !launcherPkgs.contains(info.packageName); } public static boolean areGroupPermissionsIndividuallyControlled(Context context, String group) { if (!context.getResources().getBoolean( com.android.internal.R.bool.config_permissionReviewRequired)) { return false; } return Manifest.permission_group.SMS.equals(group) || Manifest.permission_group.PHONE.equals(group) || Manifest.permission_group.CONTACTS.equals(group); } }