Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cbc1cb61 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge "Add more tests for TogglePermissionAppListPageTest"

parents bed60787 e8201d28
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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
+34 −31
Original line number Diff line number Diff line
@@ -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
@@ -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 {
@@ -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)
@@ -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)
+2 −3
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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) {
+113 −9
Original line number Diff line number Diff line
@@ -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
@@ -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 {
@@ -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
        }
    }
}