[Expressive design] update ActionButtonPreference

- update to material button
- update layout

Bug: 367534605
Test: manual
Flag: EXEMPT resource only update
Change-Id: I93e16cb7872e9e18d51e3db5999cbfadb6aff5a2
diff --git a/packages/SettingsLib/ActionButtonsPreference/Android.bp b/packages/SettingsLib/ActionButtonsPreference/Android.bp
index 71ecb4c..37a0e79 100644
--- a/packages/SettingsLib/ActionButtonsPreference/Android.bp
+++ b/packages/SettingsLib/ActionButtonsPreference/Android.bp
@@ -19,6 +19,7 @@
 
     static_libs: [
         "androidx.preference_preference",
+        "SettingsLibSettingsTheme",
     ],
 
     sdk_version: "system_current",
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
new file mode 100644
index 0000000..fc63c0f
--- /dev/null
+++ b/packages/SettingsLib/ActionButtonsPreference/res/layout-v35/settingslib_expressive_action_buttons.xml
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_margin="@dimen/settingslib_expressive_space_extrasmall4"
+    android:paddingHorizontal="@dimen/settingslib_expressive_space_extrasmall4"
+    android:orientation="horizontal">
+
+    <LinearLayout
+        android:id="@+id/action1"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button1"
+            style="@style/SettingsLibActionButton.Expressive"
+            android:layout_width="@dimen/settingslib_expressive_space_large3"
+            android:layout_height="@dimen/settingslib_expressive_space_medium5"
+            android:layout_gravity="center_horizontal" />
+        <TextView
+            android:id="@+id/text1"
+            style="@style/SettingsLibActionButton.Expressive.Label"
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/action2"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button2"
+            style="@style/SettingsLibActionButton.Expressive"
+            android:layout_width="@dimen/settingslib_expressive_space_large3"
+            android:layout_height="@dimen/settingslib_expressive_space_medium5"
+            android:layout_gravity="center_horizontal" />
+        <TextView
+            android:id="@+id/text2"
+            style="@style/SettingsLibActionButton.Expressive.Label"
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/action3"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button3"
+            style="@style/SettingsLibActionButton.Expressive"
+            android:layout_width="@dimen/settingslib_expressive_space_large3"
+            android:layout_height="@dimen/settingslib_expressive_space_medium5"
+            android:layout_gravity="center_horizontal" />
+        <TextView
+            android:id="@+id/text3"
+            style="@style/SettingsLibActionButton.Expressive.Label"
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/action4"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:orientation="vertical">
+
+        <com.google.android.material.button.MaterialButton
+            android:id="@+id/button4"
+            style="@style/SettingsLibActionButton.Expressive"
+            android:layout_width="@dimen/settingslib_expressive_space_large3"
+            android:layout_height="@dimen/settingslib_expressive_space_medium5"
+            android:layout_gravity="center_horizontal" />
+        <TextView
+            android:id="@+id/text4"
+            style="@style/SettingsLibActionButton.Expressive.Label"
+            android:layout_marginTop="@dimen/settingslib_expressive_space_extrasmall3"/>
+    </LinearLayout>
+</LinearLayout>
diff --git a/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
new file mode 100644
index 0000000..cc948a6
--- /dev/null
+++ b/packages/SettingsLib/ActionButtonsPreference/res/values-v35/styles_expressive.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  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.
+  -->
+
+<resources>
+    <style name="SettingsLibActionButton.Expressive" parent="SettingsLibButtonStyle.Expressive.Tonal">
+        <item name="android:backgroundTint">@color/settingslib_materialColorPrimaryContainer</item>
+        <item name="iconTint">@color/settingslib_materialColorOnPrimaryContainer</item>
+        <item name="iconGravity">textTop</item>
+    </style>
+
+    <style name="SettingsLibActionButton.Expressive.Label" parent="SettingsLibTextAppearance.Emphasized.Title.Small">
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:minWidth">@dimen/settingslib_expressive_space_small3</item>
+        <item name="android:minHeight">@dimen/settingslib_expressive_space_small3</item>
+        <item name="android:textColor">@color/settingslib_materialColorOnSurface</item>
+        <item name="android:layout_gravity">center</item>
+    </style>
+
+</resources>
diff --git a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
index 5dc11cf..f011039 100644
--- a/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
+++ b/packages/SettingsLib/ActionButtonsPreference/src/com/android/settingslib/widget/ActionButtonsPreference.java
@@ -26,6 +26,8 @@
 import android.util.Log;
 import android.view.View;
 import android.widget.Button;
+import android.widget.LinearLayout;
+import android.widget.TextView;
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.StringRes;
@@ -34,6 +36,8 @@
 
 import com.android.settingslib.widget.preference.actionbuttons.R;
 
+import com.google.android.material.button.MaterialButton;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -98,7 +102,10 @@
     }
 
     private void init() {
-        setLayoutResource(R.layout.settingslib_action_buttons);
+        int resId = SettingsThemeHelper.isExpressiveTheme(getContext())
+                ? R.layout.settingslib_expressive_action_buttons
+                : R.layout.settingslib_action_buttons;
+        setLayoutResource(resId);
         setSelectable(false);
 
         final Resources res = getContext().getResources();
@@ -127,6 +134,21 @@
         mButton3Info.mButton = (Button) holder.findViewById(R.id.button3);
         mButton4Info.mButton = (Button) holder.findViewById(R.id.button4);
 
+        if (SettingsThemeHelper.isExpressiveTheme(getContext())) {
+            mButton1Info.mIsExpressive = true;
+            mButton1Info.mTextView = (TextView) holder.findViewById(R.id.text1);
+            mButton1Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action1);
+            mButton2Info.mIsExpressive = true;
+            mButton2Info.mTextView = (TextView) holder.findViewById(R.id.text2);
+            mButton2Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action2);
+            mButton3Info.mIsExpressive = true;
+            mButton3Info.mTextView = (TextView) holder.findViewById(R.id.text3);
+            mButton3Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action3);
+            mButton4Info.mIsExpressive = true;
+            mButton4Info.mTextView = (TextView) holder.findViewById(R.id.text4);
+            mButton4Info.mActionLayout = (LinearLayout) holder.findViewById(R.id.action4);
+        }
+
         mDivider1 = holder.findViewById(R.id.divider1);
         mDivider2 = holder.findViewById(R.id.divider2);
         mDivider3 = holder.findViewById(R.id.divider3);
@@ -169,45 +191,47 @@
             mVisibleButtonInfos.add(mButton4Info);
         }
 
-        final boolean isRtl = getContext().getResources().getConfiguration()
-                .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
-        switch (mVisibleButtonInfos.size()) {
-            case SINGLE_BUTTON_STYLE :
-                if (isRtl) {
-                    setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
-                } else {
-                    setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
-                }
-                break;
-            case TWO_BUTTONS_STYLE :
-                if (isRtl) {
-                    setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
-                } else {
-                    setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
-                }
-                break;
-            case THREE_BUTTONS_STYLE :
-                if (isRtl) {
-                    setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
-                } else {
-                    setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
-                }
-                break;
-            case FOUR_BUTTONS_STYLE :
-                if (isRtl) {
-                    setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
-                } else {
-                    setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
-                }
-                break;
-            default:
-                Log.e(TAG, "No visible buttons info, skip background settings.");
-                break;
-        }
+        if (!SettingsThemeHelper.isExpressiveTheme(getContext())) {
+            final boolean isRtl = getContext().getResources().getConfiguration()
+                    .getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+            switch (mVisibleButtonInfos.size()) {
+                case SINGLE_BUTTON_STYLE :
+                    if (isRtl) {
+                        setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
+                    } else {
+                        setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle1);
+                    }
+                    break;
+                case TWO_BUTTONS_STYLE :
+                    if (isRtl) {
+                        setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
+                    } else {
+                        setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle2);
+                    }
+                    break;
+                case THREE_BUTTONS_STYLE :
+                    if (isRtl) {
+                        setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
+                    } else {
+                        setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle3);
+                    }
+                    break;
+                case FOUR_BUTTONS_STYLE :
+                    if (isRtl) {
+                        setupRtlBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
+                    } else {
+                        setupBackgrounds(mVisibleButtonInfos, mBtnBackgroundStyle4);
+                    }
+                    break;
+                default:
+                    Log.e(TAG, "No visible buttons info, skip background settings.");
+                    break;
+            }
 
-        setupDivider1();
-        setupDivider2();
-        setupDivider3();
+            setupDivider1();
+            setupDivider2();
+            setupDivider3();
+        }
     }
 
     private void setupBackgrounds(
@@ -509,23 +533,43 @@
 
     static class ButtonInfo {
         private Button mButton;
+        private TextView mTextView;
+        private LinearLayout mActionLayout;
         private CharSequence mText;
         private Drawable mIcon;
         private View.OnClickListener mListener;
         private boolean mIsEnabled = true;
         private boolean mIsVisible = true;
+        private boolean mIsExpressive = false;
 
         void setUpButton() {
-            mButton.setText(mText);
+            if (mIsExpressive) {
+                mTextView.setText(mText);
+                if (mButton instanceof MaterialButton) {
+                    ((MaterialButton) mButton).setIcon(mIcon);
+                }
+            } else {
+                mButton.setText(mText);
+                mButton.setCompoundDrawablesWithIntrinsicBounds(
+                        null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
+            }
+
             mButton.setOnClickListener(mListener);
             mButton.setEnabled(mIsEnabled);
-            mButton.setCompoundDrawablesWithIntrinsicBounds(
-                    null /* left */, mIcon /* top */, null /* right */, null /* bottom */);
+
 
             if (shouldBeVisible()) {
                 mButton.setVisibility(View.VISIBLE);
+                if (mIsExpressive) {
+                    mTextView.setVisibility(View.VISIBLE);
+                    mActionLayout.setVisibility(View.VISIBLE);
+                }
             } else {
                 mButton.setVisibility(View.GONE);
+                if (mIsExpressive) {
+                    mTextView.setVisibility(View.GONE);
+                    mActionLayout.setVisibility(View.GONE);
+                }
             }
         }
 
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
index 2320aab..0542c51 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/dimens_expressive.xml
@@ -48,6 +48,7 @@
     <dimen name="settingslib_expressive_space_medium2">36dp</dimen>
     <dimen name="settingslib_expressive_space_medium3">40dp</dimen>
     <dimen name="settingslib_expressive_space_medium4">48dp</dimen>
+    <dimen name="settingslib_expressive_space_medium5">56dp</dimen>
     <dimen name="settingslib_expressive_space_large1">60dp</dimen>
     <dimen name="settingslib_expressive_space_large2">64dp</dimen>
     <dimen name="settingslib_expressive_space_large3">72dp</dimen>
diff --git a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
index 04ae80e..442def9 100644
--- a/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
+++ b/packages/SettingsLib/SettingsTheme/res/values-v35/styles_expressive.xml
@@ -169,4 +169,23 @@
         <item name="android:focusable">false</item>
         <item name="thumbIcon">@drawable/settingslib_expressive_switch_thumb_icon</item>
     </style>
+
+    <style name="SettingsLibButtonStyle.Expressive.Tonal"
+        parent="@style/Widget.Material3.Button.TonalButton">
+        <item name="android:theme">@style/Theme.Material3.DynamicColors.DayNight</item>
+        <item name="android:layout_width">wrap_content</item>
+        <item name="android:layout_height">wrap_content</item>
+        <item name="android:gravity">center</item>
+        <item name="android:minWidth">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:minHeight">@dimen/settingslib_expressive_space_medium4</item>
+        <item name="android:paddingVertical">@dimen/settingslib_expressive_space_extrasmall5</item>
+        <item name="android:paddingHorizontal">@dimen/settingslib_expressive_space_small1</item>
+        <item name="android:backgroundTint">@color/settingslib_materialColorSecondaryContainer</item>
+        <item name="android:textAppearance">@android:style/TextAppearance.DeviceDefault.Medium</item>
+        <item name="android:textColor">@color/settingslib_materialColorOnSecondaryContainer</item>
+        <item name="android:textSize">14sp</item>
+        <item name="iconGravity">textStart</item>
+        <item name="iconTint">@color/settingslib_materialColorOnSecondaryContainer</item>
+        <item name="iconSize">@dimen/settingslib_expressive_space_small4</item>
+    </style>
 </resources>
\ No newline at end of file