Loading src/com/android/packageinstaller/permission/model/AppPermissionGroup.java +4 −2 Original line number Diff line number Diff line Loading @@ -464,12 +464,14 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> mUserHandle); } } else { if (!permission.isUserSet()) { if (!permission.isUserSet() || permission.isUserFixed()) { permission.setUserSet(true); permission.setUserFixed(false); // Take a note that the user already chose once. mPackageManager.updatePermissionFlags(permission.getName(), mPackageInfo.packageName, PackageManager.FLAG_PERMISSION_USER_SET, PackageManager.FLAG_PERMISSION_USER_SET | PackageManager.FLAG_PERMISSION_USER_FIXED, PackageManager.FLAG_PERMISSION_USER_SET, mUserHandle); } Loading src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java +66 −5 Original line number Diff line number Diff line Loading @@ -37,13 +37,17 @@ import android.provider.Settings; import android.util.Log; import android.view.MenuItem; import android.widget.Switch; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public final class AllAppPermissionsFragment extends SettingsWithHeader { Loading @@ -54,6 +58,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { private static final String EXTRA_FILTER_GROUP = "com.android.packageinstaller.extra.FILTER_GROUP"; private List<AppPermissionGroup> mGroups; public static AllAppPermissionsFragment newInstance(String packageName) { return newInstance(packageName, null); } Loading Loading @@ -229,7 +235,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { // We allow individual permission control for some permissions if review enabled final boolean mutable = Utils.isPermissionIndividuallyControlled(getContext(), perm.name); if (mutable) { pref = new MyMultiTargetSwitchPreference(getContext(), packageInfo, perm.name); pref = new MyMultiTargetSwitchPreference(getContext(), perm.name, getPermissionGroup(packageInfo, perm.name)); } else { pref = new Preference(getContext()); } Loading Loading @@ -257,13 +264,35 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { return pref; } private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference { public MyMultiTargetSwitchPreference(Context context, PackageInfo packageInfo, private AppPermissionGroup getPermissionGroup(PackageInfo packageInfo, String permission) { AppPermissionGroup appPermissionGroup = null; if (mGroups != null) { final int groupCount = mGroups.size(); for (int i = 0; i < groupCount; i++) { AppPermissionGroup currentPermissionGroup = mGroups.get(i); if (currentPermissionGroup.hasPermission(permission)) { appPermissionGroup = currentPermissionGroup; break; } } } if (appPermissionGroup == null) { appPermissionGroup = AppPermissionGroup.create( getContext(), packageInfo, permission); if (mGroups == null) { mGroups = new ArrayList<>(); } mGroups.add(appPermissionGroup); } return appPermissionGroup; } private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference { MyMultiTargetSwitchPreference(Context context, String permission, AppPermissionGroup appPermissionGroup) { super(context); AppPermissionGroup appPermissionGroup = AppPermissionGroup.create( getContext(), packageInfo, permission); setChecked(appPermissionGroup.areRuntimePermissionsGranted( new String[] {permission})); Loading @@ -272,9 +301,41 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { if (switchView.isChecked()) { appPermissionGroup.grantRuntimePermissions(false, new String[]{permission}); // We are granting a permission from a group but since this is an // individual permission control other permissions in the group may // be revoked, hence we need to mark them user fixed to prevent the // app from requesting a non-granted permission and it being granted // because another permission in the group is granted. This applies // only to apps that support runtime permissions. if (appPermissionGroup.doesSupportRuntimePermissions()) { String[] revokedPermissionsToFix = null; final int permissionCount = appPermissionGroup.getPermissions().size(); for (int i = 0; i < permissionCount; i++) { Permission current = appPermissionGroup.getPermissions().get(i); if (!current.isGranted() && !current.isUserFixed()) { revokedPermissionsToFix = ArrayUtils.appendString( revokedPermissionsToFix, current.getName()); } } if (revokedPermissionsToFix != null) { // If some permissions were not granted then they should be fixed. appPermissionGroup.revokeRuntimePermissions(true, revokedPermissionsToFix); } else { // If all permissions are granted then they should not be fixed. appPermissionGroup.grantRuntimePermissions(false); } } } else { appPermissionGroup.revokeRuntimePermissions(true, new String[]{permission}); // If we just revoked the last permission we need to clear // the user fixed state as now the app should be able to // request them at runtime if supported. if (appPermissionGroup.doesSupportRuntimePermissions() && !appPermissionGroup.areRuntimePermissionsGranted()) { appPermissionGroup.revokeRuntimePermissions(false); } } }); } Loading src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; Loading Loading
src/com/android/packageinstaller/permission/model/AppPermissionGroup.java +4 −2 Original line number Diff line number Diff line Loading @@ -464,12 +464,14 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup> mUserHandle); } } else { if (!permission.isUserSet()) { if (!permission.isUserSet() || permission.isUserFixed()) { permission.setUserSet(true); permission.setUserFixed(false); // Take a note that the user already chose once. mPackageManager.updatePermissionFlags(permission.getName(), mPackageInfo.packageName, PackageManager.FLAG_PERMISSION_USER_SET, PackageManager.FLAG_PERMISSION_USER_SET | PackageManager.FLAG_PERMISSION_USER_FIXED, PackageManager.FLAG_PERMISSION_USER_SET, mUserHandle); } Loading
src/com/android/packageinstaller/permission/ui/handheld/AllAppPermissionsFragment.java +66 −5 Original line number Diff line number Diff line Loading @@ -37,13 +37,17 @@ import android.provider.Settings; import android.util.Log; import android.view.MenuItem; import android.widget.Switch; import com.android.packageinstaller.R; import com.android.packageinstaller.permission.model.AppPermissionGroup; import com.android.packageinstaller.permission.model.Permission; import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.Utils; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public final class AllAppPermissionsFragment extends SettingsWithHeader { Loading @@ -54,6 +58,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { private static final String EXTRA_FILTER_GROUP = "com.android.packageinstaller.extra.FILTER_GROUP"; private List<AppPermissionGroup> mGroups; public static AllAppPermissionsFragment newInstance(String packageName) { return newInstance(packageName, null); } Loading Loading @@ -229,7 +235,8 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { // We allow individual permission control for some permissions if review enabled final boolean mutable = Utils.isPermissionIndividuallyControlled(getContext(), perm.name); if (mutable) { pref = new MyMultiTargetSwitchPreference(getContext(), packageInfo, perm.name); pref = new MyMultiTargetSwitchPreference(getContext(), perm.name, getPermissionGroup(packageInfo, perm.name)); } else { pref = new Preference(getContext()); } Loading Loading @@ -257,13 +264,35 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { return pref; } private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference { public MyMultiTargetSwitchPreference(Context context, PackageInfo packageInfo, private AppPermissionGroup getPermissionGroup(PackageInfo packageInfo, String permission) { AppPermissionGroup appPermissionGroup = null; if (mGroups != null) { final int groupCount = mGroups.size(); for (int i = 0; i < groupCount; i++) { AppPermissionGroup currentPermissionGroup = mGroups.get(i); if (currentPermissionGroup.hasPermission(permission)) { appPermissionGroup = currentPermissionGroup; break; } } } if (appPermissionGroup == null) { appPermissionGroup = AppPermissionGroup.create( getContext(), packageInfo, permission); if (mGroups == null) { mGroups = new ArrayList<>(); } mGroups.add(appPermissionGroup); } return appPermissionGroup; } private static final class MyMultiTargetSwitchPreference extends MultiTargetSwitchPreference { MyMultiTargetSwitchPreference(Context context, String permission, AppPermissionGroup appPermissionGroup) { super(context); AppPermissionGroup appPermissionGroup = AppPermissionGroup.create( getContext(), packageInfo, permission); setChecked(appPermissionGroup.areRuntimePermissionsGranted( new String[] {permission})); Loading @@ -272,9 +301,41 @@ public final class AllAppPermissionsFragment extends SettingsWithHeader { if (switchView.isChecked()) { appPermissionGroup.grantRuntimePermissions(false, new String[]{permission}); // We are granting a permission from a group but since this is an // individual permission control other permissions in the group may // be revoked, hence we need to mark them user fixed to prevent the // app from requesting a non-granted permission and it being granted // because another permission in the group is granted. This applies // only to apps that support runtime permissions. if (appPermissionGroup.doesSupportRuntimePermissions()) { String[] revokedPermissionsToFix = null; final int permissionCount = appPermissionGroup.getPermissions().size(); for (int i = 0; i < permissionCount; i++) { Permission current = appPermissionGroup.getPermissions().get(i); if (!current.isGranted() && !current.isUserFixed()) { revokedPermissionsToFix = ArrayUtils.appendString( revokedPermissionsToFix, current.getName()); } } if (revokedPermissionsToFix != null) { // If some permissions were not granted then they should be fixed. appPermissionGroup.revokeRuntimePermissions(true, revokedPermissionsToFix); } else { // If all permissions are granted then they should not be fixed. appPermissionGroup.grantRuntimePermissions(false); } } } else { appPermissionGroup.revokeRuntimePermissions(true, new String[]{permission}); // If we just revoked the last permission we need to clear // the user fixed state as now the app should be able to // request them at runtime if supported. if (appPermissionGroup.doesSupportRuntimePermissions() && !appPermissionGroup.areRuntimePermissionsGranted()) { appPermissionGroup.revokeRuntimePermissions(false); } } }); } Loading
src/com/android/packageinstaller/permission/ui/television/AllAppPermissionsFragment.java +0 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,6 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.provider.Settings; import android.support.v14.preference.SwitchPreference; Loading