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

Commit 2e962bc5 authored by Chaohui Wang's avatar Chaohui Wang Committed by Android (Google) Code Review
Browse files

Merge changes Id5a3990b,I3121f9a3

* changes:
  Add Footer for SpaLib
  Add SwitchPreference for SpaLib
parents 30f37734 2b942b03
Loading
Loading
Loading
Loading
+71 −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.codelab.page

import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.api.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.ui.Footer

object FooterPageProvider : SettingsPageProvider {
    override val name = "Footer"

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

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

@Composable
private fun FooterPage() {
    Column(Modifier.verticalScroll(rememberScrollState())) {
        Preference(remember {
            object : PreferenceModel {
                override val title = "Some Preference"
                override val summary = stateOf("Some summary")
            }
        })
        Footer(footerText = "Footer text always at the end of page.")
    }
}

@Preview(showBackground = true)
@Composable
private fun FooterPagePreview() {
    SettingsTheme {
        FooterPage()
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -50,10 +50,11 @@ private fun HomePage() {
        )

        PreferencePageProvider.EntryItem()

        SwitchPreferencePageProvider.EntryItem()
        ArgumentPageProvider.EntryItem(stringParam = "foo", intParam = 0)

        SliderPageProvider.EntryItem()
        FooterPageProvider.EntryItem()
    }
}

+3 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import com.android.settingslib.spa.framework.api.SettingsPageRepository
object Destinations {
    const val Home = "Home"
    const val Preference = "Preference"
    const val SwitchPreference = "SwitchPreference"
    const val Argument = "Argument"
    const val Slider = "Slider"
}
@@ -29,8 +30,10 @@ val codelabPageRepository = SettingsPageRepository(
    allPages = listOf(
        HomePageProvider,
        PreferencePageProvider,
        SwitchPreferencePageProvider,
        ArgumentPageProvider,
        SliderPageProvider,
        FooterPageProvider,
    ),
    startDestination = Destinations.Home,
)
+129 −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.codelab.page

import android.os.Bundle
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
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.Modifier
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.api.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.SwitchPreference
import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel
import kotlinx.coroutines.delay

object SwitchPreferencePageProvider : SettingsPageProvider {
    override val name = Destinations.SwitchPreference

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

    @Composable
    fun EntryItem() {
        Preference(object : PreferenceModel {
            override val title = "Sample SwitchPreference"
            override val onClick = navigator(Destinations.SwitchPreference)
        })
    }
}

@Composable
private fun SwitchPreferencePage() {
    Column(Modifier.verticalScroll(rememberScrollState())) {
        SampleSwitchPreference()
        SampleSwitchPreferenceWithSummary()
        SampleSwitchPreferenceWithAsyncSummary()
        SampleNotChangeableSwitchPreference()
    }
}

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

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

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

@Composable
private fun SampleNotChangeableSwitchPreference() {
    val checked = rememberSaveable { mutableStateOf(true) }
    SwitchPreference(remember {
        object : SwitchPreferenceModel {
            override val title = "SwitchPreference"
            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 SwitchPreferencePagePreview() {
    SettingsTheme {
        SwitchPreferencePage()
    }
}
+4 −1
Original line number Diff line number Diff line
@@ -31,6 +31,9 @@ android_library {
        "androidx.navigation_navigation-compose",
        "com.google.android.material_material",
    ],
    kotlincflags: ["-Xjvm-default=all"],
    kotlincflags: [
        "-Xjvm-default=all",
        "-Xopt-in=kotlin.RequiresOptIn",
    ],
    min_sdk_version: "31",
}
Loading