Hide not changeable app from AppOpPermissionAppList
Also add unit tests for AppOpPermissionAppList.
Also correct the test only resources R to
com.android.settingslib.spaprivileged.test.R
Bug: 260660819
Test: Unit test
Test: Manually with Settings
Change-Id: I732f777906c5ea4a79e876b982ba0ca28b39a0ee
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 71cf23c..c08169e 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
@@ -16,7 +16,6 @@
package com.android.settingslib.spaprivileged.model.app
-import android.app.AppOpsManager
import android.app.AppOpsManager.MODE_ALLOWED
import android.app.AppOpsManager.MODE_ERRORED
import android.app.AppOpsManager.Mode
@@ -25,34 +24,41 @@
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.map
+import com.android.settingslib.spaprivileged.framework.common.appOpsManager
+
+interface IAppOpsController {
+ val mode: LiveData<Int>
+ val isAllowed: LiveData<Boolean>
+ get() = mode.map { it == MODE_ALLOWED }
+
+ fun setAllowed(allowed: Boolean)
+
+ @Mode
+ fun getMode(): Int
+}
class AppOpsController(
context: Context,
private val app: ApplicationInfo,
private val op: Int,
-) {
- private val appOpsManager = checkNotNull(context.getSystemService(AppOpsManager::class.java))
+) : IAppOpsController {
+ private val appOpsManager = context.appOpsManager
- val mode: LiveData<Int>
+ override val mode: LiveData<Int>
get() = _mode
- val isAllowed: LiveData<Boolean>
- get() = _mode.map { it == MODE_ALLOWED }
- fun setAllowed(allowed: Boolean) {
+ override fun setAllowed(allowed: Boolean) {
val mode = if (allowed) MODE_ALLOWED else MODE_ERRORED
appOpsManager.setMode(op, app.uid, app.packageName, mode)
_mode.postValue(mode)
}
@Mode
- fun getMode(): Int = appOpsManager.checkOpNoThrow(op, app.uid, app.packageName)
+ override fun getMode(): Int = appOpsManager.checkOpNoThrow(op, app.uid, app.packageName)
private val _mode = object : MutableLiveData<Int>() {
override fun onActive() {
postValue(getMode())
}
-
- override fun onInactive() {
- }
}
}
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 c6f41d3..a357832 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
@@ -25,11 +25,12 @@
import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
+import com.android.settingslib.spa.framework.util.filterItem
import com.android.settingslib.spaprivileged.model.app.AppOpsController
import com.android.settingslib.spaprivileged.model.app.AppRecord
+import com.android.settingslib.spaprivileged.model.app.IAppOpsController
+import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
-import com.android.settingslib.spaprivileged.model.app.PackageManagers.hasGrantPermission
-import com.android.settingslib.spaprivileged.model.app.PackageManagers.hasRequestPermission
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.map
@@ -37,21 +38,24 @@
data class AppOpPermissionRecord(
override val app: ApplicationInfo,
val hasRequestPermission: Boolean,
- var appOpsController: AppOpsController,
+ var appOpsController: IAppOpsController,
) : AppRecord
-abstract class AppOpPermissionListModel(private val context: Context) :
- TogglePermissionAppListModel<AppOpPermissionRecord> {
+abstract class AppOpPermissionListModel(
+ private val context: Context,
+ private val packageManagers: IPackageManagers = PackageManagers,
+) : TogglePermissionAppListModel<AppOpPermissionRecord> {
abstract val appOp: Int
abstract val permission: String
+ /** These not changeable packages will also be hidden from app list. */
private val notChangeablePackages =
setOf("android", "com.android.systemui", context.packageName)
override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) =
userIdFlow.map { userId ->
- PackageManagers.getAppOpPermissionPackages(userId, permission)
+ packageManagers.getAppOpPermissionPackages(userId, permission)
}.combine(appListFlow) { packageNames, appList ->
appList.map { app ->
AppOpPermissionRecord(
@@ -64,14 +68,12 @@
override fun transformItem(app: ApplicationInfo) = AppOpPermissionRecord(
app = app,
- hasRequestPermission = app.hasRequestPermission(permission),
+ hasRequestPermission = with(packageManagers) { app.hasRequestPermission(permission) },
appOpsController = AppOpsController(context = context, app = app, op = appOp),
)
override fun filter(userIdFlow: Flow<Int>, recordListFlow: Flow<List<AppOpPermissionRecord>>) =
- recordListFlow.map { recordList ->
- recordList.filter { it.hasRequestPermission }
- }
+ recordListFlow.filterItem(::isChangeable)
/**
* Defining the default behavior as permissible as long as the package requested this permission
@@ -85,7 +87,9 @@
when (mode.value) {
null -> null
MODE_ALLOWED -> true
- MODE_DEFAULT -> record.app.hasGrantPermission(permission)
+ MODE_DEFAULT -> with(packageManagers) {
+ record.app.hasGrantPermission(permission)
+ }
else -> false
}
}
diff --git a/packages/SettingsLib/SpaPrivileged/tests/AndroidManifest.xml b/packages/SettingsLib/SpaPrivileged/tests/AndroidManifest.xml
index c4f490e..8d384e8 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/AndroidManifest.xml
+++ b/packages/SettingsLib/SpaPrivileged/tests/AndroidManifest.xml
@@ -15,7 +15,7 @@
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.android.settingslib.spaprivileged.tests">
+ package="com.android.settingslib.spaprivileged.test">
<application>
<uses-library android:name="android.test.runner" />
@@ -24,5 +24,5 @@
<instrumentation
android:name="androidx.test.runner.AndroidJUnitRunner"
android:label="Tests for SpaPrivilegedLib"
- android:targetPackage="com.android.settingslib.spaprivileged.tests" />
+ android:targetPackage="com.android.settingslib.spaprivileged.test" />
</manifest>
diff --git a/packages/SettingsLib/SpaPrivileged/tests/res/values/strings.xml b/packages/SettingsLib/SpaPrivileged/tests/res/values/strings.xml
index fb1e09a..bdc0ba8 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/res/values/strings.xml
+++ b/packages/SettingsLib/SpaPrivileged/tests/res/values/strings.xml
@@ -22,5 +22,14 @@
<string name="test_permission_switch_title" translatable="false">Allow Test Permission</string>
<!-- Test Permission footer. [DO NOT TRANSLATE] -->
- <string name="test_permission_footer" translatable="false">Test Permission is for demo.</string>
+ <string name="test_permission_footer" translatable="false">Test Permission is for testing.</string>
+
+ <!-- Test App Op Permission title. [DO NOT TRANSLATE] -->
+ <string name="test_app_op_permission_title" translatable="false">Test App Op Permission</string>
+
+ <!-- Test App Op Permission switch title. [DO NOT TRANSLATE] -->
+ <string name="test_app_op_permission_switch_title" translatable="false">Allow Test App Op Permission</string>
+
+ <!-- Test App Op Permission footer. [DO NOT TRANSLATE] -->
+ <string name="test_app_op_permission_footer" translatable="false">Test App Op Permission is for testing.</string>
</resources>
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppInfoTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppInfoTest.kt
index 8ca79509..bb56c10 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppInfoTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppInfoTest.kt
@@ -36,7 +36,7 @@
@get:Rule
val composeTestRule = createComposeRule()
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun appInfoLabel_isDisplayed() {
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
index c3c96c6..946dc2a9 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListPageTest.kt
@@ -41,7 +41,7 @@
@get:Rule
val composeTestRule = createComposeRule()
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun title_isDisplayed() {
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
index df80dd4..945bd51 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppListTest.kt
@@ -44,7 +44,7 @@
@get:Rule
val composeTestRule = createComposeRule()
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun whenNoApps() {
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
new file mode 100644
index 0000000..f1d9abe
--- /dev/null
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppOpPermissionAppListTest.kt
@@ -0,0 +1,264 @@
+/*
+ * Copyright (C) 2022 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.spaprivileged.template.app
+
+import android.app.AppOpsManager
+import android.content.Context
+import android.content.pm.ApplicationInfo
+import androidx.compose.runtime.State
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.lifecycle.liveData
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settingslib.spa.testutils.firstWithTimeoutOrNull
+import com.android.settingslib.spaprivileged.model.app.IAppOpsController
+import com.android.settingslib.spaprivileged.model.app.IPackageManagers
+import com.android.settingslib.spaprivileged.test.R
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.test.runTest
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.mockito.Mock
+import org.mockito.junit.MockitoJUnit
+import org.mockito.junit.MockitoRule
+import org.mockito.Mockito.`when` as whenever
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(AndroidJUnit4::class)
+class AppOpPermissionAppListTest {
+ @get:Rule
+ val mockito: MockitoRule = MockitoJUnit.rule()
+
+ @get:Rule
+ val composeTestRule = createComposeRule()
+
+ private val context: Context = ApplicationProvider.getApplicationContext()
+
+ @Mock
+ private lateinit var packageManagers: IPackageManagers
+
+ private lateinit var listModel: TestAppOpPermissionAppListModel
+
+ @Before
+ fun setUp() = runTest {
+ whenever(packageManagers.getAppOpPermissionPackages(USER_ID, PERMISSION))
+ .thenReturn(emptySet())
+ listModel = TestAppOpPermissionAppListModel()
+ }
+
+ @Test
+ fun transformItem_recordHasCorrectApp() {
+ val record = listModel.transformItem(APP)
+
+ assertThat(record.app).isSameInstanceAs(APP)
+ }
+
+ @Test
+ fun transformItem_hasRequestPermission() = runTest {
+ with(packageManagers) {
+ whenever(APP.hasRequestPermission(PERMISSION)).thenReturn(true)
+ }
+
+ val record = listModel.transformItem(APP)
+
+ assertThat(record.hasRequestPermission).isTrue()
+ }
+
+ @Test
+ fun transformItem_notRequestPermission() = runTest {
+ with(packageManagers) {
+ whenever(APP.hasRequestPermission(PERMISSION)).thenReturn(false)
+ }
+
+ val record = listModel.transformItem(APP)
+
+ assertThat(record.hasRequestPermission).isFalse()
+ }
+
+ @Test
+ fun filter() = runTest {
+ with(packageManagers) {
+ whenever(APP.hasRequestPermission(PERMISSION)).thenReturn(false)
+ }
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = false,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val recordListFlow = listModel.filter(flowOf(USER_ID), flowOf(listOf(record)))
+
+ val recordList = recordListFlow.firstWithTimeoutOrNull()!!
+ assertThat(recordList).isEmpty()
+ }
+
+ @Test
+ fun isAllowed_allowed() {
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_ALLOWED),
+ )
+
+ val isAllowed = getIsAllowed(record)
+
+ assertThat(isAllowed).isTrue()
+ }
+
+ @Test
+ fun isAllowed_defaultAndHasGrantPermission() {
+ with(packageManagers) {
+ whenever(APP.hasGrantPermission(PERMISSION)).thenReturn(true)
+ }
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val isAllowed = getIsAllowed(record)
+
+ assertThat(isAllowed).isTrue()
+ }
+
+ @Test
+ fun isAllowed_defaultAndNotGrantPermission() {
+ with(packageManagers) {
+ whenever(APP.hasGrantPermission(PERMISSION)).thenReturn(false)
+ }
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val isAllowed = getIsAllowed(record)
+
+ assertThat(isAllowed).isFalse()
+ }
+
+ @Test
+ fun isAllowed_notAllowed() {
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_ERRORED),
+ )
+
+ val isAllowed = getIsAllowed(record)
+
+ assertThat(isAllowed).isFalse()
+ }
+
+ @Test
+ fun isChangeable_notRequestPermission() {
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = false,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val isChangeable = listModel.isChangeable(record)
+
+ assertThat(isChangeable).isFalse()
+ }
+
+ @Test
+ fun isChangeable_notChangeablePackages() {
+ val record = AppOpPermissionRecord(
+ app = NOT_CHANGEABLE_APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val isChangeable = listModel.isChangeable(record)
+
+ assertThat(isChangeable).isFalse()
+ }
+
+ @Test
+ fun isChangeable_hasRequestPermissionAndChangeable() {
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT),
+ )
+
+ val isChangeable = listModel.isChangeable(record)
+
+ assertThat(isChangeable).isTrue()
+ }
+
+ @Test
+ fun setAllowed() {
+ val appOpsController = FakeAppOpsController(fakeMode = AppOpsManager.MODE_DEFAULT)
+ val record = AppOpPermissionRecord(
+ app = APP,
+ hasRequestPermission = true,
+ appOpsController = appOpsController,
+ )
+
+ listModel.setAllowed(record = record, newAllowed = true)
+
+ assertThat(appOpsController.setAllowedCalledWith).isTrue()
+ }
+
+ private fun getIsAllowed(record: AppOpPermissionRecord): Boolean? {
+ lateinit var isAllowedState: State<Boolean?>
+ composeTestRule.setContent {
+ isAllowedState = listModel.isAllowed(record)
+ }
+ return isAllowedState.value
+ }
+
+ private inner class TestAppOpPermissionAppListModel :
+ AppOpPermissionListModel(context, packageManagers) {
+ override val pageTitleResId = R.string.test_app_op_permission_title
+ override val switchTitleResId = R.string.test_app_op_permission_switch_title
+ override val footerResId = R.string.test_app_op_permission_footer
+ override val appOp = AppOpsManager.OP_MANAGE_MEDIA
+ override val permission = PERMISSION
+ }
+
+ private companion object {
+ const val USER_ID = 0
+ const val PACKAGE_NAME = "package.name"
+ const val PERMISSION = "PERMISSION"
+ val APP = ApplicationInfo().apply {
+ packageName = PACKAGE_NAME
+ }
+ val NOT_CHANGEABLE_APP = ApplicationInfo().apply {
+ packageName = "android"
+ }
+ }
+}
+
+private class FakeAppOpsController(private val fakeMode: Int) : IAppOpsController {
+ var setAllowedCalledWith: Boolean? = null
+
+ override val mode = liveData { emit(fakeMode) }
+
+ override fun setAllowed(allowed: Boolean) {
+ setAllowedCalledWith = allowed
+ }
+
+ override fun getMode() = fakeMode
+}
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt
index 8e98d8c..066e28a 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/AppStorageSizeTest.kt
@@ -48,7 +48,7 @@
val composeTestRule = createComposeRule()
@Spy
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Mock
private lateinit var storageStatsManager: StorageStatsManager
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt
index 4bc612a..355dfb6 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt
@@ -24,7 +24,7 @@
import androidx.compose.ui.test.onNodeWithText
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settingslib.spaprivileged.R
+import com.android.settingslib.spaprivileged.test.R
import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
@@ -36,7 +36,7 @@
@get:Rule
val composeTestRule = createComposeRule()
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun appListInjectEntry_titleDisplayed() {
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListTest.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListTest.kt
index af3189f..2d169e0 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListTest.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListTest.kt
@@ -24,7 +24,7 @@
import androidx.compose.ui.test.onNodeWithText
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settingslib.spaprivileged.R
+import com.android.settingslib.spaprivileged.test.R
import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
@@ -36,7 +36,7 @@
@get:Rule
val composeTestRule = createComposeRule()
- private var context: Context = ApplicationProvider.getApplicationContext()
+ private val context: Context = ApplicationProvider.getApplicationContext()
@Test
fun appListInjectEntry_titleDisplayed() {
diff --git a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/TestTogglePermissionAppListModel.kt b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/TestTogglePermissionAppListModel.kt
index 91a9c6b..64bc11f 100644
--- a/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/TestTogglePermissionAppListModel.kt
+++ b/packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/tests/testutils/TestTogglePermissionAppListModel.kt
@@ -19,7 +19,7 @@
import android.content.pm.ApplicationInfo
import androidx.compose.runtime.Composable
import com.android.settingslib.spa.framework.compose.stateOf
-import com.android.settingslib.spaprivileged.R
+import com.android.settingslib.spaprivileged.test.R
import com.android.settingslib.spaprivileged.template.app.TogglePermissionAppListModel
import kotlinx.coroutines.flow.Flow