Loading services/permission/java/com/android/server/permission/access/permission/PermissionService.kt +38 −12 Original line number Diff line number Diff line Loading @@ -469,8 +469,9 @@ class PermissionService(private val service: AccessCheckingService) : permissionName: String, deviceId: String ): Int { val pid = Binder.getCallingPid() val uid = Binder.getCallingUid() val result = context.checkPermission(permissionName, Binder.getCallingPid(), uid) val result = context.checkPermission(permissionName, pid, uid) if (result == PackageManager.PERMISSION_GRANTED) { return Context.PERMISSION_REQUEST_STATE_GRANTED } Loading @@ -481,14 +482,12 @@ class PermissionService(private val service: AccessCheckingService) : packageManagerLocal.withFilteredSnapshot(uid, userId).use { it.getPackageState(packageName) } ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE val androidPackage = packageState.androidPackage ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE val androidPackage = packageState.androidPackage ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE if (appId != packageState.appId) { return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } val permission = service.getState { with(policy) { getPermissions()[permissionName] } } val permission = service.getState { with(policy) { getPermissions()[permissionName] } } if (permission == null || !permission.isRuntime) { return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } Loading @@ -496,10 +495,37 @@ class PermissionService(private val service: AccessCheckingService) : return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } val permissionFlags = service.getState { val permissionFlags = service.getState { getPermissionFlagsWithPolicy(appId, userId, permissionName, deviceId) } return if (permissionFlags.hasAnyBit(UNREQUESTABLE_MASK)) { val isUnreqestable = permissionFlags.hasAnyBit(UNREQUESTABLE_MASK) // Special case for READ_MEDIA_IMAGES due to photo picker if ((permissionName == Manifest.permission.READ_MEDIA_IMAGES || permissionName == Manifest.permission.READ_MEDIA_VIDEO) && isUnreqestable) { val isUserSelectedGranted = context.checkPermission( Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED, pid, uid, ) == PackageManager.PERMISSION_GRANTED val userSelectedPermissionFlags = service.getState { getPermissionFlagsWithPolicy( appId, userId, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED, deviceId, ) } if ( isUserSelectedGranted && userSelectedPermissionFlags.hasBits(PermissionFlags.USER_FIXED) ) { return Context.PERMISSION_REQUEST_STATE_REQUESTABLE } } return if (isUnreqestable) { Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } else { Context.PERMISSION_REQUEST_STATE_REQUESTABLE Loading Loading
services/permission/java/com/android/server/permission/access/permission/PermissionService.kt +38 −12 Original line number Diff line number Diff line Loading @@ -469,8 +469,9 @@ class PermissionService(private val service: AccessCheckingService) : permissionName: String, deviceId: String ): Int { val pid = Binder.getCallingPid() val uid = Binder.getCallingUid() val result = context.checkPermission(permissionName, Binder.getCallingPid(), uid) val result = context.checkPermission(permissionName, pid, uid) if (result == PackageManager.PERMISSION_GRANTED) { return Context.PERMISSION_REQUEST_STATE_GRANTED } Loading @@ -481,14 +482,12 @@ class PermissionService(private val service: AccessCheckingService) : packageManagerLocal.withFilteredSnapshot(uid, userId).use { it.getPackageState(packageName) } ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE val androidPackage = packageState.androidPackage ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE val androidPackage = packageState.androidPackage ?: return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE if (appId != packageState.appId) { return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } val permission = service.getState { with(policy) { getPermissions()[permissionName] } } val permission = service.getState { with(policy) { getPermissions()[permissionName] } } if (permission == null || !permission.isRuntime) { return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } Loading @@ -496,10 +495,37 @@ class PermissionService(private val service: AccessCheckingService) : return Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } val permissionFlags = service.getState { val permissionFlags = service.getState { getPermissionFlagsWithPolicy(appId, userId, permissionName, deviceId) } return if (permissionFlags.hasAnyBit(UNREQUESTABLE_MASK)) { val isUnreqestable = permissionFlags.hasAnyBit(UNREQUESTABLE_MASK) // Special case for READ_MEDIA_IMAGES due to photo picker if ((permissionName == Manifest.permission.READ_MEDIA_IMAGES || permissionName == Manifest.permission.READ_MEDIA_VIDEO) && isUnreqestable) { val isUserSelectedGranted = context.checkPermission( Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED, pid, uid, ) == PackageManager.PERMISSION_GRANTED val userSelectedPermissionFlags = service.getState { getPermissionFlagsWithPolicy( appId, userId, Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED, deviceId, ) } if ( isUserSelectedGranted && userSelectedPermissionFlags.hasBits(PermissionFlags.USER_FIXED) ) { return Context.PERMISSION_REQUEST_STATE_REQUESTABLE } } return if (isUnreqestable) { Context.PERMISSION_REQUEST_STATE_UNREQUESTABLE } else { Context.PERMISSION_REQUEST_STATE_REQUESTABLE Loading