Revert "Refactor: Group AppOps related info together"
Revert submission 27392016-cherrypick-AppOpsController-AppOps-w48m53c1or
Reason for revert: <Potential culprit for b/341210811- verifying through ABTD before revert submission. This is part of the standard investigation process, and does not mean your CL will be reverted.>
Reverted changes: /q/submissionid:27392016-cherrypick-AppOpsController-AppOps-w48m53c1or
Change-Id: I836180b00d88f995c2d69df54991c2d8edaa94b7
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt
index 8276e18..6e9bde4 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/model/app/AppOpsController.kt
@@ -29,46 +29,36 @@
import kotlinx.coroutines.flow.map
interface IAppOpsController {
- val modeFlow: Flow<Int>
+ val mode: Flow<Int>
val isAllowed: Flow<Boolean>
- get() = modeFlow.map { it == MODE_ALLOWED }
+ get() = mode.map { it == MODE_ALLOWED }
fun setAllowed(allowed: Boolean)
@Mode fun getMode(): Int
}
-data class AppOps(
- val op: Int,
- val modeForNotAllowed: Int = MODE_ERRORED,
-
- /**
- * Use AppOpsManager#setUidMode() instead of AppOpsManager#setMode() when set allowed.
- *
- * Security or privacy related app-ops should be set with setUidMode() instead of setMode().
- */
- val setModeByUid: Boolean = false,
-)
-
class AppOpsController(
context: Context,
private val app: ApplicationInfo,
- private val appOps: AppOps,
+ private val op: Int,
+ private val modeForNotAllowed: Int = MODE_ERRORED,
+ private val setModeByUid: Boolean = false,
) : IAppOpsController {
private val appOpsManager = context.appOpsManager
private val packageManager = context.packageManager
- override val modeFlow = appOpsManager.opModeFlow(appOps.op, app)
+ override val mode = appOpsManager.opModeFlow(op, app)
override fun setAllowed(allowed: Boolean) {
- val mode = if (allowed) MODE_ALLOWED else appOps.modeForNotAllowed
+ val mode = if (allowed) MODE_ALLOWED else modeForNotAllowed
- if (appOps.setModeByUid) {
- appOpsManager.setUidMode(appOps.op, app.uid, mode)
+ if (setModeByUid) {
+ appOpsManager.setUidMode(op, app.uid, mode)
} else {
- appOpsManager.setMode(appOps.op, app.uid, app.packageName, mode)
+ appOpsManager.setMode(op, app.uid, app.packageName, mode)
}
- val permission = AppOpsManager.opToPermission(appOps.op)
+ val permission = AppOpsManager.opToPermission(op)
if (permission != null) {
packageManager.updatePermissionFlags(permission, app.packageName,
PackageManager.FLAG_PERMISSION_USER_SET,
@@ -77,6 +67,5 @@
}
}
- @Mode
- override fun getMode(): Int = appOpsManager.getOpMode(appOps.op, app)
+ @Mode override fun getMode(): Int = appOpsManager.getOpMode(op, app)
}
diff --git a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt
index 37b1d73..5db5eae 100644
--- a/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt
+++ b/packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppList.kt
@@ -23,7 +23,6 @@
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import com.android.settingslib.spa.framework.util.asyncMapItem
import com.android.settingslib.spa.framework.util.filterItem
-import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.IAppOpsController
@@ -45,11 +44,11 @@
private val packageManagers: IPackageManagers = PackageManagers,
) : TogglePermissionAppListModel<AppOpPermissionRecord> {
- abstract val appOps: AppOps
+ abstract val appOp: Int
abstract val permission: String
override val enhancedConfirmationKey: String?
- get() = AppOpsManager.opToPublicName(appOps.op)
+ get() = AppOpsManager.opToPublicName(appOp)
/**
* When set, specifies the broader permission who trumps the [permission].
@@ -66,12 +65,27 @@
*/
open val permissionHasAppOpFlag: Boolean = true
+ open val modeForNotAllowed: Int = AppOpsManager.MODE_ERRORED
+
+ /**
+ * Use AppOpsManager#setUidMode() instead of AppOpsManager#setMode() when set allowed.
+ *
+ * Security or privacy related app-ops should be set with setUidMode() instead of setMode().
+ */
+ open val setModeByUid = false
+
/** These not changeable packages will also be hidden from app list. */
private val notChangeablePackages =
setOf("android", "com.android.systemui", context.packageName)
private fun createAppOpsController(app: ApplicationInfo) =
- AppOpsController(context, app, appOps)
+ AppOpsController(
+ context = context,
+ app = app,
+ op = appOp,
+ setModeByUid = setModeByUid,
+ modeForNotAllowed = modeForNotAllowed,
+ )
private fun createRecord(
app: ApplicationInfo,
@@ -152,7 +166,7 @@
return { true }
}
- val mode = appOpsController.modeFlow.collectAsStateWithLifecycle(initialValue = null)
+ val mode = appOpsController.mode.collectAsStateWithLifecycle(initialValue = null)
return {
when (mode.value) {
null -> null
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppOpsControllerTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppOpsControllerTest.kt
index 74a7c14..91bbd9f 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppOpsControllerTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/model/app/AppOpsControllerTest.kt
@@ -27,14 +27,16 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spaprivileged.framework.common.appOpsManager
import com.google.common.truth.Truth.assertThat
+import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.Spy
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule
-import org.mockito.kotlin.doReturn
-import org.mockito.kotlin.mock
-import org.mockito.kotlin.spy
+import org.mockito.kotlin.any
+import org.mockito.kotlin.doNothing
import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@@ -42,18 +44,28 @@
class AppOpsControllerTest {
@get:Rule val mockito: MockitoRule = MockitoJUnit.rule()
- private val appOpsManager = mock<AppOpsManager>()
+ @Spy private val context: Context = ApplicationProvider.getApplicationContext()
- private val packageManager = mock<PackageManager>()
+ @Mock private lateinit var appOpsManager: AppOpsManager
- private val context: Context = spy(ApplicationProvider.getApplicationContext()) {
- on { appOpsManager } doReturn appOpsManager
- on { packageManager } doReturn packageManager
+ @Mock private lateinit var packageManager: PackageManager
+
+ @Before
+ fun setUp() {
+ whenever(context.appOpsManager).thenReturn(appOpsManager)
+ whenever(context.packageManager).thenReturn(packageManager)
+ doNothing().whenever(packageManager)
+ .updatePermissionFlags(any(), any(), any(), any(), any())
}
@Test
fun setAllowed_setToTrue() {
- val controller = AppOpsController(context = context, app = APP, appOps = AppOps(OP))
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ )
controller.setAllowed(true)
@@ -62,7 +74,12 @@
@Test
fun setAllowed_setToFalse() {
- val controller = AppOpsController(context = context, app = APP, appOps = AppOps(OP))
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ )
controller.setAllowed(false)
@@ -71,11 +88,13 @@
@Test
fun setAllowed_setToFalseWithModeForNotAllowed() {
- val controller = AppOpsController(
- context = context,
- app = APP,
- appOps = AppOps(op = OP, modeForNotAllowed = MODE_IGNORED),
- )
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ modeForNotAllowed = MODE_IGNORED,
+ )
controller.setAllowed(false)
@@ -84,11 +103,13 @@
@Test
fun setAllowed_setToTrueByUid() {
- val controller = AppOpsController(
- context = context,
- app = APP,
- appOps = AppOps(op = OP, setModeByUid = true),
- )
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ setModeByUid = true,
+ )
controller.setAllowed(true)
@@ -97,11 +118,13 @@
@Test
fun setAllowed_setToFalseByUid() {
- val controller = AppOpsController(
- context = context,
- app = APP,
- appOps = AppOps(op = OP, setModeByUid = true),
- )
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ setModeByUid = true,
+ )
controller.setAllowed(false)
@@ -112,7 +135,12 @@
fun getMode() {
whenever(appOpsManager.checkOpNoThrow(OP, APP.uid, APP.packageName))
.thenReturn(MODE_ALLOWED)
- val controller = AppOpsController(context = context, app = APP, appOps = AppOps(OP))
+ val controller =
+ AppOpsController(
+ context = context,
+ app = APP,
+ op = OP,
+ )
val mode = controller.getMode()
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppListTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppListTest.kt
index 07ccdd5..bb25cf3b 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppListTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppListTest.kt
@@ -25,7 +25,6 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
import com.android.settingslib.spaprivileged.framework.common.appOpsManager
-import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.model.app.IAppOpsController
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.test.R
@@ -40,6 +39,7 @@
import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock
import org.mockito.kotlin.spy
+import org.mockito.kotlin.verify
import org.mockito.kotlin.whenever
@RunWith(AndroidJUnit4::class)
@@ -287,6 +287,16 @@
assertThat(appOpsController.setAllowedCalledWith).isTrue()
}
+ @Test
+ fun setAllowed_setModeByUid() {
+ listModel.setModeByUid = true
+ val record = listModel.transformItem(APP)
+
+ listModel.setAllowed(record = record, newAllowed = true)
+
+ verify(appOpsManager).setUidMode(listModel.appOp, APP.uid, AppOpsManager.MODE_ALLOWED)
+ }
+
private fun getIsAllowed(record: AppOpPermissionRecord): Boolean? {
lateinit var isAllowedState: () -> Boolean?
composeTestRule.setContent { isAllowedState = listModel.isAllowed(record) }
@@ -299,9 +309,11 @@
override val switchTitleResId = R.string.test_app_op_permission_switch_title
override val footerResId = R.string.test_app_op_permission_footer
- override val appOps = AppOps(AppOpsManager.OP_MANAGE_MEDIA)
+ override val appOp = AppOpsManager.OP_MANAGE_MEDIA
override val permission = PERMISSION
override var broaderPermission: String? = null
+
+ override var setModeByUid = false
}
private companion object {
@@ -317,7 +329,7 @@
private class FakeAppOpsController(private val fakeMode: Int) : IAppOpsController {
var setAllowedCalledWith: Boolean? = null
- override val modeFlow = flowOf(fakeMode)
+ override val mode = flowOf(fakeMode)
override fun setAllowed(allowed: Boolean) {
setAllowedCalledWith = allowed