Migrate AppOps

Bug: 339846642
Test: manual - on Special app access
Change-Id: I988bdf85036478d8e6d87a3b5a1a46a35df38422
This commit is contained in:
Chaohui Wang
2024-05-16 17:15:37 +08:00
parent 6a2de37817
commit 4573df2aaf
19 changed files with 95 additions and 48 deletions

View File

@@ -28,6 +28,7 @@ import androidx.compose.runtime.Composable
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.R
import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
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.IPackageManagers
@@ -116,8 +117,7 @@ class AlarmsAndRemindersAppListModel(
controller = AppOpsController(
context = context,
app = app,
op = AppOpsManager.OP_SCHEDULE_EXACT_ALARM,
setModeByUid = true,
appOps = APP_OPS,
),
)
}
@@ -136,6 +136,11 @@ class AlarmsAndRemindersAppListModel(
}
companion object {
private val APP_OPS = AppOps(
op = AppOpsManager.OP_SCHEDULE_EXACT_ALARM,
setModeByUid = true,
)
private const val PERMISSION: String = Manifest.permission.SCHEDULE_EXACT_ALARM
/** Checks whether [Manifest.permission.SCHEDULE_EXACT_ALARM] is enabled. */

View File

@@ -22,6 +22,7 @@ import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,9 +36,11 @@ class AllFilesAccessListModel(context: Context) : AppOpPermissionListModel(conte
override val pageTitleResId = R.string.manage_external_storage_title
override val switchTitleResId = R.string.permit_manage_external_storage
override val footerResId = R.string.allow_manage_external_storage_description
override val appOp = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE
override val appOps = AppOps(
op = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE,
setModeByUid = true,
)
override val permission = Manifest.permission.MANAGE_EXTERNAL_STORAGE
override val setModeByUid = true
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
super.setAllowed(record, newAllowed)

View File

@@ -22,6 +22,7 @@ import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,7 +36,7 @@ class DisplayOverOtherAppsListModel(context: Context) : AppOpPermissionListModel
override val pageTitleResId = R.string.system_alert_window_settings
override val switchTitleResId = R.string.permit_draw_overlay
override val footerResId = R.string.allow_overlay_description
override val appOp = AppOpsManager.OP_SYSTEM_ALERT_WINDOW
override val appOps = AppOps(AppOpsManager.OP_SYSTEM_ALERT_WINDOW)
override val permission = Manifest.permission.SYSTEM_ALERT_WINDOW
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {

View File

@@ -20,13 +20,13 @@ import android.Manifest
import android.app.AppGlobals
import android.app.AppOpsManager
import android.app.AppOpsManager.MODE_DEFAULT
import android.app.AppOpsManager.OP_REQUEST_INSTALL_PACKAGES
import android.content.Context
import android.content.pm.ApplicationInfo
import android.os.UserManager
import androidx.compose.runtime.Composable
import com.android.settings.R
import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
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.userId
@@ -61,12 +61,7 @@ class InstallUnknownAppsListModel(private val context: Context) :
override fun transformItem(app: ApplicationInfo) =
InstallUnknownAppsRecord(
app = app,
appOpsController =
AppOpsController(
context = context,
app = app,
op = OP_REQUEST_INSTALL_PACKAGES,
),
appOpsController = AppOpsController(context = context, app = app, appOps = APP_OPS),
)
override fun filter(
@@ -91,6 +86,8 @@ class InstallUnknownAppsListModel(private val context: Context) :
}
companion object {
private val APP_OPS = AppOps(AppOpsManager.OP_REQUEST_INSTALL_PACKAGES)
private fun isChangeable(
record: InstallUnknownAppsRecord,
potentialPackageNames: Set<String>,

View File

@@ -22,6 +22,7 @@ import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,9 +36,11 @@ class LongBackgroundTasksAppsListModel(context: Context) : AppOpPermissionListMo
override val pageTitleResId = R.string.long_background_tasks_title
override val switchTitleResId = R.string.long_background_tasks_switch_title
override val footerResId = R.string.long_background_tasks_footer_title
override val appOp = AppOpsManager.OP_RUN_USER_INITIATED_JOBS
override val appOps = AppOps(
op = AppOpsManager.OP_RUN_USER_INITIATED_JOBS,
setModeByUid = true,
)
override val permission = Manifest.permission.RUN_USER_INITIATED_JOBS
override val setModeByUid = true
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
super.setAllowed(record, newAllowed)

View File

@@ -22,6 +22,7 @@ import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,9 +36,11 @@ class MediaManagementAppsListModel(context: Context) : AppOpPermissionListModel(
override val pageTitleResId = R.string.media_management_apps_title
override val switchTitleResId = R.string.media_management_apps_toggle_label
override val footerResId = R.string.media_management_apps_description
override val appOp = AppOpsManager.OP_MANAGE_MEDIA
override val appOps = AppOps(
op = AppOpsManager.OP_MANAGE_MEDIA,
setModeByUid = true,
)
override val permission = Manifest.permission.MANAGE_MEDIA
override val setModeByUid = true
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
super.setAllowed(record, newAllowed)

View File

@@ -25,6 +25,7 @@ import android.content.Context
import com.android.media.flags.Flags;
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -38,9 +39,11 @@ class MediaRoutingControlAppsListModel(context: Context) : AppOpPermissionListMo
override val pageTitleResId = R.string.media_routing_control_title
override val switchTitleResId = R.string.allow_media_routing_control
override val footerResId = R.string.allow_media_routing_description
override val appOp = AppOpsManager.OP_MEDIA_ROUTING_CONTROL
override val appOps = AppOps(
op = AppOpsManager.OP_MEDIA_ROUTING_CONTROL,
setModeByUid = true,
)
override val permission = Manifest.permission.MEDIA_ROUTING_CONTROL
override val setModeByUid = true
private val roleManager = context.getSystemService(RoleManager::class.java)
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {

View File

@@ -22,6 +22,7 @@ import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,7 +36,7 @@ class ModifySystemSettingsListModel(context: Context) : AppOpPermissionListModel
override val pageTitleResId = R.string.write_system_settings
override val switchTitleResId = R.string.permit_write_settings
override val footerResId = R.string.write_settings_description
override val appOp = AppOpsManager.OP_WRITE_SETTINGS
override val appOps = AppOps(AppOpsManager.OP_WRITE_SETTINGS)
override val permission = Manifest.permission.WRITE_SETTINGS
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {

View File

@@ -17,7 +17,6 @@
package com.android.settings.spa.app.specialaccess
import android.app.AppOpsManager
import android.app.AppOpsManager.OP_PICTURE_IN_PICTURE
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.pm.ApplicationInfo
@@ -28,6 +27,7 @@ import android.util.Log
import androidx.compose.runtime.Composable
import com.android.settings.R
import com.android.settingslib.spa.lifecycle.collectAsCallbackWithLifecycle
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.installed
@@ -79,12 +79,7 @@ class PictureInPictureListModel(private val context: Context) :
PictureInPictureRecord(
app = app,
isSupport = isSupport,
appOpsController =
AppOpsController(
context = context,
app = app,
op = OP_PICTURE_IN_PICTURE,
),
appOpsController = AppOpsController(context = context, app = app, appOps = APP_OPS),
)
override fun filter(userIdFlow: Flow<Int>, recordListFlow: Flow<List<PictureInPictureRecord>>) =
@@ -131,6 +126,8 @@ class PictureInPictureListModel(private val context: Context) :
companion object {
private const val TAG = "PictureInPictureListModel"
private val APP_OPS = AppOps(AppOpsManager.OP_PICTURE_IN_PICTURE)
private fun PackageInfo.supportsPictureInPicture() =
activities?.any(ActivityInfo::supportsPictureInPicture) ?: false

View File

@@ -20,8 +20,8 @@ import android.Manifest
import android.app.AppOpsManager
import android.app.settings.SettingsEnums
import android.content.Context
import com.android.settings.R
import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -35,9 +35,11 @@ class TurnScreenOnAppsListModel(context: Context) : AppOpPermissionListModel(con
override val pageTitleResId = com.android.settingslib.R.string.turn_screen_on_title
override val switchTitleResId = com.android.settingslib.R.string.allow_turn_screen_on
override val footerResId = com.android.settingslib.R.string.allow_turn_screen_on_description
override val appOp = AppOpsManager.OP_TURN_SCREEN_ON
override val appOps = AppOps(
op = AppOpsManager.OP_TURN_SCREEN_ON,
setModeByUid = true,
)
override val permission = Manifest.permission.TURN_SCREEN_ON
override val setModeByUid = true
override fun setAllowed(record: AppOpPermissionRecord, newAllowed: Boolean) {
super.setAllowed(record, newAllowed)

View File

@@ -20,6 +20,7 @@ import android.Manifest
import android.app.AppOpsManager
import android.content.Context
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListProvider
@@ -32,7 +33,9 @@ class UseFullScreenIntentListModel(context: Context) : AppOpPermissionListModel(
override val pageTitleResId = R.string.full_screen_intent_title
override val switchTitleResId = R.string.permit_full_screen_intent
override val footerResId = R.string.footer_description_full_screen_intent
override val appOp = AppOpsManager.OP_USE_FULL_SCREEN_INTENT
override val appOps = AppOps(
op = AppOpsManager.OP_USE_FULL_SCREEN_INTENT,
setModeByUid = true,
)
override val permission = Manifest.permission.USE_FULL_SCREEN_INTENT
override val setModeByUid = true
}

View File

@@ -21,6 +21,7 @@ import android.app.AppOpsManager
import android.app.AppOpsManager.MODE_IGNORED
import android.content.Context
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionListModel
@@ -39,11 +40,13 @@ class WifiControlAppListModel(
override val switchTitleResId = R.string.change_wifi_state_app_detail_switch
override val footerResId = R.string.change_wifi_state_app_detail_summary
override val appOp = AppOpsManager.OP_CHANGE_WIFI_STATE
override val appOps = AppOps(
op = AppOpsManager.OP_CHANGE_WIFI_STATE,
modeForNotAllowed = MODE_IGNORED,
)
override val permission = Manifest.permission.CHANGE_WIFI_STATE
/** NETWORK_SETTINGS permission trumps CHANGE_WIFI_CONFIG. */
override val broaderPermission = Manifest.permission.NETWORK_SETTINGS
override val permissionHasAppOpFlag = false
override val modeForNotAllowed = MODE_IGNORED
}

View File

@@ -269,7 +269,7 @@ class WifiControlAppListModelTest {
private class FakeAppOpsController(private val fakeMode: Int) : IAppOpsController {
var setAllowedCalledWith: Boolean? = null
override val mode = flowOf(fakeMode)
override val modeFlow = flowOf(fakeMode)
override fun setAllowed(allowed: Boolean) {
setAllowedCalledWith = allowed

View File

@@ -22,6 +22,7 @@ import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,8 +38,12 @@ class AllFilesAccessTest {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.manage_external_storage_title)
assertThat(listModel.switchTitleResId).isEqualTo(R.string.permit_manage_external_storage)
assertThat(listModel.footerResId).isEqualTo(R.string.allow_manage_external_storage_description)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE)
assertThat(listModel.appOps).isEqualTo(
AppOps(
op = AppOpsManager.OP_MANAGE_EXTERNAL_STORAGE,
setModeByUid = true,
)
)
assertThat(listModel.permission).isEqualTo(Manifest.permission.MANAGE_EXTERNAL_STORAGE)
assertThat(listModel.setModeByUid).isTrue()
}
}

View File

@@ -23,6 +23,7 @@ import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,8 +38,12 @@ class LongBackgroundTasksAppsTest {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.long_background_tasks_title)
assertThat(listModel.switchTitleResId).isEqualTo(R.string.long_background_tasks_switch_title)
assertThat(listModel.footerResId).isEqualTo(R.string.long_background_tasks_footer_title)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_RUN_USER_INITIATED_JOBS)
assertThat(listModel.appOps).isEqualTo(
AppOps(
op = AppOpsManager.OP_RUN_USER_INITIATED_JOBS,
setModeByUid = true,
)
)
assertThat(listModel.permission).isEqualTo(Manifest.permission.RUN_USER_INITIATED_JOBS)
assertThat(listModel.setModeByUid).isTrue()
}
}

View File

@@ -22,6 +22,7 @@ import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -37,8 +38,12 @@ class MediaManagementAppsTest {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.media_management_apps_title)
assertThat(listModel.switchTitleResId).isEqualTo(R.string.media_management_apps_toggle_label)
assertThat(listModel.footerResId).isEqualTo(R.string.media_management_apps_description)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_MANAGE_MEDIA)
assertThat(listModel.appOps).isEqualTo(
AppOps(
op = AppOpsManager.OP_MANAGE_MEDIA,
setModeByUid = true,
)
)
assertThat(listModel.permission).isEqualTo(Manifest.permission.MANAGE_MEDIA)
assertThat(listModel.setModeByUid).isTrue()
}
}

View File

@@ -29,6 +29,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.media.flags.Flags
import com.android.settings.R
import com.android.settings.testutils.FakeFeatureFactory
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.model.app.IAppOpsController
import com.android.settingslib.spaprivileged.template.app.AppOpPermissionRecord
import com.google.common.truth.Truth.assertThat
@@ -74,9 +75,13 @@ class MediaRoutingControlTest {
assertThat(listModel.pageTitleResId).isEqualTo(R.string.media_routing_control_title)
assertThat(listModel.switchTitleResId).isEqualTo(R.string.allow_media_routing_control)
assertThat(listModel.footerResId).isEqualTo(R.string.allow_media_routing_description)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_MEDIA_ROUTING_CONTROL)
assertThat(listModel.appOps).isEqualTo(
AppOps(
op = AppOpsManager.OP_MEDIA_ROUTING_CONTROL,
setModeByUid = true,
)
)
assertThat(listModel.permission).isEqualTo(Manifest.permission.MEDIA_ROUTING_CONTROL)
assertThat(listModel.setModeByUid).isTrue()
}
@Test
@@ -223,13 +228,13 @@ class MediaRoutingControlTest {
private class FakeAppOpsController(fakeMode: Int) : IAppOpsController {
override val mode = MutableStateFlow(fakeMode)
override val modeFlow = MutableStateFlow(fakeMode)
override fun setAllowed(allowed: Boolean) {
mode.value = if (allowed) AppOpsManager.MODE_ALLOWED else AppOpsManager.MODE_ERRORED
modeFlow.value = if (allowed) AppOpsManager.MODE_ALLOWED else AppOpsManager.MODE_ERRORED
}
override fun getMode(): Int = mode.value
override fun getMode(): Int = modeFlow.value
}
companion object {

View File

@@ -27,6 +27,7 @@ import android.os.DeadSystemRuntimeException
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settings.R
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.first
@@ -179,7 +180,7 @@ class PictureInPictureTest {
appOpsController = AppOpsController(
context = context,
app = PICTURE_IN_PICTURE_APP,
op = AppOpsManager.OP_PICTURE_IN_PICTURE,
appOps = AppOps(AppOpsManager.OP_PICTURE_IN_PICTURE),
),
)

View File

@@ -20,6 +20,7 @@ import android.app.AppOpsManager
import android.content.Context
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.android.settingslib.spaprivileged.model.app.AppOps
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
@@ -35,8 +36,12 @@ class TurnScreenOnAppsTest {
assertThat(listModel.pageTitleResId).isEqualTo(com.android.settingslib.R.string.turn_screen_on_title)
assertThat(listModel.switchTitleResId).isEqualTo(com.android.settingslib.R.string.allow_turn_screen_on)
assertThat(listModel.footerResId).isEqualTo(com.android.settingslib.R.string.allow_turn_screen_on_description)
assertThat(listModel.appOp).isEqualTo(AppOpsManager.OP_TURN_SCREEN_ON)
assertThat(listModel.appOps).isEqualTo(
AppOps(
op = AppOpsManager.OP_TURN_SCREEN_ON,
setModeByUid = true,
)
)
assertThat(listModel.permission).isEqualTo(Manifest.permission.TURN_SCREEN_ON)
assertThat(listModel.setModeByUid).isTrue()
}
}