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

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

Let Preference support single line summary

Add singleLineSummary param, default false.

When set to true, this preference's summary will has max 1 line height.

Bug: 236346018
Test: Unit test
Test: Manual with Gallery App
Change-Id: Ib4d68be1a3f4c306608838b8382d23454bf15253
parent 6908999c
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -19,4 +19,9 @@
    <string name="app_label" translatable="false">Gallery</string>
    <!-- Gallery App name. [DO NOT TRANSLATE] -->
    <string name="app_name" translatable="false">SpaLib Gallery</string>

    <!-- Title for single line summary preference. [DO NOT TRANSLATE] -->
    <string name="single_line_summary_preference_title" translatable="false">Preference (singleLineSummary = true)</string>
    <!-- Summary for single line summary preference. [DO NOT TRANSLATE] -->
    <string name="single_line_summary_preference_summary" translatable="false">A very long summary to show case a preference which only shows a single line summary.</string>
</resources>
+20 −0
Original line number Diff line number Diff line
@@ -24,12 +24,15 @@ import androidx.compose.material.icons.outlined.TouchApp
import androidx.compose.runtime.Composable
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.remember
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import com.android.settingslib.spa.framework.common.EntrySearchData
import com.android.settingslib.spa.framework.common.SettingsEntry
import com.android.settingslib.spa.framework.common.SettingsEntryBuilder
import com.android.settingslib.spa.framework.common.SettingsPageProvider
import com.android.settingslib.spa.framework.compose.toState
import com.android.settingslib.spa.framework.theme.SettingsTheme
import com.android.settingslib.spa.gallery.R
import com.android.settingslib.spa.gallery.SettingsPageProviderEnum
import com.android.settingslib.spa.gallery.createSettingsPage
import com.android.settingslib.spa.gallery.preference.PreferencePageModel.Companion.ASYNC_PREFERENCE_TITLE
@@ -55,6 +58,7 @@ object PreferencePageProvider : SettingsPageProvider {
    enum class EntryEnum(val displayName: String) {
        SIMPLE_PREFERENCE("preference"),
        SUMMARY_PREFERENCE("preference_with_summary"),
        SINGLE_LINE_SUMMARY_PREFERENCE("preference_with_single_line_summary"),
        DISABLED_PREFERENCE("preference_disable"),
        ASYNC_SUMMARY_PREFERENCE("preference_with_async_summary"),
        MANUAL_UPDATE_PREFERENCE("preference_actionable"),
@@ -92,6 +96,7 @@ object PreferencePageProvider : SettingsPageProvider {
                }
                .build()
        )
        entryList.add(singleLineSummaryEntry())
        entryList.add(
            createEntry(EntryEnum.DISABLED_PREFERENCE)
                .setIsAllowSearch(true)
@@ -163,6 +168,21 @@ object PreferencePageProvider : SettingsPageProvider {
        return entryList
    }

    private fun singleLineSummaryEntry() = createEntry(EntryEnum.SINGLE_LINE_SUMMARY_PREFERENCE)
        .setIsAllowSearch(true)
        .setUiLayoutFn {
            Preference(
                model = object : PreferenceModel {
                    override val title: String =
                        stringResource(R.string.single_line_summary_preference_title)
                    override val summary =
                        stringResource(R.string.single_line_summary_preference_summary).toState()
                },
                singleLineSummary = true,
            )
        }
        .build()

    fun buildInjectEntry(): SettingsEntryBuilder {
        return SettingsEntryBuilder.createInject(owner = owner)
            .setIsAllowSearch(true)
+9 −2
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ internal fun BasePreference(
    title: String,
    summary: State<String>,
    modifier: Modifier = Modifier,
    icon: (@Composable () -> Unit)? = null,
    singleLineSummary: Boolean = false,
    icon: @Composable (() -> Unit)? = null,
    enabled: State<Boolean> = true.toState(),
    paddingStart: Dp = SettingsDimension.itemPaddingStart,
    paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
@@ -43,7 +44,13 @@ internal fun BasePreference(
) {
    BaseLayout(
        title = title,
        subTitle = { SettingsBody(summary) },
        subTitle = {
            if (singleLineSummary) {
                SettingsBody(body = summary, maxLines = 1)
            } else {
                SettingsBody(body = summary)
            }
        },
        modifier = modifier,
        icon = icon,
        enabled = enabled,
+5 −1
Original line number Diff line number Diff line
@@ -101,7 +101,10 @@ interface PreferenceModel {
 * Data is provided through [PreferenceModel].
 */
@Composable
fun Preference(model: PreferenceModel) {
fun Preference(
    model: PreferenceModel,
    singleLineSummary: Boolean = false,
) {
    val modifier = remember(model.enabled.value, model.onClick) {
        model.onClick?.let { onClick ->
            Modifier.clickable(enabled = model.enabled.value, onClick = onClick)
@@ -110,6 +113,7 @@ fun Preference(model: PreferenceModel) {
    BasePreference(
        title = model.title,
        summary = model.summary,
        singleLineSummary = singleLineSummary,
        modifier = modifier,
        icon = model.icon,
        enabled = model.enabled,
+33 −3
Original line number Diff line number Diff line
@@ -17,13 +17,19 @@
package com.android.settingslib.spa.widget.ui

import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.width
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.framework.theme.SettingsTheme

@Composable
fun SettingsTitle(title: State<String>) {
@@ -40,17 +46,25 @@ fun SettingsTitle(title: String) {
}

@Composable
fun SettingsBody(body: State<String>) {
    SettingsBody(body.value)
fun SettingsBody(
    body: State<String>,
    maxLines: Int = Int.MAX_VALUE,
) {
    SettingsBody(body = body.value, maxLines = maxLines)
}

@Composable
fun SettingsBody(body: String) {
fun SettingsBody(
    body: String,
    maxLines: Int = Int.MAX_VALUE,
) {
    if (body.isNotEmpty()) {
        Text(
            text = body,
            color = MaterialTheme.colorScheme.onSurfaceVariant,
            style = MaterialTheme.typography.bodyMedium,
            overflow = TextOverflow.Ellipsis,
            maxLines = maxLines,
        )
    }
}
@@ -68,3 +82,19 @@ fun PlaceholderTitle(title: String) {
        )
    }
}

@Preview
@Composable
private fun BasePreferencePreview() {
    SettingsTheme {
        Column(Modifier.width(100.dp)) {
            SettingsBody(
                body = "Long long long long long long text",
            )
            SettingsBody(
                body = "Long long long long long long text",
                maxLines = 1,
            )
        }
    }
}
Loading