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

Commit 52d6effa authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Create TwoTargetSwitchPreference for SpaLib

Also make title max one line in the SettingsScaffold.

Bug: 235727273
Test: Unit test
Test: Manual with Gallery App
Change-Id: I75731bd47e4631d7b4db11cb459ef2b6880b29cf
parent bd268107
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import com.android.settingslib.spa.gallery.page.SliderPageProvider
import com.android.settingslib.spa.gallery.preference.PreferenceMainPageProvider
import com.android.settingslib.spa.gallery.preference.PreferencePageProvider
import com.android.settingslib.spa.gallery.preference.SwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.preference.TwoTargetSwitchPreferencePageProvider
import com.android.settingslib.spa.gallery.ui.SpinnerPageProvider

val galleryPageProviders = SettingsPageProviderRepository(
@@ -33,6 +34,7 @@ val galleryPageProviders = SettingsPageProviderRepository(
        PreferenceMainPageProvider,
        PreferencePageProvider,
        SwitchPreferencePageProvider,
        TwoTargetSwitchPreferencePageProvider,
        ArgumentPageProvider,
        SliderPageProvider,
        SpinnerPageProvider,
+1 −0
Original line number Diff line number Diff line
@@ -48,5 +48,6 @@ private fun PreferenceMain() {
    RegularScaffold(title = TITLE) {
        PreferencePageProvider.EntryItem()
        SwitchPreferencePageProvider.EntryItem()
        TwoTargetSwitchPreferencePageProvider.EntryItem()
    }
}
+128 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 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.preference

import android.os.Bundle
import androidx.compose.runtime.Composable
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.produceState
import androidx.compose.runtime.remember
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.navigator
import com.android.settingslib.spa.framework.compose.stateOf
import com.android.settingslib.spa.framework.theme.SettingsTheme
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.preference.TwoTargetSwitchPreference
import com.android.settingslib.spa.widget.scaffold.RegularScaffold
import kotlinx.coroutines.delay

private const val TITLE = "Sample TwoTargetSwitchPreference"

object TwoTargetSwitchPreferencePageProvider : SettingsPageProvider {
    override val name = "TwoTargetSwitchPreference"

    @Composable
    override fun Page(arguments: Bundle?) {
        TwoTargetSwitchPreferencePage()
    }

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

@Composable
private fun TwoTargetSwitchPreferencePage() {
    RegularScaffold(title = TITLE) {
        SampleTwoTargetSwitchPreference()
        SampleTwoTargetSwitchPreferenceWithSummary()
        SampleTwoTargetSwitchPreferenceWithAsyncSummary()
        SampleNotChangeableTwoTargetSwitchPreference()
    }
}

@Composable
private fun SampleTwoTargetSwitchPreference() {
    val checked = rememberSaveable { mutableStateOf(false) }
    TwoTargetSwitchPreference(remember {
        object : SwitchPreferenceModel {
            override val title = "TwoTargetSwitchPreference"
            override val checked = checked
            override val onCheckedChange = { newChecked: Boolean -> checked.value = newChecked }
        }
    }) {}
}

@Composable
private fun SampleTwoTargetSwitchPreferenceWithSummary() {
    val checked = rememberSaveable { mutableStateOf(true) }
    TwoTargetSwitchPreference(remember {
        object : SwitchPreferenceModel {
            override val title = "TwoTargetSwitchPreference"
            override val summary = stateOf("With summary")
            override val checked = checked
            override val onCheckedChange = { newChecked: Boolean -> checked.value = newChecked }
        }
    }) {}
}

@Composable
private fun SampleTwoTargetSwitchPreferenceWithAsyncSummary() {
    val checked = rememberSaveable { mutableStateOf(true) }
    val summary = produceState(initialValue = " ") {
        delay(1000L)
        value = "Async summary"
    }
    TwoTargetSwitchPreference(remember {
        object : SwitchPreferenceModel {
            override val title = "TwoTargetSwitchPreference"
            override val summary = summary
            override val checked = checked
            override val onCheckedChange = { newChecked: Boolean -> checked.value = newChecked }
        }
    }) {}
}

@Composable
private fun SampleNotChangeableTwoTargetSwitchPreference() {
    val checked = rememberSaveable { mutableStateOf(true) }
    TwoTargetSwitchPreference(remember {
        object : SwitchPreferenceModel {
            override val title = "TwoTargetSwitchPreference"
            override val summary = stateOf("Not changeable")
            override val changeable = stateOf(false)
            override val checked = checked
            override val onCheckedChange = { newChecked: Boolean -> checked.value = newChecked }
        }
    }) {}
}

@Preview(showBackground = true)
@Composable
private fun TwoTargetSwitchPreferencePagePreview() {
    SettingsTheme {
        TwoTargetSwitchPreferencePage()
    }
}
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ object SettingsDimension {
        bottom = itemPaddingVertical,
    )
    val itemPaddingAround = 8.dp
    val itemDividerHeight = 32.dp

    /** The size when app icon is displayed in list. */
    val appIconItemSize = 32.dp
+1 −0
Original line number Diff line number Diff line
@@ -19,4 +19,5 @@ package com.android.settingslib.spa.framework.theme
object SettingsOpacity {
    const val Full = 1f
    const val Disabled = 0.38f
    const val Divider = 0.2f
}
Loading