Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb2d9f7c authored by Manjeet Rulhania's avatar Manjeet Rulhania Committed by Android (Google) Code Review
Browse files

Merge "Clear permissions for virtual devices" into main

parents 13db1201 bfd2e7a5
Loading
Loading
Loading
Loading
+32 −0
Original line number Diff line number Diff line
@@ -61,6 +61,38 @@ class DevicePermissionPolicy : SchemePolicy() {
        }
    }

    fun MutateStateScope.removeInactiveDevicesPermission(activePersistentDeviceIds: Set<String>) {
        newState.userStates.forEachIndexed { _, userId, userState ->
            userState.appIdDevicePermissionFlags.forEachReversedIndexed { _, appId, _ ->
                val appIdDevicePermissionFlags =
                    newState.mutateUserState(userId)!!.mutateAppIdDevicePermissionFlags()
                val devicePermissionFlags =
                    appIdDevicePermissionFlags.mutate(appId) ?: return@forEachReversedIndexed

                val removePersistentDeviceIds = mutableSetOf<String>()
                devicePermissionFlags.forEachIndexed { _, deviceId, _ ->
                    if (!activePersistentDeviceIds.contains(deviceId)) {
                        removePersistentDeviceIds.add(deviceId)
                    }
                }

                removePersistentDeviceIds.forEach { deviceId -> devicePermissionFlags -= deviceId }
            }
        }
    }

    fun MutateStateScope.onDeviceIdRemoved(deviceId: String) {
        newState.userStates.forEachIndexed { _, userId, userState ->
            userState.appIdDevicePermissionFlags.forEachReversedIndexed { _, appId, _ ->
                val appIdDevicePermissionFlags =
                    newState.mutateUserState(userId)!!.mutateAppIdDevicePermissionFlags()
                val devicePermissionFlags =
                    appIdDevicePermissionFlags.mutate(appId) ?: return@forEachReversedIndexed
                devicePermissionFlags -= deviceId
            }
        }
    }

    override fun MutateStateScope.onStorageVolumeMounted(
        volumeUuid: String?,
        packageNames: List<String>,
+15 −4
Original line number Diff line number Diff line
@@ -2314,6 +2314,18 @@ class PermissionService(private val service: AccessCheckingService) :
        service.onSystemReady()
        virtualDeviceManagerInternal =
            LocalServices.getService(VirtualDeviceManagerInternal::class.java)

        virtualDeviceManagerInternal?.allPersistentDeviceIds?.let { persistentDeviceIds ->
            service.mutateState {
                with(devicePolicy) { removeInactiveDevicesPermission(persistentDeviceIds) }
            }
        }

        // trim permission states for the external devices, when they are removed.
        virtualDeviceManagerInternal?.registerPersistentDeviceIdRemovedListener { persistentDeviceId
            ->
            service.mutateState { with(devicePolicy) { onDeviceIdRemoved(persistentDeviceId) } }
        }
        permissionControllerManager =
            PermissionControllerManager(context, PermissionThread.getHandler())
    }
@@ -2681,8 +2693,8 @@ class PermissionService(private val service: AccessCheckingService) :
                        permissionName in NOTIFICATIONS_PERMISSIONS &&
                            runtimePermissionRevokedUids.get(uid, true)
                }
                runtimePermissionChangedUidDevices
                    .getOrPut(uid) { mutableSetOf() } += persistentDeviceId
                runtimePermissionChangedUidDevices.getOrPut(uid) { mutableSetOf() } +=
                    persistentDeviceId
            }

            if (permission.hasGids && !wasPermissionGranted && isPermissionGranted) {
@@ -2799,8 +2811,7 @@ class PermissionService(private val service: AccessCheckingService) :

        fun onPermissionsChanged(uid: Int, persistentDeviceId: String) {
            if (listeners.registeredCallbackCount > 0) {
                obtainMessage(MSG_ON_PERMISSIONS_CHANGED, uid, 0, persistentDeviceId)
                    .sendToTarget()
                obtainMessage(MSG_ON_PERMISSIONS_CHANGED, uid, 0, persistentDeviceId).sendToTarget()
            }
        }