Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -93,7 +93,7 @@ internal class TogglePermissionAppInfoPageProvider( ) { ) { val context = LocalContext.current val context = LocalContext.current val internalListModel = remember { val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) TogglePermissionInternalAppListModel(context, listModel, ::RestrictionsProviderImpl) } } val record = remember { listModel.transformItem(app) } val record = remember { listModel.transformItem(app) } if (!remember { listModel.isChangeable(record) }) return if (!remember { listModel.isChangeable(record) }) return Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt +34 −31 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.settingslib.spaprivileged.model.app.AppListModel import com.android.settingslib.spaprivileged.model.app.AppRecord import com.android.settingslib.spaprivileged.model.app.AppRecord import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreference import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreference import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading @@ -64,41 +65,18 @@ internal class TogglePermissionAppListPageProvider( val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val entryList = mutableListOf<SettingsEntry>() // TODO: add more categories, such as personal, work, cloned, etc. // TODO: add more categories, such as personal, work, cloned, etc. for (category in listOf("personal")) { return listOf("personal").map { category -> entryList.add( SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) .setLink(toPage = appInfoPage) .setLink(toPage = appInfoPage) .build() .build() ) } } return entryList } } @Composable @Composable override fun Page(arguments: Bundle?) { override fun Page(arguments: Bundle?) { TogglePermissionAppList(arguments?.getString(PERMISSION)!!) val permissionType = arguments?.getString(PERMISSION)!! } appListTemplate.rememberModel(permissionType).TogglePermissionAppList(permissionType) @Composable private fun TogglePermissionAppList(permissionType: String) { val listModel = appListTemplate.rememberModel(permissionType) val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) } AppListPage( title = stringResource(listModel.pageTitleResId), listModel = internalListModel, ) { AppListItem( onClick = TogglePermissionAppInfoPageProvider.navigator( permissionType = permissionType, app = record.app, ), ) } } } companion object { companion object { Loading Loading @@ -132,9 +110,34 @@ internal class TogglePermissionAppListPageProvider( } } } } @Composable internal fun <T : AppRecord> TogglePermissionAppListModel<T>.TogglePermissionAppList( permissionType: String, restrictionsProviderFactory: RestrictionsProviderFactory = ::RestrictionsProviderImpl, appList: @Composable AppListInput<T>.() -> Unit = { AppList() }, ) { val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, this, restrictionsProviderFactory) } AppListPage( title = stringResource(pageTitleResId), listModel = internalListModel, appList = appList, ) { AppListItem( onClick = TogglePermissionAppInfoPageProvider.navigator( permissionType = permissionType, app = record.app, ), ) } } internal class TogglePermissionInternalAppListModel<T : AppRecord>( internal class TogglePermissionInternalAppListModel<T : AppRecord>( private val context: Context, private val context: Context, private val listModel: TogglePermissionAppListModel<T>, private val listModel: TogglePermissionAppListModel<T>, private val restrictionsProviderFactory: RestrictionsProviderFactory, ) : AppListModel<T> { ) : AppListModel<T> { override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = listModel.transform(userIdFlow, appListFlow) listModel.transform(userIdFlow, appListFlow) Loading @@ -147,12 +150,12 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>( @Composable @Composable fun getSummary(record: T): State<String> { fun getSummary(record: T): State<String> { val restrictionsProvider = remember { val restrictionsProvider = remember(record.app.userId) { val restrictions = Restrictions( val restrictions = Restrictions( userId = record.app.userId, userId = record.app.userId, keys = listModel.switchRestrictionKeys, keys = listModel.switchRestrictionKeys, ) ) RestrictionsProviderImpl(context, restrictions) restrictionsProviderFactory(context, restrictions) } } val restrictedMode = restrictionsProvider.restrictedModeState() val restrictedMode = restrictionsProvider.restrictedModeState() val allowed = listModel.isAllowed(record) val allowed = listModel.isAllowed(record) Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItem.kt +2 −3 Original line number Original line Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settingslib.spaprivileged.template.scaffold package com.android.settingslib.spaprivileged.template.scaffold import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext Loading @@ -24,7 +23,7 @@ import com.android.settingslib.spa.widget.scaffold.MoreOptionsScope import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProvider import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl @Composable @Composable Loading @@ -41,7 +40,7 @@ internal fun MoreOptionsScope.RestrictedMenuItemImpl( text: String, text: String, restrictions: Restrictions, restrictions: Restrictions, onClick: () -> Unit, onClick: () -> Unit, restrictionsProviderFactory: (Context, Restrictions) -> RestrictionsProvider, restrictionsProviderFactory: RestrictionsProviderFactory, ) { ) { val context = LocalContext.current val context = LocalContext.current val restrictionsProvider = remember(restrictions) { val restrictionsProvider = remember(restrictions) { Loading packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt +113 −9 Original line number Original line Diff line number Diff line Loading @@ -17,14 +17,22 @@ package com.android.settingslib.spaprivileged.template.app package com.android.settingslib.spaprivileged.template.app import android.content.Context import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.State import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settingslib.spaprivileged.test.R import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.testutils.FakeNavControllerWrapper import com.android.settingslib.spaprivileged.R import com.android.settingslib.spaprivileged.model.enterprise.NoRestricted import com.android.settingslib.spaprivileged.tests.testutils.FakeRestrictionsProvider import com.android.settingslib.spaprivileged.tests.testutils.TestAppRecord import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import org.junit.Rule import org.junit.Rule Loading @@ -38,10 +46,97 @@ class TogglePermissionAppListPageTest { private val context: Context = ApplicationProvider.getApplicationContext() private val context: Context = ApplicationProvider.getApplicationContext() private val fakeNavControllerWrapper = FakeNavControllerWrapper() private val fakeRestrictionsProvider = FakeRestrictionsProvider() @Test fun internalAppListModel_whenAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = true) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.app_permission_summary_allowed) ) } @Test fun internalAppListModel_whenNotAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = false) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.app_permission_summary_not_allowed) ) } @Test fun internalAppListModel_whenComputingAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = null) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.summary_placeholder) ) } @Test @Test fun appListInjectEntry_titleDisplayed() { fun appListItem_onClick_navigate() { val listModel = TestTogglePermissionAppListModel() composeTestRule.setContent { listModel.TogglePermissionAppList( permissionType = PERMISSION_TYPE, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) { fakeNavControllerWrapper.Wrapper { AppListItemModel( record = listModel.transformItem(APP), label = LABEL, summary = stateOf(SUMMARY), ).appItem() } } } composeTestRule.onNodeWithText(LABEL).performClick() assertThat(fakeNavControllerWrapper.navigateCalledWith) .isEqualTo("TogglePermissionAppInfoPage/test.PERMISSION/package.name/0") } @Test fun getRoute() { val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") } @Test fun buildInjectEntry_titleDisplayed() { val listModel = TestTogglePermissionAppListModel() val entry = TogglePermissionAppListPageProvider.buildInjectEntry(PERMISSION_TYPE) { val entry = TogglePermissionAppListPageProvider.buildInjectEntry(PERMISSION_TYPE) { TestTogglePermissionAppListModel() listModel }.build() }.build() composeTestRule.setContent { composeTestRule.setContent { Loading @@ -50,18 +145,27 @@ class TogglePermissionAppListPageTest { } } } } composeTestRule.onNodeWithText(context.getString(R.string.test_permission_title)) composeTestRule.onNodeWithText(context.getString(listModel.pageTitleResId)) .assertIsDisplayed() .assertIsDisplayed() } } @Test private fun getSummary( fun appListRoute() { internalAppListModel: TogglePermissionInternalAppListModel<TestAppRecord>, val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) ): State<String> { lateinit var summary: State<String> assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") composeTestRule.setContent { summary = internalAppListModel.getSummary(record = TestAppRecord(APP)) } return summary } } private companion object { private companion object { const val PERMISSION_TYPE = "test.PERMISSION" const val PERMISSION_TYPE = "test.PERMISSION" const val PACKAGE_NAME = "package.name" const val LABEL = "Label" const val SUMMARY = "Summary" val APP = ApplicationInfo().apply { packageName = PACKAGE_NAME } } } } } Loading
packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt +1 −1 Original line number Original line Diff line number Diff line Loading @@ -93,7 +93,7 @@ internal class TogglePermissionAppInfoPageProvider( ) { ) { val context = LocalContext.current val context = LocalContext.current val internalListModel = remember { val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) TogglePermissionInternalAppListModel(context, listModel, ::RestrictionsProviderImpl) } } val record = remember { listModel.transformItem(app) } val record = remember { listModel.transformItem(app) } if (!remember { listModel.isChangeable(record) }) return if (!remember { listModel.isChangeable(record) }) return Loading
packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt +34 −31 Original line number Original line Diff line number Diff line Loading @@ -42,6 +42,7 @@ import com.android.settingslib.spaprivileged.model.app.AppListModel import com.android.settingslib.spaprivileged.model.app.AppRecord import com.android.settingslib.spaprivileged.model.app.AppRecord import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.app.userId import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreference import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreference import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow Loading @@ -64,41 +65,18 @@ internal class TogglePermissionAppListPageProvider( val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val entryList = mutableListOf<SettingsEntry>() // TODO: add more categories, such as personal, work, cloned, etc. // TODO: add more categories, such as personal, work, cloned, etc. for (category in listOf("personal")) { return listOf("personal").map { category -> entryList.add( SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) .setLink(toPage = appInfoPage) .setLink(toPage = appInfoPage) .build() .build() ) } } return entryList } } @Composable @Composable override fun Page(arguments: Bundle?) { override fun Page(arguments: Bundle?) { TogglePermissionAppList(arguments?.getString(PERMISSION)!!) val permissionType = arguments?.getString(PERMISSION)!! } appListTemplate.rememberModel(permissionType).TogglePermissionAppList(permissionType) @Composable private fun TogglePermissionAppList(permissionType: String) { val listModel = appListTemplate.rememberModel(permissionType) val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) } AppListPage( title = stringResource(listModel.pageTitleResId), listModel = internalListModel, ) { AppListItem( onClick = TogglePermissionAppInfoPageProvider.navigator( permissionType = permissionType, app = record.app, ), ) } } } companion object { companion object { Loading Loading @@ -132,9 +110,34 @@ internal class TogglePermissionAppListPageProvider( } } } } @Composable internal fun <T : AppRecord> TogglePermissionAppListModel<T>.TogglePermissionAppList( permissionType: String, restrictionsProviderFactory: RestrictionsProviderFactory = ::RestrictionsProviderImpl, appList: @Composable AppListInput<T>.() -> Unit = { AppList() }, ) { val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, this, restrictionsProviderFactory) } AppListPage( title = stringResource(pageTitleResId), listModel = internalListModel, appList = appList, ) { AppListItem( onClick = TogglePermissionAppInfoPageProvider.navigator( permissionType = permissionType, app = record.app, ), ) } } internal class TogglePermissionInternalAppListModel<T : AppRecord>( internal class TogglePermissionInternalAppListModel<T : AppRecord>( private val context: Context, private val context: Context, private val listModel: TogglePermissionAppListModel<T>, private val listModel: TogglePermissionAppListModel<T>, private val restrictionsProviderFactory: RestrictionsProviderFactory, ) : AppListModel<T> { ) : AppListModel<T> { override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = listModel.transform(userIdFlow, appListFlow) listModel.transform(userIdFlow, appListFlow) Loading @@ -147,12 +150,12 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>( @Composable @Composable fun getSummary(record: T): State<String> { fun getSummary(record: T): State<String> { val restrictionsProvider = remember { val restrictionsProvider = remember(record.app.userId) { val restrictions = Restrictions( val restrictions = Restrictions( userId = record.app.userId, userId = record.app.userId, keys = listModel.switchRestrictionKeys, keys = listModel.switchRestrictionKeys, ) ) RestrictionsProviderImpl(context, restrictions) restrictionsProviderFactory(context, restrictions) } } val restrictedMode = restrictionsProvider.restrictedModeState() val restrictedMode = restrictionsProvider.restrictedModeState() val allowed = listModel.isAllowed(record) val allowed = listModel.isAllowed(record) Loading
packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItem.kt +2 −3 Original line number Original line Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settingslib.spaprivileged.template.scaffold package com.android.settingslib.spaprivileged.template.scaffold import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.runtime.remember import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext Loading @@ -24,7 +23,7 @@ import com.android.settingslib.spa.widget.scaffold.MoreOptionsScope import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.BaseUserRestricted import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin import com.android.settingslib.spaprivileged.model.enterprise.BlockedByAdmin import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.Restrictions import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProvider import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderFactory import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl @Composable @Composable Loading @@ -41,7 +40,7 @@ internal fun MoreOptionsScope.RestrictedMenuItemImpl( text: String, text: String, restrictions: Restrictions, restrictions: Restrictions, onClick: () -> Unit, onClick: () -> Unit, restrictionsProviderFactory: (Context, Restrictions) -> RestrictionsProvider, restrictionsProviderFactory: RestrictionsProviderFactory, ) { ) { val context = LocalContext.current val context = LocalContext.current val restrictionsProvider = remember(restrictions) { val restrictionsProvider = remember(restrictions) { Loading
packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt +113 −9 Original line number Original line Diff line number Diff line Loading @@ -17,14 +17,22 @@ package com.android.settingslib.spaprivileged.template.app package com.android.settingslib.spaprivileged.template.app import android.content.Context import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.State import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.ext.junit.runners.AndroidJUnit4 import com.android.settingslib.spaprivileged.test.R import com.android.settingslib.spa.framework.compose.stateOf import com.android.settingslib.spa.testutils.FakeNavControllerWrapper import com.android.settingslib.spaprivileged.R import com.android.settingslib.spaprivileged.model.enterprise.NoRestricted import com.android.settingslib.spaprivileged.tests.testutils.FakeRestrictionsProvider import com.android.settingslib.spaprivileged.tests.testutils.TestAppRecord import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel import com.android.settingslib.spaprivileged.tests.testutils.TestTogglePermissionAppListModel import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat import org.junit.Rule import org.junit.Rule Loading @@ -38,10 +46,97 @@ class TogglePermissionAppListPageTest { private val context: Context = ApplicationProvider.getApplicationContext() private val context: Context = ApplicationProvider.getApplicationContext() private val fakeNavControllerWrapper = FakeNavControllerWrapper() private val fakeRestrictionsProvider = FakeRestrictionsProvider() @Test fun internalAppListModel_whenAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = true) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.app_permission_summary_allowed) ) } @Test fun internalAppListModel_whenNotAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = false) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.app_permission_summary_not_allowed) ) } @Test fun internalAppListModel_whenComputingAllowed() { fakeRestrictionsProvider.restrictedMode = NoRestricted val listModel = TestTogglePermissionAppListModel(isAllowed = null) val internalAppListModel = TogglePermissionInternalAppListModel( context = context, listModel = listModel, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) val summaryState = getSummary(internalAppListModel) assertThat(summaryState.value).isEqualTo( context.getString(R.string.summary_placeholder) ) } @Test @Test fun appListInjectEntry_titleDisplayed() { fun appListItem_onClick_navigate() { val listModel = TestTogglePermissionAppListModel() composeTestRule.setContent { listModel.TogglePermissionAppList( permissionType = PERMISSION_TYPE, restrictionsProviderFactory = { _, _ -> fakeRestrictionsProvider }, ) { fakeNavControllerWrapper.Wrapper { AppListItemModel( record = listModel.transformItem(APP), label = LABEL, summary = stateOf(SUMMARY), ).appItem() } } } composeTestRule.onNodeWithText(LABEL).performClick() assertThat(fakeNavControllerWrapper.navigateCalledWith) .isEqualTo("TogglePermissionAppInfoPage/test.PERMISSION/package.name/0") } @Test fun getRoute() { val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") } @Test fun buildInjectEntry_titleDisplayed() { val listModel = TestTogglePermissionAppListModel() val entry = TogglePermissionAppListPageProvider.buildInjectEntry(PERMISSION_TYPE) { val entry = TogglePermissionAppListPageProvider.buildInjectEntry(PERMISSION_TYPE) { TestTogglePermissionAppListModel() listModel }.build() }.build() composeTestRule.setContent { composeTestRule.setContent { Loading @@ -50,18 +145,27 @@ class TogglePermissionAppListPageTest { } } } } composeTestRule.onNodeWithText(context.getString(R.string.test_permission_title)) composeTestRule.onNodeWithText(context.getString(listModel.pageTitleResId)) .assertIsDisplayed() .assertIsDisplayed() } } @Test private fun getSummary( fun appListRoute() { internalAppListModel: TogglePermissionInternalAppListModel<TestAppRecord>, val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) ): State<String> { lateinit var summary: State<String> assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") composeTestRule.setContent { summary = internalAppListModel.getSummary(record = TestAppRecord(APP)) } return summary } } private companion object { private companion object { const val PERMISSION_TYPE = "test.PERMISSION" const val PERMISSION_TYPE = "test.PERMISSION" const val PACKAGE_NAME = "package.name" const val LABEL = "Label" const val SUMMARY = "Summary" val APP = ApplicationInfo().apply { packageName = PACKAGE_NAME } } } } }