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

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

Add RestrictedSwitchPreference.ifBlockedByAdminOverrideCheckedValueTo

Some switch need this use case, when this is set on an switch UI,
the switch's checked status will be overridden to this value.

Bug: 380205192
Flag: EXEMPT bug fix
Test: manual - on Install unknown apps
Test: atest RestrictedSwitchPreferenceTest
Test: atest TogglePermissionAppListPageTest
Change-Id: Ib88ea74c61e175bb7d82b6b4f5e49ca9ea158471
parent 320b9e02
Loading
Loading
Loading
Loading
+6 −8
Original line number Diff line number Diff line
@@ -41,8 +41,6 @@ import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.app.IPackageManagers
import com.android.settingslib.spaprivileged.model.app.PackageManagers
import com.android.settingslib.spaprivileged.model.app.toRoute
import com.android.settingslib.spaprivileged.model.enterprise.EnhancedConfirmation
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
@@ -155,12 +153,12 @@ internal fun <T : AppRecord> TogglePermissionAppListModel<T>.TogglePermissionApp
            override val changeable = { isChangeable }
            override val onCheckedChange: (Boolean) -> Unit = { setAllowed(record, it) }
        }
        val restrictions = Restrictions(userId = userId,
            keys = switchRestrictionKeys,
            enhancedConfirmation = enhancedConfirmationKey?.let { EnhancedConfirmation(
                key = it,
                packageName = packageName) })
        RestrictedSwitchPreference(switchModel, restrictions, restrictionsProviderFactory)
        RestrictedSwitchPreference(
            model = switchModel,
            restrictions = getRestrictions(userId, packageName),
            ifBlockedByAdminOverrideCheckedValueTo = switchifBlockedByAdminOverrideCheckedValueTo,
            restrictionsProviderFactory = restrictionsProviderFactory,
        )
        InfoPageAdditionalContent(record, isAllowed)
    }
}
+22 −0
Original line number Diff line number Diff line
@@ -26,6 +26,8 @@ import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.rememberContext
import com.android.settingslib.spa.framework.util.asyncMapItem
import com.android.settingslib.spaprivileged.model.app.AppRecord
import com.android.settingslib.spaprivileged.model.enterprise.EnhancedConfirmation
import com.android.settingslib.spaprivileged.model.enterprise.Restrictions
import kotlinx.coroutines.flow.Flow

/**
@@ -38,6 +40,16 @@ interface TogglePermissionAppListModel<T : AppRecord> {
    val switchRestrictionKeys: List<String>
        get() = emptyList()

    /**
     * If this is not null, and on a switch UI restricted by admin, the switch's checked status will
     * be overridden.
     *
     * And if there is an admin summary, such as "Enabled by admin" or "Disabled by admin", will
     * also be overridden.
     */
    val switchifBlockedByAdminOverrideCheckedValueTo: Boolean?
        get() = null

    val enhancedConfirmationKey: String?
        get() = null

@@ -101,6 +113,16 @@ fun <T : AppRecord> TogglePermissionAppListModel<T>.isChangeableWithSystemUidChe
    record: T,
): Boolean = !record.isSystemOrRootUid() && isChangeable(record)

fun <T : AppRecord> TogglePermissionAppListModel<T>.getRestrictions(
    userId: Int,
    packageName: String,
) =
    Restrictions(
        userId = userId,
        keys = switchRestrictionKeys,
        enhancedConfirmation =
            enhancedConfirmationKey?.let { key -> EnhancedConfirmation(key, packageName) },
    )

interface TogglePermissionAppListProvider {
    val permissionType: String
+7 −13
Original line number Diff line number Diff line
@@ -42,8 +42,6 @@ import com.android.settingslib.spaprivileged.framework.compose.getPlaceholder
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.EnhancedConfirmation
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.rememberRestrictedMode
@@ -151,23 +149,19 @@ internal class TogglePermissionInternalAppListModel<T : AppRecord>(

    @Composable
    fun getSummary(record: T): () -> String {
        val restrictions = remember(record.app.userId, record.app.packageName) {
            Restrictions(
        val restrictions =
            listModel.getRestrictions(
                userId = record.app.userId,
                keys = listModel.switchRestrictionKeys,
                enhancedConfirmation = listModel.enhancedConfirmationKey?.let {
                    EnhancedConfirmation(
                        key = it,
                        packageName = record.app.packageName)
                })
        }
                packageName = record.app.packageName,
            )
        val restrictedMode by restrictionsProviderFactory.rememberRestrictedMode(restrictions)
        val allowed = listModel.isAllowed(record)
        return RestrictedSwitchPreferenceModel.getSummary(
            context = context,
            restrictedModeSupplier = { restrictedMode },
            summaryIfNoRestricted = { getSummaryIfNoRestricted(allowed()) },
            checked = allowed,
            checkedIfNoRestricted = allowed,
            checkedIfBlockedByAdmin = listModel.switchifBlockedByAdminOverrideCheckedValueTo,
            restrictedModeSupplier = { restrictedMode },
        )
    }

+20 −2
Original line number Diff line number Diff line
@@ -25,12 +25,25 @@ import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProvid
import com.android.settingslib.spaprivileged.model.enterprise.RestrictionsProviderImpl
import com.android.settingslib.spaprivileged.template.preference.RestrictedSwitchPreferenceModel.Companion.RestrictedSwitchWrapper

/**
 * @param ifBlockedByAdminOverrideCheckedValueTo if this is not null and there is an admin
 *   restriction, the switch's checked status will be overridden.
 *
 *   And if there is an admin summary, such as "Enabled by admin" or "Disabled by admin", will also
 *   be overridden.
 */
@Composable
fun RestrictedSwitchPreference(
    model: SwitchPreferenceModel,
    restrictions: Restrictions,
    ifBlockedByAdminOverrideCheckedValueTo: Boolean? = null,
) {
    RestrictedSwitchPreference(model, restrictions, ::RestrictionsProviderImpl)
    RestrictedSwitchPreference(
        model = model,
        restrictions = restrictions,
        ifBlockedByAdminOverrideCheckedValueTo = ifBlockedByAdminOverrideCheckedValueTo,
        restrictionsProviderFactory = ::RestrictionsProviderImpl,
    )
}

@VisibleForTesting
@@ -38,13 +51,18 @@ fun RestrictedSwitchPreference(
internal fun RestrictedSwitchPreference(
    model: SwitchPreferenceModel,
    restrictions: Restrictions,
    ifBlockedByAdminOverrideCheckedValueTo: Boolean? = null,
    restrictionsProviderFactory: RestrictionsProviderFactory,
) {
    if (restrictions.isEmpty()) {
        SwitchPreference(model)
        return
    }
    restrictionsProviderFactory.RestrictedSwitchWrapper(model, restrictions) {
    restrictionsProviderFactory.RestrictedSwitchWrapper(
        model = model,
        restrictions = restrictions,
        ifBlockedByAdminOverrideCheckedValueTo = ifBlockedByAdminOverrideCheckedValueTo,
    ) {
        SwitchPreference(it)
    }
}
+40 −21
Original line number Diff line number Diff line
@@ -42,26 +42,29 @@ internal class RestrictedSwitchPreferenceModel(
    context: Context,
    model: SwitchPreferenceModel,
    private val restrictedMode: RestrictedMode?,
    private val ifBlockedByAdminOverrideCheckedValueTo: Boolean?,
) : SwitchPreferenceModel {
    override val title = model.title

    override val summary = getSummary(
    override val checked =
        when (restrictedMode) {
            null -> ({ null })
            is NoRestricted -> model.checked
            is BaseUserRestricted -> ({ false })
            is BlockedByAdmin -> ({ ifBlockedByAdminOverrideCheckedValueTo ?: model.checked() })
            is BlockedByEcm -> model.checked
        }

    override val summary =
        getSummary(
            context = context,
            restrictedModeSupplier = { restrictedMode },
            summaryIfNoRestricted = model.summary,
        checked = model.checked,
            checkedIfNoRestricted = checked,
        )

    override val icon = model.icon

    override val checked = when (restrictedMode) {
        null -> ({ null })
        is NoRestricted -> model.checked
        is BaseUserRestricted -> ({ false })
        is BlockedByAdmin -> model.checked
        is BlockedByEcm -> model.checked
    }

    override val changeable = restrictedMode.restrictEnabled(model.changeable)

    override val onCheckedChange = restrictedMode.restrictOnClick(model.onCheckedChange)
@@ -112,11 +115,19 @@ internal class RestrictedSwitchPreferenceModel(
        fun RestrictedSwitchWrapper(
            model: SwitchPreferenceModel,
            restrictedMode: RestrictedMode?,
            ifBlockedByAdminOverrideCheckedValueTo: Boolean? = null,
            content: @Composable (SwitchPreferenceModel) -> Unit,
        ) {
            val context = LocalContext.current
            val restrictedSwitchPreferenceModel = remember(restrictedMode, model) {
                RestrictedSwitchPreferenceModel(context, model, restrictedMode)
            val restrictedSwitchPreferenceModel =
                remember(restrictedMode, model) {
                    RestrictedSwitchPreferenceModel(
                        context = context,
                        model = model,
                        restrictedMode = restrictedMode,
                        ifBlockedByAdminOverrideCheckedValueTo =
                            ifBlockedByAdminOverrideCheckedValueTo,
                    )
                }
            restrictedSwitchPreferenceModel.RestrictionWrapper {
                content(restrictedSwitchPreferenceModel)
@@ -127,23 +138,31 @@ internal class RestrictedSwitchPreferenceModel(
        fun RestrictionsProviderFactory.RestrictedSwitchWrapper(
            model: SwitchPreferenceModel,
            restrictions: Restrictions,
            ifBlockedByAdminOverrideCheckedValueTo: Boolean? = null,
            content: @Composable (SwitchPreferenceModel) -> Unit,
        ) {
            RestrictedSwitchWrapper(model, rememberRestrictedMode(restrictions).value, content)
            RestrictedSwitchWrapper(
                model = model,
                restrictedMode = rememberRestrictedMode(restrictions).value,
                ifBlockedByAdminOverrideCheckedValueTo = ifBlockedByAdminOverrideCheckedValueTo,
                content = content,
            )
        }

        fun getSummary(
            context: Context,
            restrictedModeSupplier: () -> RestrictedMode?,
            summaryIfNoRestricted: () -> String,
            checked: () -> Boolean?,
            checkedIfNoRestricted: () -> Boolean?,
            checkedIfBlockedByAdmin: Boolean? = null,
            restrictedModeSupplier: () -> RestrictedMode?,
        ): () -> String = {
            when (val restrictedMode = restrictedModeSupplier()) {
                is NoRestricted -> summaryIfNoRestricted()
                is BaseUserRestricted ->
                    context.getString(com.android.settingslib.R.string.disabled)

                is BlockedByAdmin -> restrictedMode.getSummary(checked())
                is BlockedByAdmin ->
                    restrictedMode.getSummary(checkedIfBlockedByAdmin ?: checkedIfNoRestricted())
                is BlockedByEcm ->
                    context.getString(com.android.settingslib.R.string.disabled)

Loading