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

Commit 9ebe42ff authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Create TogglePermissionAppListProvider

Refactor to align with SPA.

Bug: 235727273
Test: Manual test with Test App
Change-Id: I2c2db7d00aa3ef050fe602e2b3549607321cfb3e
parent b009d37e
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -30,7 +30,6 @@ import androidx.navigation.NavType
import androidx.navigation.navArgument
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.widget.preference.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spaprivileged.model.app.AppRecord
@@ -44,7 +43,7 @@ private const val PACKAGE_NAME = "packageName"
private const val USER_ID = "userId"

internal class TogglePermissionAppInfoPageProvider(
    private val factory: TogglePermissionAppListModelFactory,
    private val appListTemplate: TogglePermissionAppListTemplate,
) : SettingsPageProvider {
    override val name = NAME

@@ -57,10 +56,10 @@ internal class TogglePermissionAppInfoPageProvider(
    @Composable
    override fun Page(arguments: Bundle?) {
        checkNotNull(arguments)
        val permission = checkNotNull(arguments.getString(PERMISSION))
        val permissionType = checkNotNull(arguments.getString(PERMISSION))
        val packageName = checkNotNull(arguments.getString(PACKAGE_NAME))
        val userId = arguments.getInt(USER_ID)
        val listModel = rememberContext { context -> factory.createModel(permission, context) }
        val listModel = appListTemplate.rememberModel(permissionType)
        TogglePermissionAppInfoPage(listModel, packageName, userId)
    }

+21 −15
Original line number Diff line number Diff line
@@ -47,20 +47,14 @@ interface TogglePermissionAppListModel<T : AppRecord> {
    fun setAllowed(record: T, newAllowed: Boolean)
}

interface TogglePermissionAppListModelFactory {
    fun createModel(
        permission: String,
        context: Context,
    ): TogglePermissionAppListModel<out AppRecord>
interface TogglePermissionAppListProvider {
    val permissionType: String

    fun createPageProviders(): List<SettingsPageProvider> = listOf(
        TogglePermissionAppListPageProvider(this),
        TogglePermissionAppInfoPageProvider(this),
    )
    fun createModel(context: Context): TogglePermissionAppListModel<out AppRecord>

    @Composable
    fun EntryItem(permissionType: String) {
        val listModel = rememberModel(permissionType)
    fun EntryItem() {
        val listModel = rememberContext(::createModel)
        Preference(
            object : PreferenceModel {
                override val title = stringResource(listModel.pageTitleResId)
@@ -74,10 +68,22 @@ interface TogglePermissionAppListModelFactory {
     *
     * Expose route to enable enter from non-SPA pages.
     */
    fun getRoute(permissionType: String): String =
    fun getRoute(): String =
        TogglePermissionAppListPageProvider.getRoute(permissionType)
}

class TogglePermissionAppListTemplate(
    allProviders: List<TogglePermissionAppListProvider>,
) {
    private val listModelProviderMap = allProviders.associateBy { it.permissionType }

    fun createPageProviders(): List<SettingsPageProvider> = listOf(
        TogglePermissionAppListPageProvider(this),
        TogglePermissionAppInfoPageProvider(this),
    )

    @Composable
internal fun TogglePermissionAppListModelFactory.rememberModel(permission: String) =
    rememberContext { context -> createModel(permission, context) }
    internal fun rememberModel(permissionType: String) = rememberContext { context ->
        listModelProviderMap.getValue(permissionType).createModel(context)
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -38,7 +38,7 @@ private const val NAME = "TogglePermissionAppList"
private const val PERMISSION = "permission"

internal class TogglePermissionAppListPageProvider(
    private val factory: TogglePermissionAppListModelFactory,
    private val appListTemplate: TogglePermissionAppListTemplate,
) : SettingsPageProvider {
    override val name = NAME

@@ -55,7 +55,7 @@ internal class TogglePermissionAppListPageProvider(

    @Composable
    private fun TogglePermissionAppList(permissionType: String) {
        val listModel = factory.rememberModel(permissionType)
        val listModel = appListTemplate.rememberModel(permissionType)
        val context = LocalContext.current
        val internalListModel = remember {
            TogglePermissionInternalAppListModel(context, listModel)