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