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

Commit 63ea7bba authored by Yi-an Chen's avatar Yi-an Chen
Browse files

Support style injection for preference category and footer

Bug: 375480783
Test: manual
Flag: com.android.settingslib.widget.theme.flags.is_expressive_design_enabled
Relnote: N/A
Change-Id: Ia492a66f3c8d66bdd13937350449d12b10a3c035
parent b2de7084
Loading
Loading
Loading
Loading
+8 −42
Original line number Diff line number Diff line
@@ -19,59 +19,25 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/selectableItemBackground"
    android:orientation="vertical"
    android:clipToPadding="false"
    android:layoutDirection="locale"
    android:textDirection="locale">
    android:theme="?expressiveFooterPreferenceTheme"
    style="?expressiveFooterPreferenceRootLayoutStyle">

    <LinearLayout
        android:id="@+id/icon_frame"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:minWidth="56dp"
        android:gravity="start|top"
        android:orientation="horizontal"
        android:paddingEnd="12dp"
        android:paddingTop="16dp"
        android:paddingBottom="4dp">
        style="?expressiveFooterPreferenceIconFrameStyle">
        <ImageView
            android:id="@android:id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
            style="?expressiveFooterPreferenceIconStyle"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical">
    <LinearLayout style="?expressiveFooterPreferenceLinearLayoutStyle">
        <TextView
            android:id="@android:id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            android:paddingTop="16dp"
            android:paddingBottom="8dp"
            android:textColor="?android:attr/textColorSecondary"
            android:hyphenationFrequency="normalFast"
            android:lineBreakWordStyle="phrase"
            android:ellipsize="marquee" />
            style="?expressiveFooterPreferenceTitleStyle"/>

        <com.android.settingslib.widget.LinkTextView
            android:id="@+id/settingslib_learn_more"
            android:text="@string/settingslib_learn_more_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            android:paddingBottom="8dp"
            android:clickable="true"
            android:visibility="gone"
            style="@style/TextAppearance.Footer.Title.SettingsLib"/>
            style="?expressiveFooterPreferenceLearnMoreStyle"/>
    </LinearLayout>

</LinearLayout>
+89 −0
Original line number Diff line number Diff line
<?xml version="1.0" encoding="utf-8"?>
<!--
    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.
  -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">
    <style name="ThemeOverlay.ExpressiveFooterPreference" parent="">
        <item name="expressiveFooterPreferenceTheme">@style/ExpressiveFooterPreferenceTheme</item>
    </style>

    <style name="ExpressiveFooterPreferenceTheme">
        <item name="expressiveFooterPreferenceRootLayoutStyle">@style/ExpressiveFooterPreferenceRootLayoutStyle</item>
        <item name="expressiveFooterPreferenceIconFrameStyle">@style/ExpressiveFooterPreferenceIconFrameStyle</item>
        <item name="expressiveFooterPreferenceIconStyle">@style/ExpressiveFooterPreferenceIconStyle</item>
        <item name="expressiveFooterPreferenceLinearLayoutStyle">@style/ExpressiveFooterPreferenceLinearLayoutStyle</item>
        <item name="expressiveFooterPreferenceTitleStyle">@style/ExpressiveFooterPreferenceTitleStyle</item>
        <item name="expressiveFooterPreferenceLearnMoreStyle">@style/ExpressiveFooterPreferenceLearnMoreStyle</item>
    </style>

    <style name="ExpressiveFooterPreferenceRootLayoutStyle">
        <item name="android:minHeight">?android:attr/listPreferredItemHeight</item>
        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
        <item name="android:background">?android:attr/selectableItemBackground</item>
        <item name="android:orientation">vertical</item>
        <item name="android:clipToPadding">false</item>
        <item name="android:layoutDirection">locale</item>
        <item name="android:textDirection">locale</item>
    </style>

    <style name="ExpressiveFooterPreferenceIconFrameStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:minWidth">56dp</item>
        <item name="android:gravity">start|top</item>
        <item name="android:orientation">horizontal</item>
        <item name="android:paddingEnd">12dp</item>
        <item name="android:paddingTop">16dp</item>
        <item name="android:paddingBottom">4dp</item>
    </style>

    <style name="ExpressiveFooterPreferenceIconStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

    <style name="ExpressiveFooterPreferenceLinearLayoutStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:orientation">vertical</item>
    </style>

    <style name="ExpressiveFooterPreferenceTitleStyle">
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">start</item>
        <item name="android:textAlignment">viewStart</item>
        <item name="android:paddingTop">16dp</item>
        <item name="android:paddingBottom">8dp</item>
        <item name="android:textColor">?android:attr/textColorSecondary</item>
        <item name="android:hyphenationFrequency">normalFast</item>
        <item name="android:lineBreakWordStyle">phrase</item>
        <item name="android:ellipsize">marquee</item>
    </style>

    <style
        name="ExpressiveFooterPreferenceLearnMoreStyle"
        parent="@style/TextAppearance.Footer.Title.SettingsLib">
        <item name="android:text">@string/settingslib_learn_more_text</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">start</item>
        <item name="android:textAlignment">viewStart</item>
        <item name="android:paddingBottom">8dp</item>
        <item name="android:clickable">true</item>
        <item name="android:visibility">gone</item>
    </style>
</resources>
+21 −1
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package com.android.settingslib.widget;

import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextUtils;
@@ -57,7 +59,11 @@ public class FooterPreference extends Preference
    private FooterLearnMoreSpan mLearnMoreSpan;

    public FooterPreference(Context context, AttributeSet attrs) {
        super(context, attrs, com.android.settingslib.widget.theme.R.attr.footerPreferenceStyle);
        super(
                applyExpressivePreferenceThemeOverlay(context),
                attrs,
                com.android.settingslib.widget.theme.R.attr.footerPreferenceStyle
        );
        init();
    }

@@ -221,6 +227,20 @@ public class FooterPreference extends Preference
        setPersistent(false);
    }

    @NonNull
    private static Context applyExpressivePreferenceThemeOverlay(@NonNull Context context) {
        TypedArray typedArray = context.obtainStyledAttributes(new int[] {
                com.android.settingslib.widget.theme.R.attr
                        .expressiveFooterPreferenceTheme});
        // Since the context is shared, only try to apply the theme if it 's not resolved.
        if (typedArray.getResourceId(0, Resources.ID_NULL) == Resources.ID_NULL) {
            context.getTheme().applyStyle(
                    R.style.ThemeOverlay_ExpressiveFooterPreference, false);
        }
        typedArray.recycle();
        return context;
    }

    /** The builder is convenient to creat a dynamic FooterPreference. */
    public static class Builder {
        private Context mContext;
+7 −33
Original line number Diff line number Diff line
@@ -19,47 +19,21 @@
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:background="?android:attr/selectableItemBackground"
    android:baselineAligned="false"
    android:layout_marginTop="@dimen/settingslib_expressive_space_small1"
    android:gravity="center_vertical"
    android:filterTouchesWhenObscured="false">
    android:filterTouchesWhenObscured="false"
    android:theme="?expressivePreferenceCategoryTheme"
    style="?expressivePreferenceCategoryRootLayoutStyle">

    <include layout="@layout/settingslib_expressive_preference_icon_frame"/>

    <RelativeLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingStart="@dimen/settingslib_expressive_space_extrasmall4"
        android:paddingTop="@dimen/settingslib_expressive_space_extrasmall4"
        android:paddingBottom="@dimen/settingslib_expressive_space_extrasmall4">
    <RelativeLayout style="?expressivePreferenceCategoryRelativeLayoutStyle">

        <TextView
            android:id="@android:id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            style="@style/PreferenceCategoryTitleTextStyle"/>
            style="?expressivePreferenceCategoryTitleStyle"/>

        <TextView
            android:id="@android:id/summary"
            android:ellipsize="end"
            android:singleLine="true"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@android:id/title"
            android:layout_alignStart="@android:id/title"
            android:layout_gravity="start"
            android:textAlignment="viewStart"
            android:textColor="?android:attr/textColorSecondary"
            android:maxLines="10"
            style="@style/PreferenceSummaryTextStyle"/>
            style="?expressivePreferenceCategorySummaryStyle"/>

    </RelativeLayout>
</LinearLayout>
+51 −0
Original line number Diff line number Diff line
@@ -166,4 +166,55 @@
        <item name="android:layout_height">40dp</item>
        <item name="android:background">?android:attr/listDivider</item>
    </style>

    <style name="ExpressivePreferenceCategoryTheme">
        <item name="expressivePreferenceCategoryRootLayoutStyle">@style/ExpressivePreferenceCategoryRootLayoutStyle</item>
        <item name="expressivePreferenceCategoryRelativeLayoutStyle">@style/ExpressivePreferenceCategoryRelativeLayoutStyle</item>
        <item name="expressivePreferenceCategoryTitleStyle">@style/ExpressivePreferenceCategoryTitleStyle</item>
        <item name="expressivePreferenceCategorySummaryStyle">@style/ExpressivePreferenceCategorySummaryStyle</item>
    </style>

    <style name="ExpressivePreferenceCategoryRootLayoutStyle">
        <item name="android:paddingLeft">?android:attr/listPreferredItemPaddingLeft</item>
        <item name="android:paddingStart">?android:attr/listPreferredItemPaddingStart</item>
        <item name="android:paddingRight">?android:attr/listPreferredItemPaddingRight</item>
        <item name="android:paddingEnd">?android:attr/listPreferredItemPaddingEnd</item>
        <item name="android:paddingTop">@dimen/settingslib_expressive_space_small1</item>
        <item name="android:background">?android:attr/selectableItemBackground</item>
        <item name="android:baselineAligned">false</item>
        <item name="android:gravity">center_vertical</item>
    </style>

    <style name="ExpressivePreferenceCategoryRelativeLayoutStyle">
        <item name="android:layout_width">0dp</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_weight">1</item>
        <item name="android:paddingStart">@dimen/settingslib_expressive_space_extrasmall4</item>
        <item name="android:paddingTop">@dimen/settingslib_expressive_space_extrasmall4</item>
        <item name="android:paddingBottom">@dimen/settingslib_expressive_space_extrasmall4</item>
    </style>

    <style
        name="ExpressivePreferenceCategoryTitleStyle"
        parent="@style/PreferenceCategoryTitleTextStyle">
        <item name="android:layout_width">match_parent</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_gravity">start</item>
        <item name="android:textAlignment">viewStart</item>
    </style>

    <style
        name="ExpressivePreferenceCategorySummaryStyle"
        parent="@style/PreferenceSummaryTextStyle">
        <item name="android:ellipsize">end</item>
        <item name="android:singleLine">true</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
        <item name="android:layout_below">@android:id/title</item>
        <item name="android:layout_alignStart">@android:id/title</item>
        <item name="android:layout_gravity">start</item>
        <item name="android:textAlignment">viewStart</item>
        <item name="android:textColor">?android:attr/textColorSecondary</item>
        <item name="android:maxLines">10</item>
    </style>
</resources>
Loading