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

Commit 1a0e2aba authored by Chaohui Wang's avatar Chaohui Wang
Browse files

[Spa] Add RestrictedSwitchPreference

Also new Spa-system library, to provide user restrictions through
UserManager.getUserRestrictions().

Bug: 422439682
Flag: EXEMPT new library
Test: unit test
Test: example usage in gallery
Change-Id: I449316aba3a69416ceb6c25bf416b01abb089c76
parent 9b4004d2
Loading
Loading
Loading
Loading
+51 −47
Original line number Diff line number Diff line
@@ -21,8 +21,8 @@ import com.android.settingslib.spa.debug.DebugLogger
import com.android.settingslib.spa.framework.common.SettingsPageProviderRepository
import com.android.settingslib.spa.framework.common.SpaEnvironment
import com.android.settingslib.spa.framework.common.createSettingsPage
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.banner.BannerPageProvider
import com.android.settingslib.spa.gallery.button.ActionButtonPageProvider
import com.android.settingslib.spa.gallery.card.CardPageProvider
import com.android.settingslib.spa.gallery.chart.ChartPageProvider
import com.android.settingslib.spa.gallery.dialog.DialogMainPageProvider
@@ -30,15 +30,14 @@ import com.android.settingslib.spa.gallery.dialog.NavDialogProvider
import com.android.settingslib.spa.gallery.editor.EditorMainPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsDropdownBoxPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsDropdownCheckBoxProvider
import com.android.settingslib.spa.gallery.home.HomePageProvider
import com.android.settingslib.spa.gallery.editor.SettingsOutlinedTextFieldPageProvider
import com.android.settingslib.spa.gallery.editor.SettingsTextFieldPasswordPageProvider
import com.android.settingslib.spa.gallery.home.HomePageProvider
import com.android.settingslib.spa.gallery.page.ArgumentPageProvider
import com.android.settingslib.spa.gallery.page.FooterPageProvider
import com.android.settingslib.spa.gallery.page.IllustrationPageProvider
import com.android.settingslib.spa.gallery.page.LoadingBarPageProvider
import com.android.settingslib.spa.gallery.page.ProgressBarPageProvider
import com.android.settingslib.spa.gallery.scaffold.NonScrollablePagerPageProvider
import com.android.settingslib.spa.gallery.page.SliderPageProvider
import com.android.settingslib.spa.gallery.preference.CheckBoxPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.IntroPreferencePageProvider
@@ -51,12 +50,15 @@ import com.android.settingslib.spa.gallery.preference.TopIntroPreferencePageProv
import com.android.settingslib.spa.gallery.preference.TwoTargetButtonPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.TwoTargetSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.ZeroStatePreferencePageProvider
import com.android.settingslib.spa.gallery.restricted.GalleryRestrictedRepository
import com.android.settingslib.spa.gallery.restricted.RestrictedSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.scaffold.GlifScaffoldPageProvider
import com.android.settingslib.spa.gallery.scaffold.NonScrollablePagerPageProvider
import com.android.settingslib.spa.gallery.scaffold.PagerMainPageProvider
import com.android.settingslib.spa.gallery.scaffold.ScrollablePagerPageProvider
import com.android.settingslib.spa.gallery.scaffold.SearchScaffoldPageProvider
import com.android.settingslib.spa.gallery.scaffold.GlifScaffoldPageProvider
import com.android.settingslib.spa.gallery.ui.CategoryPageProvider
import com.android.settingslib.spa.gallery.ui.CopyablePageProvider
import com.android.settingslib.spa.gallery.scaffold.ScrollablePagerPageProvider
import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider

/**
@@ -73,7 +75,8 @@ enum class SettingsPageProviderEnum(val displayName: String) {
class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
    override val pageProviderRepository = lazy {
        SettingsPageProviderRepository(
            allPageProviders = listOf(
            allPageProviders =
                listOf(
                    HomePageProvider,
                    PreferenceMainPageProvider,
                    PreferencePageProvider,
@@ -111,10 +114,9 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
                    CheckBoxPreferencePageProvider,
                    TwoTargetButtonPreferencePageProvider,
                    CardPageProvider,
                    RestrictedSwitchPreferencePageProvider,
                ),
            rootPages = listOf(
                HomePageProvider.createSettingsPage(),
            )
            rootPages = listOf(HomePageProvider.createSettingsPage()),
        )
    }

@@ -126,4 +128,6 @@ class GallerySpaEnvironment(context: Context) : SpaEnvironment(context) {
    override val searchProviderAuthorities = "com.android.spa.gallery.search.provider"

    override val isSpaExpressiveEnabled = true

    override fun getRestrictedRepository(context: Context) = GalleryRestrictedRepository(context)
}
+2 −0
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.settingslib.spa.gallery.page.LoadingBarPageProvider
import com.android.settingslib.spa.gallery.page.ProgressBarPageProvider
import com.android.settingslib.spa.gallery.page.SliderPageProvider
import com.android.settingslib.spa.gallery.preference.PreferenceMainPageProvider
import com.android.settingslib.spa.gallery.restricted.RestrictedSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.scaffold.PagerMainPageProvider
import com.android.settingslib.spa.gallery.scaffold.SearchScaffoldPageProvider
import com.android.settingslib.spa.gallery.scaffold.GlifScaffoldPageProvider
@@ -61,6 +62,7 @@ object HomePageProvider : SettingsPageProvider {
        HomeScaffold(title) {
            Category {
                PreferenceMainPageProvider.Entry()
                RestrictedSwitchPreferencePageProvider.Entry()
            }
            Category {
                SearchScaffoldPageProvider.Entry()
+38 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.gallery.restricted

import android.content.Context
import android.content.Intent
import com.android.settingslib.spa.restricted.BlockedWithDetails
import com.android.settingslib.spa.restricted.NoRestricted
import com.android.settingslib.spa.restricted.RestrictedMode
import com.android.settingslib.spa.restricted.RestrictedRepository
import com.android.settingslib.spa.restricted.Restrictions

class GalleryRestrictedRepository(private val context: Context) : RestrictedRepository {
    override fun getRestrictedMode(restrictions: Restrictions): RestrictedMode {
        check(restrictions is GalleryRestrictions)
        if (restrictions.isRestricted)
            return object : BlockedWithDetails {
                override fun showDetails() {
                    context.startActivity(Intent("android.settings.SHOW_ADMIN_SUPPORT_DETAILS"))
                }
            }
        return NoRestricted
    }
}
+23 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.gallery.restricted

import com.android.settingslib.spa.restricted.Restrictions

data class GalleryRestrictions(val isRestricted: Boolean) : Restrictions {
    override fun isEmpty() = !isRestricted
}
+67 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settingslib.spa.gallery.restricted

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.restricted.RestrictedSwitchPreference
import com.android.settingslib.spa.widget.preference.Preference
import com.android.settingslib.spa.widget.preference.PreferenceModel
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import com.android.settingslib.spa.widget.ui.Category

private const val TITLE = "Sample RestrictedSwitchPreference"

object RestrictedSwitchPreferencePageProvider : SettingsPageProvider {
    override val name = "RestrictedSwitchPreference"

    @Composable
    override fun Page(arguments: Bundle?) {
        RegularScaffold(TITLE) { Category { SampleRestrictedSwitchPreference() } }
    }

    @Composable
    fun Entry() {
        Preference(
            object : PreferenceModel {
                override val title = TITLE
                override val onClick = navigator(name)
            }
        )
    }
}

@Composable
private fun SampleRestrictedSwitchPreference() {
    var checked by rememberSaveable { mutableStateOf(false) }
    RestrictedSwitchPreference(
        model =
            object : SwitchPreferenceModel {
                override val title = "RestrictedSwitchPreference"
                override val checked = { checked }
                override val onCheckedChange = { newChecked: Boolean -> checked = newChecked }
            },
        restrictions = GalleryRestrictions(isRestricted = true),
    )
}
Loading