Create TogglePermissionAppListProvider

Refactor to align with SPA.

Bug: 235727273
Test: Manual test with Test App
Change-Id: I2c2db7d00aa3ef050fe602e2b3549607321cfb3e
This commit is contained in:
Chaohui Wang
2022-08-30 13:39:12 +08:00
parent b009d37e92
commit 9ebe42ffce
3 changed files with 26 additions and 21 deletions

View File

@@ -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)
}

View File

@@ -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)
}
@Composable
internal fun TogglePermissionAppListModelFactory.rememberModel(permission: String) =
rememberContext { context -> createModel(permission, context) }
class TogglePermissionAppListTemplate(
allProviders: List<TogglePermissionAppListProvider>,
) {
private val listModelProviderMap = allProviders.associateBy { it.permissionType }
fun createPageProviders(): List<SettingsPageProvider> = listOf(
TogglePermissionAppListPageProvider(this),
TogglePermissionAppInfoPageProvider(this),
)
@Composable
internal fun rememberModel(permissionType: String) = rememberContext { context ->
listModelProviderMap.getValue(permissionType).createModel(context)
}
}

View File

@@ -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)