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

Commit e8201d28 authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Add more tests for TogglePermissionAppListPageTest

Bug: 260660819
Test: Unit test
Test: Manually with Settings
Change-Id: Idacfa2f0636538d5cd5e0a3038ca4f9f9f9aac5a
parent 0a9d5c28
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
        }
    }
}