Loading src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +41 −9 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.Icon; import android.hardware.camera2.utils.ArrayUtils; import android.os.Build; import android.os.Bundle; import android.text.SpannableString; Loading @@ -47,6 +46,7 @@ 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.ui.handheld.GrantPermissionsViewHandlerImpl; import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; import java.util.ArrayList; Loading Loading @@ -147,24 +147,36 @@ public class GrantPermissionsActivity extends OverlayTouchActivity switch (permissionPolicy) { case DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT: { if (!group.areRuntimePermissionsGranted()) { group.grantRuntimePermissions(false); group.grantRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); } group.setPolicyFixed(); } break; case DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY: { if (group.areRuntimePermissionsGranted()) { group.revokeRuntimePermissions(false); group.revokeRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); } group.setPolicyFixed(); } break; default: { if (!group.areRuntimePermissionsGranted()) { mRequestGrantPermissionGroups.put(group.getName(), new GroupState(group)); GroupState state = mRequestGrantPermissionGroups.get(group.getName()); if (state == null) { state = new GroupState(group); mRequestGrantPermissionGroups.put(group.getName(), state); } String affectedPermission = computeAffectedPermission( callingPackageInfo, requestedPermission); if (affectedPermission != null) { state.affectedPermissions = ArrayUtils.appendString( state.affectedPermissions, affectedPermission); } } else { group.grantRuntimePermissions(false); group.grantRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); updateGrantResults(group); } } break; Loading Loading @@ -271,10 +283,12 @@ public class GrantPermissionsActivity extends OverlayTouchActivity GroupState groupState = mRequestGrantPermissionGroups.get(name); if (groupState.mGroup != null) { if (granted) { groupState.mGroup.grantRuntimePermissions(doNotAskAgain); groupState.mGroup.grantRuntimePermissions(doNotAskAgain, groupState.affectedPermissions); groupState.mState = GroupState.STATE_ALLOWED; } else { groupState.mGroup.revokeRuntimePermissions(doNotAskAgain); groupState.mGroup.revokeRuntimePermissions(doNotAskAgain, groupState.affectedPermissions); groupState.mState = GroupState.STATE_DENIED; } updateGrantResults(groupState.mGroup); Loading @@ -286,7 +300,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity private void updateGrantResults(AppPermissionGroup group) { for (Permission permission : group.getPermissions()) { final int index = ArrayUtils.getArrayIndex( final int index = ArrayUtils.indexOf( mRequestedPermissions, permission.getName()); if (index >= 0) { mGrantResults[index] = permission.isGranted() ? PackageManager.PERMISSION_GRANTED Loading Loading @@ -402,6 +416,23 @@ public class GrantPermissionsActivity extends OverlayTouchActivity SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups); } private static String[] computeAffectedPermissions(PackageInfo callingPackageInfo, String permission) { String affectedPermission = computeAffectedPermission(callingPackageInfo, permission); if (affectedPermission != null) { return new String[] {permission}; } return null; } private static String computeAffectedPermission(PackageInfo callingPackageInfo, String permission) { if (callingPackageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) { return permission; } return null; } private static final class GroupState { static final int STATE_UNKNOWN = 0; static final int STATE_ALLOWED = 1; Loading @@ -409,6 +440,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity final AppPermissionGroup mGroup; int mState = STATE_UNKNOWN; String[] affectedPermissions; GroupState(AppPermissionGroup group) { mGroup = group; Loading src/com/android/packageinstaller/permission/utils/ArrayUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.packageinstaller.permission.utils; import android.text.TextUtils; import java.util.Objects; public final class ArrayUtils { Loading @@ -42,4 +44,20 @@ public final class ArrayUtils { } return -1; } public static String[] appendString(String[] cur, String val) { if (cur == null) { return new String[] { val }; } final int N = cur.length; for (int i = 0; i < N; i++) { if (TextUtils.equals(cur[i], val)) { return cur; } } String[] ret = new String[N + 1]; System.arraycopy(cur, 0, ret, 0, N); ret[N] = val; return ret; } } Loading
src/com/android/packageinstaller/permission/ui/GrantPermissionsActivity.java +41 −9 Original line number Diff line number Diff line Loading @@ -29,7 +29,6 @@ import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Typeface; import android.graphics.drawable.Icon; import android.hardware.camera2.utils.ArrayUtils; import android.os.Build; import android.os.Bundle; import android.text.SpannableString; Loading @@ -47,6 +46,7 @@ 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.ui.handheld.GrantPermissionsViewHandlerImpl; import com.android.packageinstaller.permission.utils.ArrayUtils; import com.android.packageinstaller.permission.utils.SafetyNetLogger; import java.util.ArrayList; Loading Loading @@ -147,24 +147,36 @@ public class GrantPermissionsActivity extends OverlayTouchActivity switch (permissionPolicy) { case DevicePolicyManager.PERMISSION_POLICY_AUTO_GRANT: { if (!group.areRuntimePermissionsGranted()) { group.grantRuntimePermissions(false); group.grantRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); } group.setPolicyFixed(); } break; case DevicePolicyManager.PERMISSION_POLICY_AUTO_DENY: { if (group.areRuntimePermissionsGranted()) { group.revokeRuntimePermissions(false); group.revokeRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); } group.setPolicyFixed(); } break; default: { if (!group.areRuntimePermissionsGranted()) { mRequestGrantPermissionGroups.put(group.getName(), new GroupState(group)); GroupState state = mRequestGrantPermissionGroups.get(group.getName()); if (state == null) { state = new GroupState(group); mRequestGrantPermissionGroups.put(group.getName(), state); } String affectedPermission = computeAffectedPermission( callingPackageInfo, requestedPermission); if (affectedPermission != null) { state.affectedPermissions = ArrayUtils.appendString( state.affectedPermissions, affectedPermission); } } else { group.grantRuntimePermissions(false); group.grantRuntimePermissions(false, computeAffectedPermissions( callingPackageInfo, requestedPermission)); updateGrantResults(group); } } break; Loading Loading @@ -271,10 +283,12 @@ public class GrantPermissionsActivity extends OverlayTouchActivity GroupState groupState = mRequestGrantPermissionGroups.get(name); if (groupState.mGroup != null) { if (granted) { groupState.mGroup.grantRuntimePermissions(doNotAskAgain); groupState.mGroup.grantRuntimePermissions(doNotAskAgain, groupState.affectedPermissions); groupState.mState = GroupState.STATE_ALLOWED; } else { groupState.mGroup.revokeRuntimePermissions(doNotAskAgain); groupState.mGroup.revokeRuntimePermissions(doNotAskAgain, groupState.affectedPermissions); groupState.mState = GroupState.STATE_DENIED; } updateGrantResults(groupState.mGroup); Loading @@ -286,7 +300,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity private void updateGrantResults(AppPermissionGroup group) { for (Permission permission : group.getPermissions()) { final int index = ArrayUtils.getArrayIndex( final int index = ArrayUtils.indexOf( mRequestedPermissions, permission.getName()); if (index >= 0) { mGrantResults[index] = permission.isGranted() ? PackageManager.PERMISSION_GRANTED Loading Loading @@ -402,6 +416,23 @@ public class GrantPermissionsActivity extends OverlayTouchActivity SafetyNetLogger.logPermissionsRequested(mAppPermissions.getPackageInfo(), groups); } private static String[] computeAffectedPermissions(PackageInfo callingPackageInfo, String permission) { String affectedPermission = computeAffectedPermission(callingPackageInfo, permission); if (affectedPermission != null) { return new String[] {permission}; } return null; } private static String computeAffectedPermission(PackageInfo callingPackageInfo, String permission) { if (callingPackageInfo.applicationInfo.targetSdkVersion > Build.VERSION_CODES.M) { return permission; } return null; } private static final class GroupState { static final int STATE_UNKNOWN = 0; static final int STATE_ALLOWED = 1; Loading @@ -409,6 +440,7 @@ public class GrantPermissionsActivity extends OverlayTouchActivity final AppPermissionGroup mGroup; int mState = STATE_UNKNOWN; String[] affectedPermissions; GroupState(AppPermissionGroup group) { mGroup = group; Loading
src/com/android/packageinstaller/permission/utils/ArrayUtils.java +18 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.packageinstaller.permission.utils; import android.text.TextUtils; import java.util.Objects; public final class ArrayUtils { Loading @@ -42,4 +44,20 @@ public final class ArrayUtils { } return -1; } public static String[] appendString(String[] cur, String val) { if (cur == null) { return new String[] { val }; } final int N = cur.length; for (int i = 0; i < N; i++) { if (TextUtils.equals(cur[i], val)) { return cur; } } String[] ret = new String[N + 1]; System.arraycopy(cur, 0, ret, 0, N); ret[N] = val; return ret; } }