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

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

Merge "[Spa] Add title contentDescription for Preference" into main

parents 1698cd11 239aa9d9
Loading
Loading
Loading
Loading
+27 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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.framework.compose

import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics

/** Sets the content description of this node. */
fun Modifier.contentDescription(contentDescription: String?) =
    if (contentDescription != null) this.semantics {
        this.contentDescription = contentDescription
    } else this
+2 −4
Original line number Original line Diff line number Diff line
@@ -48,10 +48,9 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.semantics.contentDescription
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
import com.android.settingslib.spa.debug.UiModePreviews
import com.android.settingslib.spa.debug.UiModePreviews
import com.android.settingslib.spa.framework.compose.contentDescription
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsDimension
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraLarge
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall
import com.android.settingslib.spa.framework.theme.SettingsShape.CornerExtraSmall
@@ -191,8 +190,7 @@ private fun Buttons(buttons: List<CardButton>, color: Color) {
private fun Button(button: CardButton, color: Color) {
private fun Button(button: CardButton, color: Color) {
    TextButton(
    TextButton(
        onClick = button.onClick,
        onClick = button.onClick,
        modifier =
        modifier = Modifier.contentDescription(button.contentDescription),
            Modifier.semantics { button.contentDescription?.let { this.contentDescription = it } }
    ) {
    ) {
        Text(text = button.text, color = color)
        Text(text = button.text, color = color)
    }
    }
+12 −3
Original line number Original line Diff line number Diff line
@@ -28,6 +28,7 @@ import androidx.compose.material3.HorizontalDivider
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.semantics
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.dp
@@ -41,7 +42,8 @@ internal fun BaseLayout(
    title: String,
    title: String,
    subTitle: @Composable () -> Unit,
    subTitle: @Composable () -> Unit,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
    icon: (@Composable () -> Unit)? = null,
    titleContentDescription: String? = null,
    icon: @Composable (() -> Unit)? = null,
    enabled: () -> Boolean = { true },
    enabled: () -> Boolean = { true },
    paddingStart: Dp = SettingsDimension.itemPaddingStart,
    paddingStart: Dp = SettingsDimension.itemPaddingStart,
    paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
    paddingEnd: Dp = SettingsDimension.itemPaddingEnd,
@@ -51,6 +53,7 @@ internal fun BaseLayout(
    Row(
    Row(
        modifier = modifier
        modifier = modifier
            .fillMaxWidth()
            .fillMaxWidth()
            .semantics(mergeDescendants = true) {}
            .padding(end = paddingEnd),
            .padding(end = paddingEnd),
        verticalAlignment = Alignment.CenterVertically,
        verticalAlignment = Alignment.CenterVertically,
    ) {
    ) {
@@ -58,6 +61,7 @@ internal fun BaseLayout(
        BaseIcon(icon, alphaModifier, paddingStart)
        BaseIcon(icon, alphaModifier, paddingStart)
        Titles(
        Titles(
            title = title,
            title = title,
            titleContentDescription = titleContentDescription,
            subTitle = subTitle,
            subTitle = subTitle,
            modifier = alphaModifier
            modifier = alphaModifier
                .weight(1f)
                .weight(1f)
@@ -87,9 +91,14 @@ internal fun BaseIcon(


// Extracts a scope to avoid frequent recompose outside scope.
// Extracts a scope to avoid frequent recompose outside scope.
@Composable
@Composable
private fun Titles(title: String, subTitle: @Composable () -> Unit, modifier: Modifier) {
private fun Titles(
    title: String,
    titleContentDescription: String?,
    subTitle: @Composable () -> Unit,
    modifier: Modifier,
) {
    Column(modifier) {
    Column(modifier) {
        SettingsTitle(title)
        SettingsTitle(title, titleContentDescription)
        subTitle()
        subTitle()
    }
    }
}
}
+4 −0
Original line number Original line Diff line number Diff line
@@ -32,6 +32,8 @@ internal fun BasePreference(
    title: String,
    title: String,
    summary: () -> String,
    summary: () -> String,
    modifier: Modifier = Modifier,
    modifier: Modifier = Modifier,
    titleContentDescription: String? = null,
    summaryContentDescription: () -> String? = { null },
    singleLineSummary: Boolean = false,
    singleLineSummary: Boolean = false,
    icon: @Composable (() -> Unit)? = null,
    icon: @Composable (() -> Unit)? = null,
    enabled: () -> Boolean = { true },
    enabled: () -> Boolean = { true },
@@ -42,9 +44,11 @@ internal fun BasePreference(
) {
) {
    BaseLayout(
    BaseLayout(
        title = title,
        title = title,
        titleContentDescription = titleContentDescription,
        subTitle = {
        subTitle = {
            SettingsBody(
            SettingsBody(
                body = summary(),
                body = summary(),
                contentDescription = summaryContentDescription(),
                maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE,
                maxLines = if (singleLineSummary) 1 else Int.MAX_VALUE,
            )
            )
        },
        },
+14 −0
Original line number Original line Diff line number Diff line
@@ -63,12 +63,24 @@ interface PreferenceModel {
     */
     */
    val title: String
    val title: String


    /**
     * The content description of [title].
     */
    val titleContentDescription: String?
        get() = null

    /**
    /**
     * The summary of this [Preference].
     * The summary of this [Preference].
     */
     */
    val summary: () -> String
    val summary: () -> String
        get() = { "" }
        get() = { "" }


    /**
     * The content description of [summary].
     */
    val summaryContentDescription: () -> String?
        get() = { null }

    /**
    /**
     * The icon of this [Preference].
     * The icon of this [Preference].
     *
     *
@@ -112,7 +124,9 @@ fun Preference(
    EntryHighlight {
    EntryHighlight {
        BasePreference(
        BasePreference(
            title = model.title,
            title = model.title,
            titleContentDescription = model.titleContentDescription,
            summary = model.summary,
            summary = model.summary,
            summaryContentDescription = model.summaryContentDescription,
            singleLineSummary = singleLineSummary,
            singleLineSummary = singleLineSummary,
            modifier = modifier,
            modifier = modifier,
            icon = model.icon,
            icon = model.icon,
Loading