Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppInfoPage.kt +1 −1 Original line number Diff line number Diff line Loading @@ -93,7 +93,7 @@ internal class TogglePermissionAppInfoPageProvider( ) { val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) TogglePermissionInternalAppListModel(context, listModel, ::RestrictionsProviderImpl) } val record = remember { listModel.transformItem(app) } if (!remember { listModel.isChangeable(record) }) return Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt +34 −31 Original line number 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.userId 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.template.preference.RestrictedSwitchPreference import kotlinx.coroutines.flow.Flow Loading @@ -64,41 +65,18 @@ internal class TogglePermissionAppListPageProvider( val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val entryList = mutableListOf<SettingsEntry>() // TODO: add more categories, such as personal, work, cloned, etc. for (category in listOf("personal")) { entryList.add( return listOf("personal").map { category -> SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) .setLink(toPage = appInfoPage) .build() ) } return entryList } @Composable override fun Page(arguments: Bundle?) { TogglePermissionAppList(arguments?.getString(PERMISSION)!!) } @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, ), ) } val permissionType = arguments?.getString(PERMISSION)!! appListTemplate.rememberModel(permissionType).TogglePermissionAppList(permissionType) } 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>( private val context: Context, private val listModel: TogglePermissionAppListModel<T>, private val restrictionsProviderFactory: RestrictionsProviderFactory, ) : AppListModel<T> { override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = listModel.transform(userIdFlow, appListFlow) Loading @@ -147,12 +150,12 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>( @Composable fun getSummary(record: T): State<String> { val restrictionsProvider = remember { val restrictionsProvider = remember(record.app.userId) { val restrictions = Restrictions( userId = record.app.userId, keys = listModel.switchRestrictionKeys, ) RestrictionsProviderImpl(context, restrictions) restrictionsProviderFactory(context, restrictions) } val restrictedMode = restrictionsProvider.restrictedModeState() val allowed = listModel.isAllowed(record) Loading packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItem.kt +2 −3 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settingslib.spaprivileged.template.scaffold import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.remember 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.BlockedByAdmin 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 @Composable Loading @@ -41,7 +40,7 @@ internal fun MoreOptionsScope.RestrictedMenuItemImpl( text: String, restrictions: Restrictions, onClick: () -> Unit, restrictionsProviderFactory: (Context, Restrictions) -> RestrictionsProvider, restrictionsProviderFactory: RestrictionsProviderFactory, ) { val context = LocalContext.current val restrictionsProvider = remember(restrictions) { Loading packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt +113 −9 Original line number Diff line number Diff line Loading @@ -17,14 +17,22 @@ package com.android.settingslib.spaprivileged.template.app import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.State import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider 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.google.common.truth.Truth.assertThat import org.junit.Rule Loading @@ -38,10 +46,97 @@ class TogglePermissionAppListPageTest { 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 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) { TestTogglePermissionAppListModel() listModel }.build() 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() } @Test fun appListRoute() { val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") private fun getSummary( internalAppListModel: TogglePermissionInternalAppListModel<TestAppRecord>, ): State<String> { lateinit var summary: State<String> composeTestRule.setContent { summary = internalAppListModel.getSummary(record = TestAppRecord(APP)) } return summary } private companion object { 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 Diff line number Diff line Loading @@ -93,7 +93,7 @@ internal class TogglePermissionAppInfoPageProvider( ) { val context = LocalContext.current val internalListModel = remember { TogglePermissionInternalAppListModel(context, listModel) TogglePermissionInternalAppListModel(context, listModel, ::RestrictionsProviderImpl) } val record = remember { listModel.transformItem(app) } if (!remember { listModel.isChangeable(record) }) return Loading
packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPage.kt +34 −31 Original line number 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.userId 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.template.preference.RestrictedSwitchPreference import kotlinx.coroutines.flow.Flow Loading @@ -64,41 +65,18 @@ internal class TogglePermissionAppListPageProvider( val permissionType = parameter.getStringArg(PERMISSION, arguments)!! val appListPage = SettingsPage.create(name, parameter = parameter, arguments = arguments) val appInfoPage = TogglePermissionAppInfoPageProvider.buildPageData(permissionType) val entryList = mutableListOf<SettingsEntry>() // TODO: add more categories, such as personal, work, cloned, etc. for (category in listOf("personal")) { entryList.add( return listOf("personal").map { category -> SettingsEntryBuilder.createLinkFrom("${ENTRY_NAME}_$category", appListPage) .setLink(toPage = appInfoPage) .build() ) } return entryList } @Composable override fun Page(arguments: Bundle?) { TogglePermissionAppList(arguments?.getString(PERMISSION)!!) } @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, ), ) } val permissionType = arguments?.getString(PERMISSION)!! appListTemplate.rememberModel(permissionType).TogglePermissionAppList(permissionType) } 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>( private val context: Context, private val listModel: TogglePermissionAppListModel<T>, private val restrictionsProviderFactory: RestrictionsProviderFactory, ) : AppListModel<T> { override fun transform(userIdFlow: Flow<Int>, appListFlow: Flow<List<ApplicationInfo>>) = listModel.transform(userIdFlow, appListFlow) Loading @@ -147,12 +150,12 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>( @Composable fun getSummary(record: T): State<String> { val restrictionsProvider = remember { val restrictionsProvider = remember(record.app.userId) { val restrictions = Restrictions( userId = record.app.userId, keys = listModel.switchRestrictionKeys, ) RestrictionsProviderImpl(context, restrictions) restrictionsProviderFactory(context, restrictions) } val restrictedMode = restrictionsProvider.restrictedModeState() val allowed = listModel.isAllowed(record) Loading
packages/SettingsLib/SpaPrivileged/src/com/android/settingslib/spaprivileged/template/scaffold/RestrictedMenuItem.kt +2 −3 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.settingslib.spaprivileged.template.scaffold import android.content.Context import androidx.compose.runtime.Composable import androidx.compose.runtime.remember 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.BlockedByAdmin 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 @Composable Loading @@ -41,7 +40,7 @@ internal fun MoreOptionsScope.RestrictedMenuItemImpl( text: String, restrictions: Restrictions, onClick: () -> Unit, restrictionsProviderFactory: (Context, Restrictions) -> RestrictionsProvider, restrictionsProviderFactory: RestrictionsProviderFactory, ) { val context = LocalContext.current val restrictionsProvider = remember(restrictions) { Loading
packages/SettingsLib/SpaPrivileged/tests/src/com/android/settingslib/spaprivileged/template/app/TogglePermissionAppListPageTest.kt +113 −9 Original line number Diff line number Diff line Loading @@ -17,14 +17,22 @@ package com.android.settingslib.spaprivileged.template.app import android.content.Context import android.content.pm.ApplicationInfo import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.State import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick import androidx.test.core.app.ApplicationProvider 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.google.common.truth.Truth.assertThat import org.junit.Rule Loading @@ -38,10 +46,97 @@ class TogglePermissionAppListPageTest { 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 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) { TestTogglePermissionAppListModel() listModel }.build() 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() } @Test fun appListRoute() { val route = TogglePermissionAppListPageProvider.getRoute(PERMISSION_TYPE) assertThat(route).isEqualTo("TogglePermissionAppList/test.PERMISSION") private fun getSummary( internalAppListModel: TogglePermissionInternalAppListModel<TestAppRecord>, ): State<String> { lateinit var summary: State<String> composeTestRule.setContent { summary = internalAppListModel.getSummary(record = TestAppRecord(APP)) } return summary } private companion object { 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 } } }