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

Commit 85a51570 authored by Hai Zhang's avatar Hai Zhang
Browse files

Allow getting and removing app op modes for non-existent users.

This may happen due to raciness and inconsistent state read from
disks, and the previous app ops implementation allows it, so keep the
same behavior for now.

Bug: 263504888
Test: Fixes system server crashes in ag/20828667 presubmit
Change-Id: I2fbebb909dfef19d1661d850710034ce5ff9f36c
parent 0f8a89a8
Loading
Loading
Loading
Loading
+9 −4
Original line number Diff line number Diff line
@@ -72,19 +72,24 @@ class AppIdAppOpPolicy : BaseAppOpPolicy(AppIdAppOpPersistence()) {
    }

    fun GetStateScope.getAppOpModes(appId: Int, userId: Int): IndexedMap<String, Int>? =
        state.userStates[userId]!!.appIdAppOpModes[appId]
        state.userStates[userId]?.appIdAppOpModes?.get(appId)

    fun MutateStateScope.removeAppOpModes(appId: Int, userId: Int): Boolean {
        val appIdIndex = newState.userStates[userId]!!.appIdAppOpModes.indexOfKey(appId)
        val userStateIndex = newState.userStates.indexOfKey(userId)
        if (userStateIndex < 0) {
            return false
        }
        val appIdIndex = newState.userStates.valueAt(userStateIndex).appIdAppOpModes
            .indexOfKey(appId)
        if (appIdIndex < 0) {
            return false
        }
        newState.mutateUserState(userId)!!.mutateAppIdAppOpModes().removeAt(appIdIndex)
        newState.mutateUserStateAt(userStateIndex).mutateAppIdAppOpModes().removeAt(appIdIndex)
        return true
    }

    fun GetStateScope.getAppOpMode(appId: Int, userId: Int, appOpName: String): Int =
        state.userStates[userId]!!.appIdAppOpModes[appId]
        state.userStates[userId]?.appIdAppOpModes?.get(appId)
            .getWithDefault(appOpName, AppOpsManager.opToDefaultMode(appOpName))

    fun MutateStateScope.setAppOpMode(
+9 −4
Original line number Diff line number Diff line
@@ -72,20 +72,25 @@ class PackageAppOpPolicy : BaseAppOpPolicy(PackageAppOpPersistence()) {
    }

    fun GetStateScope.getAppOpModes(packageName: String, userId: Int): IndexedMap<String, Int>? =
        state.userStates[userId]!!.packageAppOpModes[packageName]
        state.userStates[userId]?.packageAppOpModes?.get(packageName)

    fun MutateStateScope.removeAppOpModes(packageName: String, userId: Int): Boolean {
        val packageNameIndex = newState.userStates[userId]!!.packageAppOpModes
        val userStateIndex = newState.userStates.indexOfKey(userId)
        if (userStateIndex < 0) {
            return false
        }
        val packageNameIndex = newState.userStates.valueAt(userStateIndex).packageAppOpModes
            .indexOfKey(packageName)
        if (packageNameIndex < 0) {
            return false
        }
        newState.mutateUserState(userId)!!.mutatePackageAppOpModes().removeAt(packageNameIndex)
        newState.mutateUserStateAt(userStateIndex).mutatePackageAppOpModes()
            .removeAt(packageNameIndex)
        return true
    }

    fun GetStateScope.getAppOpMode(packageName: String, userId: Int, appOpName: String): Int =
        state.userStates[userId]!!.packageAppOpModes[packageName]
        state.userStates[userId]?.packageAppOpModes?.get(packageName)
            .getWithDefault(appOpName, AppOpsManager.opToDefaultMode(appOpName))

    fun MutateStateScope.setAppOpMode(