Merge "Fix talkback announce incorrect sound of the EID" into main
diff --git a/res/xml/power_usage_summary.xml b/res/xml/power_usage_summary.xml
index 1af8a8c..77c6b73 100644
--- a/res/xml/power_usage_summary.xml
+++ b/res/xml/power_usage_summary.xml
@@ -33,7 +33,7 @@
         android:selectable="false"
         settings:searchable="false" />
 
-    <com.android.settings.widget.CardPreference
+    <com.android.settings.widget.TipCardPreference
         android:key="battery_tip"
         android:title="@string/summary_placeholder"
         settings:controller="com.android.settings.fuelgauge.batterytip.BatteryTipPreferenceController" />
diff --git a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
index 31cec6a..e6f622c 100644
--- a/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
+++ b/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceController.java
@@ -33,7 +33,7 @@
 import com.android.settings.fuelgauge.batterytip.actions.BatteryTipAction;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import java.util.List;
@@ -55,7 +55,7 @@
     private SettingsActivity mSettingsActivity;
     private MetricsFeatureProvider mMetricsFeatureProvider;
     private boolean mNeedUpdate;
-    @VisibleForTesting CardPreference mCardPreference;
+    @VisibleForTesting TipCardPreference mCardPreference;
     @VisibleForTesting Context mPrefContext;
     InstrumentedPreferenceFragment mFragment;
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
index 3716244..dbe2722 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTip.java
@@ -28,7 +28,6 @@
 
 import com.android.settings.R;
 import com.android.settings.overlay.FeatureFactory;
-import com.android.settings.widget.CardPreference;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -80,9 +79,9 @@
         super.updatePreference(preference);
         final Context context = preference.getContext();
 
-        CardPreference cardPreference = castToCardPreferenceSafely(preference);
+        var cardPreference = castToTipCardPreferenceSafely(preference);
         if (cardPreference == null) {
-            Log.e(TAG, "cast Preference to CardPreference failed");
+            Log.e(TAG, "cast Preference to TipCardPreference failed");
             return;
         }
 
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
index 1345032..1f5374d 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTip.java
@@ -23,10 +23,11 @@
 
 import androidx.annotation.DrawableRes;
 import androidx.annotation.IntDef;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.preference.Preference;
 
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import java.lang.annotation.Retention;
@@ -165,7 +166,7 @@
         preference.setTitle(getTitle(context));
         preference.setSummary(getSummary(context));
         preference.setIcon(getIconId());
-        final CardPreference cardPreference = castToCardPreferenceSafely(preference);
+        final TipCardPreference cardPreference = castToTipCardPreferenceSafely(preference);
         if (cardPreference != null) {
             cardPreference.resetLayoutState();
         }
@@ -206,7 +207,9 @@
         return "type=" + mType + " state=" + mState;
     }
 
-    public CardPreference castToCardPreferenceSafely(Preference preference) {
-        return preference instanceof CardPreference ? (CardPreference) preference : null;
+    /** Returns the converted {@link TipCardPreference} if it is valid. */
+    @Nullable
+    public TipCardPreference castToTipCardPreferenceSafely(Preference preference) {
+        return preference instanceof TipCardPreference ? (TipCardPreference) preference : null;
     }
 }
diff --git a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
index 72c710c..7453ded 100644
--- a/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
+++ b/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTip.java
@@ -26,7 +26,6 @@
 import androidx.preference.Preference;
 
 import com.android.settings.R;
-import com.android.settings.widget.CardPreference;
 import com.android.settingslib.HelpUtils;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
@@ -74,7 +73,7 @@
     public void updatePreference(Preference preference) {
         super.updatePreference(preference);
         final Context context = preference.getContext();
-        final CardPreference cardPreference = castToCardPreferenceSafely(preference);
+        final var cardPreference = castToTipCardPreferenceSafely(preference);
         if (cardPreference == null) {
             Log.e(TAG, "cast Preference to CardPreference failed");
             return;
diff --git a/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java b/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
index 8924a0b..be5de06 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/AnomalyEventWrapper.java
@@ -18,9 +18,13 @@
 
 import android.content.Context;
 import android.os.Bundle;
+import android.provider.Settings;
 import android.text.TextUtils;
+import android.util.Log;
 import android.util.Pair;
 
+import androidx.annotation.Nullable;
+
 import com.android.settings.R;
 import com.android.settings.SettingsActivity;
 import com.android.settings.core.SubSettingLauncher;
@@ -49,8 +53,8 @@
     }
 
     private <T> T getInfo(
-            Function<WarningBannerInfo, T> warningBannerInfoSupplier,
-            Function<WarningItemInfo, T> warningItemInfoSupplier) {
+            @Nullable Function<WarningBannerInfo, T> warningBannerInfoSupplier,
+            @Nullable Function<WarningItemInfo, T> warningItemInfoSupplier) {
         if (warningBannerInfoSupplier != null && mPowerAnomalyEvent.hasWarningBannerInfo()) {
             return warningBannerInfoSupplier.apply(mPowerAnomalyEvent.getWarningBannerInfo());
         } else if (warningItemInfoSupplier != null && mPowerAnomalyEvent.hasWarningItemInfo()) {
@@ -252,4 +256,32 @@
         mSubSettingLauncher.launch();
         return true;
     }
+
+    boolean updateSystemSettingsIfAvailable() {
+        final String settingsName =
+                getInfo(WarningBannerInfo::getMainButtonConfigSettingsName, null);
+        final Integer settingsValue =
+                getInfo(WarningBannerInfo::getMainButtonConfigSettingsValue, null);
+        if (TextUtils.isEmpty(settingsName) || settingsValue == null) {
+            Log.d(TAG, "Failed to update settings due to invalid key or value");
+            return false;
+        }
+
+        try {
+            Settings.System.putInt(mContext.getContentResolver(), settingsName, settingsValue);
+            Log.d(
+                    TAG,
+                    String.format(
+                            "Update settings name=%s to value=%d", settingsName, settingsValue));
+            return true;
+        } catch (SecurityException e) {
+            Log.w(
+                    TAG,
+                    String.format(
+                            "Failed to update settings name=%s to value=%d",
+                            settingsName, settingsValue),
+                    e);
+            return false;
+        }
+    }
 }
diff --git a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
index e22f987..821c868 100644
--- a/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
+++ b/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsController.java
@@ -123,7 +123,8 @@
                     mCardPreference.setVisible(false);
                     if (mOnAnomalyConfirmListener != null) {
                         mOnAnomalyConfirmListener.onAnomalyConfirm();
-                    } else if (mAnomalyEventWrapper.launchSubSetting()) {
+                    } else if (mAnomalyEventWrapper.updateSystemSettingsIfAvailable()
+                            || mAnomalyEventWrapper.launchSubSetting()) {
                         mMetricsFeatureProvider.action(
                                 /* attribution= */ SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
                                 /* action= */ SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
diff --git a/src/com/android/settings/widget/CardPreference.java b/src/com/android/settings/widget/CardPreference.java
new file mode 100644
index 0000000..db6827e
--- /dev/null
+++ b/src/com/android/settings/widget/CardPreference.java
@@ -0,0 +1,164 @@
+/*
+ * Copyright (C) 2019 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.settings.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.annotation.Nullable;
+import androidx.preference.Preference;
+import androidx.preference.PreferenceViewHolder;
+
+import com.android.settings.R;
+
+import com.google.android.material.card.MaterialCardView;
+
+import java.util.Optional;
+
+/** Preference that wrapped by {@link MaterialCardView} */
+public class CardPreference extends Preference {
+    @Nullable private View.OnClickListener mPrimaryBtnClickListener = null;
+    @Nullable private View.OnClickListener mSecondaryBtnClickListener = null;
+    @Nullable private String mPrimaryButtonText = null;
+    @Nullable private String mSecondaryButtonText = null;
+    private Optional<Button> mPrimaryButton = Optional.empty();
+    private Optional<Button> mSecondaryButton = Optional.empty();
+    private Optional<View> mButtonsGroup = Optional.empty();
+    private boolean mPrimaryButtonVisible = false;
+    private boolean mSecondaryButtonVisible = false;
+
+    public CardPreference(Context context) {
+        this(context, null /* attrs */);
+    }
+
+    public CardPreference(Context context, @Nullable AttributeSet attrs) {
+        super(context, attrs, R.attr.cardPreferenceStyle);
+    }
+
+    @Override
+    public void onBindViewHolder(PreferenceViewHolder holder) {
+        super.onBindViewHolder(holder);
+        initButtonsAndLayout(holder);
+    }
+
+    private void initButtonsAndLayout(PreferenceViewHolder holder) {
+        mPrimaryButton = Optional.ofNullable((Button) holder.findViewById(android.R.id.button1));
+        mSecondaryButton = Optional.ofNullable((Button) holder.findViewById(android.R.id.button2));
+        mButtonsGroup = Optional.ofNullable(holder.findViewById(R.id.card_preference_buttons));
+        setPrimaryButtonText(mPrimaryButtonText);
+        setPrimaryButtonClickListener(mPrimaryBtnClickListener);
+        setPrimaryButtonVisible(mPrimaryButtonVisible);
+        setSecondaryButtonText(mSecondaryButtonText);
+        setSecondaryButtonClickListener(mSecondaryBtnClickListener);
+        setSecondaryButtonVisible(mSecondaryButtonVisible);
+    }
+
+    /** Clear layout state if needed */
+    public void resetLayoutState() {
+        setPrimaryButtonVisible(false);
+        setSecondaryButtonVisible(false);
+    }
+
+    /**
+     * Register a callback to be invoked when the primary button is clicked.
+     *
+     * @param l the callback that will run
+     */
+    public void setPrimaryButtonClickListener(View.OnClickListener l) {
+        mPrimaryButton.ifPresent(button -> button.setOnClickListener(l));
+        mPrimaryBtnClickListener = l;
+    }
+
+    /**
+     * Register a callback to be invoked when the secondary button is clicked.
+     *
+     * @param l the callback that will run
+     */
+    public void setSecondaryButtonClickListener(View.OnClickListener l) {
+        mSecondaryButton.ifPresent(button -> button.setOnClickListener(l));
+        mSecondaryBtnClickListener = l;
+    }
+
+    /**
+     * Sets the text to be displayed on primary button.
+     *
+     * @param text text to be displayed
+     */
+    public void setPrimaryButtonText(String text) {
+        mPrimaryButton.ifPresent(button -> button.setText(text));
+        mPrimaryButtonText = text;
+    }
+
+    /**
+     * Sets the text to be displayed on secondary button.
+     *
+     * @param text text to be displayed
+     */
+    public void setSecondaryButtonText(String text) {
+        mSecondaryButton.ifPresent(button -> button.setText(text));
+        mSecondaryButtonText = text;
+    }
+
+    /**
+     * Set the visible on the primary button.
+     *
+     * @param visible {@code true} for visible
+     */
+    public void setPrimaryButtonVisible(boolean visible) {
+        mPrimaryButton.ifPresent(
+                button -> button.setVisibility(visible ? View.VISIBLE : View.GONE));
+        mPrimaryButtonVisible = visible;
+        updateButtonGroupsVisibility();
+    }
+
+    /**
+     * Set the visible on the secondary button.
+     *
+     * @param visible {@code true} for visible
+     */
+    public void setSecondaryButtonVisible(boolean visible) {
+        mSecondaryButton.ifPresent(
+                button -> button.setVisibility(visible ? View.VISIBLE : View.GONE));
+        mSecondaryButtonVisible = visible;
+        updateButtonGroupsVisibility();
+    }
+
+    /**
+     * Sets the text of content description on primary button.
+     *
+     * @param text text for the content description
+     */
+    public void setPrimaryButtonContentDescription(String text) {
+        mPrimaryButton.ifPresent(button -> button.setContentDescription(text));
+    }
+
+    /**
+     * Sets the text of content description on secondary button.
+     *
+     * @param text text for the content description
+     */
+    public void setSecondaryButtonContentDescription(String text) {
+        mSecondaryButton.ifPresent(button -> button.setContentDescription(text));
+    }
+
+    private void updateButtonGroupsVisibility() {
+        int visibility =
+                (mPrimaryButtonVisible || mSecondaryButtonVisible) ? View.VISIBLE : View.GONE;
+        mButtonsGroup.ifPresent(group -> group.setVisibility(visibility));
+    }
+}
diff --git a/src/com/android/settings/widget/CardPreference.kt b/src/com/android/settings/widget/TipCardPreference.kt
similarity index 99%
rename from src/com/android/settings/widget/CardPreference.kt
rename to src/com/android/settings/widget/TipCardPreference.kt
index 010d7de..0ae7d2a 100644
--- a/src/com/android/settings/widget/CardPreference.kt
+++ b/src/com/android/settings/widget/TipCardPreference.kt
@@ -27,7 +27,7 @@
 import com.android.settingslib.spa.widget.card.SettingsCard
 
 /** A preference for settings banner tips card. */
-class CardPreference
+class TipCardPreference
 @JvmOverloads
 constructor(
     context: Context,
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
index c05d9ed..4bb6695 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/BatteryTipPreferenceControllerTest.java
@@ -33,7 +33,7 @@
 import com.android.settings.core.BasePreferenceController;
 import com.android.settings.core.InstrumentedPreferenceFragment;
 import com.android.settings.fuelgauge.batterytip.tips.BatteryTip;
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 
 import org.junit.Before;
 import org.junit.Rule;
@@ -61,7 +61,7 @@
     @Mock private InstrumentedPreferenceFragment mFragment;
 
     private Context mContext;
-    private CardPreference mCardPreference;
+    private TipCardPreference mCardPreference;
     private BatteryTipPreferenceController mBatteryTipPreferenceController;
     private List<BatteryTip> mNewBatteryTips;
 
@@ -69,7 +69,7 @@
     public void setUp() {
         mContext = ApplicationProvider.getApplicationContext();
 
-        mCardPreference = new CardPreference(mContext);
+        mCardPreference = new TipCardPreference(mContext);
         when(mPreferenceScreen.getContext()).thenReturn(mContext);
         doReturn(mCardPreference).when(mPreferenceScreen).findPreference(KEY_PREF);
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
index a605ee3..c0edb87 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryDefenderTipTest.java
@@ -29,7 +29,7 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
@@ -49,7 +49,7 @@
     private FakeFeatureFactory mFeatureFactory;
     private BatteryDefenderTip mBatteryDefenderTip;
     private MetricsFeatureProvider mMetricsFeatureProvider;
-    private CardPreference mCardPreference;
+    private TipCardPreference mCardPreference;
 
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Mock private BatteryTip mBatteryTip;
@@ -62,7 +62,7 @@
         mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mBatteryDefenderTip =
                 new BatteryDefenderTip(BatteryTip.StateType.NEW, /* isPluggedIn= */ false);
-        mCardPreference = new CardPreference(mContext);
+        mCardPreference = new TipCardPreference(mContext);
 
         when(mPreference.getContext()).thenReturn(mContext);
     }
@@ -98,7 +98,7 @@
     public void updatePreference_castFail_logErrorMessage() {
         mBatteryDefenderTip.updatePreference(mPreference);
 
-        assertThat(getLastErrorLog()).isEqualTo("cast Preference to CardPreference failed");
+        assertThat(getLastErrorLog()).isEqualTo("cast Preference to TipCardPreference failed");
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
index 097f484..77249fe 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/BatteryTipTest.java
@@ -26,7 +26,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 import com.android.settingslib.testutils.DrawableTestHelper;
 
@@ -87,7 +87,7 @@
 
     @Test
     public void updatePreference_resetLayoutState() {
-        CardPreference cardPreference = new CardPreference(mContext);
+        var cardPreference = new TipCardPreference(mContext);
         cardPreference.setPrimaryButtonVisibility(true);
         cardPreference.setSecondaryButtonVisibility(true);
 
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
index 7a23332..9b4d179 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batterytip/tips/IncompatibleChargerTipTest.java
@@ -29,7 +29,7 @@
 
 import com.android.settings.R;
 import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.widget.CardPreference;
+import com.android.settings.widget.TipCardPreference;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
 
 import org.junit.Before;
@@ -49,7 +49,7 @@
     private FakeFeatureFactory mFeatureFactory;
     private IncompatibleChargerTip mIncompatibleChargerTip;
     private MetricsFeatureProvider mMetricsFeatureProvider;
-    private CardPreference mCardPreference;
+    private TipCardPreference mCardPreference;
 
     @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
     @Mock private BatteryTip mBatteryTip;
@@ -61,7 +61,7 @@
         mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider;
         mContext = ApplicationProvider.getApplicationContext();
         mIncompatibleChargerTip = new IncompatibleChargerTip(BatteryTip.StateType.NEW);
-        mCardPreference = new CardPreference(mContext);
+        mCardPreference = new TipCardPreference(mContext);
 
         when(mPreference.getContext()).thenReturn(mContext);
     }
diff --git a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
index 21840d2..5f86301 100644
--- a/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/fuelgauge/batteryusage/BatteryTipsCardPreferenceTest.java
@@ -30,6 +30,7 @@
 import android.app.settings.SettingsEnums;
 import android.content.Context;
 import android.content.Intent;
+import android.provider.Settings;
 import android.util.Pair;
 import android.view.View;
 
@@ -102,10 +103,10 @@
     }
 
     @Test
-    public void onClick_mainBtnOfSettingsAnomaly_getAdaptiveBrightnessLauncher() {
+    public void onClick_mainBtnOfSettingsAnomalyLaunchPage_getAdaptiveBrightnessLauncher() {
         final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
         PowerAnomalyEvent adaptiveBrightnessAnomaly =
-                BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
+                BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(/* changeSettings= */ false);
         when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
         when(mFakeView.getId()).thenReturn(R.id.main_button);
         doNothing().when(mContext).startActivity(captor.capture());
@@ -138,6 +139,47 @@
     }
 
     @Test
+    public void onClick_mainBtnOfSettingsAnomalyChangeSettings_settingsChanged()
+            throws Settings.SettingNotFoundException {
+        Settings.System.putInt(
+                mContext.getContentResolver(),
+                Settings.System.SCREEN_BRIGHTNESS_MODE,
+                Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
+        final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
+        PowerAnomalyEvent adaptiveBrightnessAnomaly =
+                BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(/* changeSettings= */ true);
+        when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
+        when(mFakeView.getId()).thenReturn(R.id.main_button);
+        doNothing().when(mContext).startActivity(captor.capture());
+
+        mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(
+                adaptiveBrightnessAnomaly, adaptiveBrightnessAnomaly);
+        mBatteryTipsCardPreference.onClick(mFakeView);
+
+        assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
+        assertThat(
+                        Settings.System.getInt(
+                                mContext.getContentResolver(),
+                                Settings.System.SCREEN_BRIGHTNESS_MODE))
+                .isEqualTo(Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+        verify(mContext, never()).startActivity(any(Intent.class));
+        verify(mFeatureFactory.metricsFeatureProvider)
+                .action(
+                        SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
+                        SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW,
+                        SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
+                        BatteryTipsController.ANOMALY_KEY,
+                        PowerAnomalyKey.KEY_BRIGHTNESS.getNumber());
+        verify(mFeatureFactory.metricsFeatureProvider)
+                .action(
+                        SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
+                        SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT,
+                        SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
+                        BatteryTipsController.ANOMALY_KEY,
+                        PowerAnomalyKey.KEY_BRIGHTNESS.getNumber());
+    }
+
+    @Test
     public void onClick_dismissBtnOfSettingsAnomaly_cardDismissAndLogged() {
         final PowerAnomalyEvent screenTimeoutAnomaly =
                 BatteryTestUtils.createScreenTimeoutAnomalyEvent();
diff --git a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
index 745fca7..4bddcd1 100644
--- a/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
+++ b/tests/robotests/src/com/android/settings/testutils/BatteryTestUtils.java
@@ -26,6 +26,7 @@
 import android.hardware.usb.UsbPortStatus;
 import android.os.BatteryManager;
 import android.os.UserManager;
+import android.provider.Settings;
 
 import androidx.room.Room;
 
@@ -71,18 +72,14 @@
                 BatteryManager.BATTERY_STATUS_DISCHARGING);
     }
 
-    /**
-     * Sets the work profile mode.
-     */
+    /** Sets the work profile mode. */
     public static void setWorkProfile(Context context) {
         final UserManager userManager = context.getSystemService(UserManager.class);
         Shadows.shadowOf(userManager).setManagedProfile(true);
         Shadows.shadowOf(userManager).setIsSystemUser(false);
     }
 
-    /**
-     * Creates and sets up the in-memory {@link BatteryStateDatabase}.
-     */
+    /** Creates and sets up the in-memory {@link BatteryStateDatabase}. */
     public static BatteryStateDatabase setUpBatteryStateDatabase(Context context) {
         final BatteryStateDatabase inMemoryDatabase =
                 Room.inMemoryDatabaseBuilder(context, BatteryStateDatabase.class)
@@ -92,40 +89,39 @@
         return inMemoryDatabase;
     }
 
-    /**
-     * Inserts a fake data into the database for testing.
-     */
+    /** Inserts a fake data into the database for testing. */
     public static void insertDataToBatteryStateTable(
             Context context, long timestamp, String packageName) {
         insertDataToBatteryStateTable(
-                context, timestamp, packageName, /*multiple=*/ false, /*isFullChargeStart=*/ false);
+                context,
+                timestamp,
+                packageName,
+                /* multiple= */ false,
+                /* isFullChargeStart= */ false);
     }
 
-    /**
-     * Inserts a fake data into the database for testing.
-     */
+    /** Inserts a fake data into the database for testing. */
     public static void insertDataToBatteryStateTable(
             Context context, long timestamp, String packageName, boolean isFullChargeStart) {
         insertDataToBatteryStateTable(
-                context, timestamp, packageName, /*multiple=*/ false, isFullChargeStart);
+                context, timestamp, packageName, /* multiple= */ false, isFullChargeStart);
     }
 
-    /**
-     * Inserts a fake data into the database for testing.
-     */
+    /** Inserts a fake data into the database for testing. */
     public static void insertDataToBatteryStateTable(
-            Context context, long timestamp, String packageName, boolean multiple,
+            Context context,
+            long timestamp,
+            String packageName,
+            boolean multiple,
             boolean isFullChargeStart) {
         DeviceBatteryState deviceBatteryState =
-                DeviceBatteryState
-                        .newBuilder()
+                DeviceBatteryState.newBuilder()
                         .setBatteryLevel(31)
                         .setBatteryStatus(0)
                         .setBatteryHealth(0)
                         .build();
         BatteryInformation batteryInformation =
-                BatteryInformation
-                        .newBuilder()
+                BatteryInformation.newBuilder()
                         .setDeviceBatteryState(deviceBatteryState)
                         .setIsHidden(true)
                         .setBootTimestamp(timestamp - 1)
@@ -145,16 +141,15 @@
 
         final BatteryState state =
                 new BatteryState(
-                        /*uid=*/ 1001L,
-                        /*userId=*/ 100L,
+                        /* uid= */ 1001L,
+                        /* userId= */ 100L,
                         packageName,
                         timestamp,
-                        /*consumerType=*/ 2,
+                        /* consumerType= */ 2,
                         isFullChargeStart,
                         ConvertUtils.convertBatteryInformationToString(batteryInformation),
                         "");
-        BatteryStateDao dao =
-                BatteryStateDatabase.getInstance(context).batteryStateDao();
+        BatteryStateDao dao = BatteryStateDatabase.getInstance(context).batteryStateDao();
         if (multiple) {
             dao.insertAll(ImmutableList.of(state));
         } else {
@@ -162,31 +157,26 @@
         }
     }
 
-    /**
-     * Inserts a fake data into the database for testing.
-     */
+    /** Inserts a fake data into the database for testing. */
     public static void insertDataToAppUsageEventTable(
             Context context, long userId, long timestamp, String packageName) {
         insertDataToAppUsageEventTable(
-                context, userId, timestamp, packageName, /*multiple=*/ false);
+                context, userId, timestamp, packageName, /* multiple= */ false);
     }
 
-    /**
-     * Inserts a fake data into the database for testing.
-     */
+    /** Inserts a fake data into the database for testing. */
     public static void insertDataToAppUsageEventTable(
             Context context, long userId, long timestamp, String packageName, boolean multiple) {
         final AppUsageEventEntity entity =
                 new AppUsageEventEntity(
-                        /*uid=*/ 101L,
+                        /* uid= */ 101L,
                         userId,
                         timestamp,
-                        /*appUsageEventType=*/ 2,
+                        /* appUsageEventType= */ 2,
                         packageName,
-                        /*instanceId=*/ 10001,
-                        /*taskRootPackageName=*/ "com.android.settings");
-        AppUsageEventDao dao =
-                BatteryStateDatabase.getInstance(context).appUsageEventDao();
+                        /* instanceId= */ 10001,
+                        /* taskRootPackageName= */ "com.android.settings");
+        AppUsageEventDao dao = BatteryStateDatabase.getInstance(context).appUsageEventDao();
         if (multiple) {
             dao.insertAll(ImmutableList.of(entity));
         } else {
@@ -194,9 +184,7 @@
         }
     }
 
-    /**
-     * Gets customized battery changed intent.
-     */
+    /** Gets customized battery changed intent. */
     public static Intent getCustomBatteryIntent(int plugged, int level, int scale, int status) {
         Intent intent = new Intent();
         intent.putExtra(BatteryManager.EXTRA_PLUGGED, plugged);
@@ -207,9 +195,7 @@
         return intent;
     }
 
-    /**
-     * Configures the incompatible charger environment.
-     */
+    /** Configures the incompatible charger environment. */
     public static void setupIncompatibleEvent(
             UsbPort mockUsbPort, UsbManager mockUsbManager, UsbPortStatus mockUsbPortStatus) {
         final List<UsbPort> usbPorts = new ArrayList<>();
@@ -219,19 +205,15 @@
         when(mockUsbPort.supportsComplianceWarnings()).thenReturn(true);
         when(mockUsbPortStatus.isConnected()).thenReturn(true);
         when(mockUsbPortStatus.getComplianceWarnings())
-                .thenReturn(new int[]{UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY});
+                .thenReturn(new int[] {UsbPortStatus.COMPLIANCE_WARNING_DEBUG_ACCESSORY});
     }
 
-    /**
-     * Create an empty power anomaly event list proto.
-     */
+    /** Create an empty power anomaly event list proto. */
     public static PowerAnomalyEventList createEmptyPowerAnomalyEventList() {
         return PowerAnomalyEventList.getDefaultInstance();
     }
 
-    /**
-     * Create an non-empty power anomaly event list proto.
-     */
+    /** Create an non-empty power anomaly event list proto. */
     public static PowerAnomalyEventList createNonEmptyPowerAnomalyEventList() {
         return PowerAnomalyEventList.newBuilder()
                 .addPowerAnomalyEvents(0, createAdaptiveBrightnessAnomalyEvent())
@@ -239,27 +221,35 @@
                 .build();
     }
 
-    /**
-     * Create a power anomaly event proto of adaptive brightness.
-     */
+    /** Create a power anomaly event proto of adaptive brightness. */
     public static PowerAnomalyEvent createAdaptiveBrightnessAnomalyEvent() {
+        return createAdaptiveBrightnessAnomalyEvent(false);
+    }
+
+    /** Create a power anomaly event proto of adaptive brightness. */
+    public static PowerAnomalyEvent createAdaptiveBrightnessAnomalyEvent(boolean changeSettings) {
+        WarningBannerInfo.Builder warningBannerInfoBuilder =
+                WarningBannerInfo.newBuilder()
+                        .setMainButtonDestination(DisplaySettings.class.getName())
+                        .setMainButtonSourceMetricsCategory(SettingsEnums.DISPLAY)
+                        .setMainButtonSourceHighlightKey("auto_brightness_entry");
+        if (changeSettings) {
+            warningBannerInfoBuilder
+                    .setMainButtonConfigSettingsName(Settings.System.SCREEN_BRIGHTNESS_MODE)
+                    .setMainButtonConfigSettingsValue(
+                            Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC);
+        }
         return PowerAnomalyEvent.newBuilder()
                 .setEventId("BrightnessAnomaly")
                 .setType(PowerAnomalyType.TYPE_SETTINGS_BANNER)
                 .setKey(PowerAnomalyKey.KEY_BRIGHTNESS)
                 .setDismissRecordKey(PowerAnomalyKey.KEY_BRIGHTNESS.name())
                 .setScore(1.2f)
-                .setWarningBannerInfo(WarningBannerInfo.newBuilder()
-                        .setMainButtonDestination(DisplaySettings.class.getName())
-                        .setMainButtonSourceMetricsCategory(SettingsEnums.DISPLAY)
-                        .setMainButtonSourceHighlightKey("auto_brightness_entry")
-                        .build())
+                .setWarningBannerInfo(warningBannerInfoBuilder.build())
                 .build();
     }
 
-    /**
-     * Create a power anomaly event proto of screen timeout.
-     */
+    /** Create a power anomaly event proto of screen timeout. */
     public static PowerAnomalyEvent createScreenTimeoutAnomalyEvent() {
         return PowerAnomalyEvent.newBuilder()
                 .setEventId("ScreenTimeoutAnomaly")
@@ -267,17 +257,16 @@
                 .setKey(PowerAnomalyKey.KEY_SCREEN_TIMEOUT)
                 .setDismissRecordKey(PowerAnomalyKey.KEY_SCREEN_TIMEOUT.name())
                 .setScore(1.1f)
-                .setWarningBannerInfo(WarningBannerInfo.newBuilder()
-                        .setMainButtonDestination(ScreenTimeoutSettings.class.getName())
-                        .setMainButtonSourceMetricsCategory(SettingsEnums.SCREEN_TIMEOUT)
-                        .setMainButtonSourceHighlightKey("60000")
-                        .build())
+                .setWarningBannerInfo(
+                        WarningBannerInfo.newBuilder()
+                                .setMainButtonDestination(ScreenTimeoutSettings.class.getName())
+                                .setMainButtonSourceMetricsCategory(SettingsEnums.SCREEN_TIMEOUT)
+                                .setMainButtonSourceHighlightKey("60000")
+                                .build())
                 .build();
     }
 
-    /**
-     * Create a power anomaly event proto of app anomaly.
-     */
+    /** Create a power anomaly event proto of app anomaly. */
     public static PowerAnomalyEvent createAppAnomalyEvent() {
         return PowerAnomalyEvent.newBuilder()
                 .setEventId("AppAnomaly")
@@ -285,10 +274,11 @@
                 .setKey(PowerAnomalyKey.KEY_APP_TOTAL_HIGHER_THAN_USUAL)
                 .setDismissRecordKey("KEY_APP_1")
                 .setScore(2.0f)
-                .setWarningItemInfo(WarningItemInfo.newBuilder()
-                        .setStartTimestamp(1694361600000L)  // 2023-09-11 00:00:00
-                        .setEndTimestamp(1694368800000L)    // 2023-09-11 02:00:00
-                        .build())
+                .setWarningItemInfo(
+                        WarningItemInfo.newBuilder()
+                                .setStartTimestamp(1694361600000L) // 2023-09-11 00:00:00
+                                .setEndTimestamp(1694368800000L) // 2023-09-11 02:00:00
+                                .build())
                 .build();
     }
 }
diff --git a/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java
new file mode 100644
index 0000000..76892e2
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/widget/CardPreferenceTest.java
@@ -0,0 +1,293 @@
+/*
+ * Copyright (C) 2019 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
+ *Visibility_setGoneForPrimaryButton_buttonGroupIsGone
+ * 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.settings.widget;
+
+import static android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.content.Context;
+import android.view.View;
+import android.widget.Button;
+
+import androidx.preference.PreferenceViewHolder;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settings.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+
+@RunWith(RobolectricTestRunner.class)
+public class CardPreferenceTest {
+    private CardPreference mCardPreference;
+    private PreferenceViewHolder mHolder;
+
+    @Before
+    public void setUp() {
+        Context context = ApplicationProvider.getApplicationContext();
+        context.setTheme(R.style.Theme_Settings);
+        mCardPreference = new CardPreference(context);
+        mHolder =
+                PreferenceViewHolder.createInstanceForTests(
+                        View.inflate(context, R.layout.card_preference_layout, /* parent= */ null));
+    }
+
+    @Test
+    public void newACardPreference_layoutResourceShouldBeCardPreferenceLayout() {
+        Context context = ApplicationProvider.getApplicationContext();
+        context.setTheme(R.style.SettingsPreferenceTheme);
+        CardPreference cardPreference = new CardPreference(context);
+        assertThat(cardPreference.getLayoutResource()).isEqualTo(R.layout.card_preference_layout);
+    }
+
+    @Test
+    public void onBindViewHolder_noButtonVisible_buttonsLayoutIsGone() {
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_setPrimaryButtonVisibility_buttonsLayoutIsVisible() {
+        mCardPreference.setPrimaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_setPrimaryButtonVisibilityToVisible() {
+        mCardPreference.setPrimaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_setSecondaryButtonVisibility_buttonsLayoutIsVisible() {
+        mCardPreference.setSecondaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_setSecondaryButtonVisibilityToVisible() {
+        mCardPreference.setSecondaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void onBindViewHolder_setPrimaryButtonTextToExpectedText() {
+        String expectedText = "primary-button";
+        mCardPreference.setPrimaryButtonText(expectedText);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
+    }
+
+    @Test
+    public void onBindViewHolder_setSecondaryButtonTextToExpectedText() {
+        String expectedText = "secondary-button";
+        mCardPreference.setSecondaryButtonText(expectedText);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
+    }
+
+    @Test
+    public void onBindViewHolder_initialTextForPrimaryButtonShouldBeEmpty() {
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getPrimaryButton().getText().toString()).isEqualTo("");
+    }
+
+    @Test
+    public void onBindViewHolder_initialTextForSecondaryButtonShouldBeEmpty() {
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getSecondaryButton().getText().toString()).isEqualTo("");
+    }
+
+    @Test
+    public void performClickOnPrimaryButton_callClickListener() {
+        final boolean[] hasCalled = {false};
+        View.OnClickListener clickListener = v -> hasCalled[0] = true;
+        mCardPreference.setPrimaryButtonClickListener(clickListener);
+        mCardPreference.onBindViewHolder(mHolder);
+        getPrimaryButton().performClick();
+        assertThat(hasCalled[0]).isTrue();
+    }
+
+    @Test
+    public void performClickOnSecondaryButton_callClickListener() {
+        final boolean[] hasCalled = {false};
+        View.OnClickListener clickListener = v -> hasCalled[0] = true;
+        mCardPreference.setSecondaryButtonClickListener(clickListener);
+        mCardPreference.onBindViewHolder(mHolder);
+        getSecondaryButton().performClick();
+        assertThat(hasCalled[0]).isTrue();
+    }
+
+    @Test
+    public void onBindViewHolder_primaryButtonDefaultIsGone() {
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getPrimaryButton().getVisibility()).isEqualTo(GONE);
+    }
+
+    @Test
+    public void onBindViewHolder_secondaryButtonDefaultIsGone() {
+        mCardPreference.onBindViewHolder(mHolder);
+        assertThat(getSecondaryButton().getVisibility()).isEqualTo(GONE);
+    }
+
+    @Test
+    public void setPrimaryButtonVisibility_setTrueAfterBindViewHolder_isVisible() {
+        mCardPreference.setPrimaryButtonVisible(false);
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setPrimaryButtonVisible(true);
+        assertThat(getPrimaryButton().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void setPrimaryButtonText_setAfterBindViewHolder_setOnUi() {
+        String expectedText = "123456";
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setPrimaryButtonText(expectedText);
+        assertThat(getPrimaryButton().getText().toString()).isEqualTo(expectedText);
+    }
+
+    @Test
+    public void setPrimaryButtonText_setNull_isEmptyText() {
+        final String emptyString = "";
+        mCardPreference.setPrimaryButtonText("1234");
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setPrimaryButtonText(null);
+        assertThat(getPrimaryButton().getText().toString()).isEqualTo(emptyString);
+    }
+
+    @Test
+    public void setPrimaryButtonClickListener_setAfterOnBindViewHolder() {
+        final String[] hasCalled = {""};
+        String expectedClickedResult = "was called";
+        View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setPrimaryButtonClickListener(clickListener);
+        getPrimaryButton().performClick();
+        assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
+    }
+
+    @Test
+    public void setPrimaryButtonClickListener_setNull_clearTheOnClickListener() {
+        final String[] hasCalled = {"not called"};
+        View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
+        mCardPreference.setPrimaryButtonClickListener(clickListener);
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setPrimaryButtonClickListener(null);
+        getPrimaryButton().performClick();
+        assertThat(hasCalled[0]).isEqualTo("not called");
+    }
+
+    @Test
+    public void setSecondaryButtonVisibility_setTrueAfterBindViewHolder_isVisible() {
+        mCardPreference.setSecondaryButtonVisible(false);
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setSecondaryButtonVisible(true);
+        assertThat(getSecondaryButton().getVisibility()).isEqualTo(VISIBLE);
+    }
+
+    @Test
+    public void setSecondaryButtonText_setAfterBindViewHolder_setOnUi() {
+        String expectedText = "10101010";
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setSecondaryButtonText(expectedText);
+        assertThat(getSecondaryButton().getText().toString()).isEqualTo(expectedText);
+    }
+
+    @Test
+    public void setSecondaryButtonText_setNull_isEmptyText() {
+        String emptyString = "";
+        mCardPreference.setSecondaryButtonText("1234");
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setSecondaryButtonText(null);
+        assertThat(getSecondaryButton().getText().toString()).isEqualTo(emptyString);
+    }
+
+    @Test
+    public void setSecondaryButtonClickListener_setAfterOnBindViewHolder() {
+        final String[] hasCalled = {""};
+        String expectedClickedResult = "2nd was called";
+        View.OnClickListener clickListener = v -> hasCalled[0] = expectedClickedResult;
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setSecondaryButtonClickListener(clickListener);
+        getSecondaryButton().performClick();
+        assertThat(hasCalled[0]).isEqualTo(expectedClickedResult);
+    }
+
+    @Test
+    public void setSecondaryButtonClickListener_setNull_clearTheOnClickListener() {
+        final String[] hasCalled = {"not called"};
+        View.OnClickListener clickListener = v -> hasCalled[0] = "called once";
+        mCardPreference.setSecondaryButtonClickListener(clickListener);
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.setSecondaryButtonClickListener(null);
+        getSecondaryButton().performClick();
+        assertThat(hasCalled[0]).isEqualTo("not called");
+    }
+
+    @Test
+    public void setPrimaryButtonVisibility_setGoneForSecondaryButton_buttonGroupIsGone() {
+        mCardPreference.setPrimaryButtonVisible(true);
+        mCardPreference.setSecondaryButtonVisible(false);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertWithMessage("PreCondition: buttonsView should be Visible")
+                .that(getCardPreferenceButtonsView().getVisibility())
+                .isEqualTo(VISIBLE);
+        mCardPreference.setPrimaryButtonVisible(false);
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
+    }
+
+    @Test
+    public void setSecondaryButtonVisibility_setGoneForPrimaryButton_buttonGroupIsGone() {
+        mCardPreference.setPrimaryButtonVisible(false);
+        mCardPreference.setSecondaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        assertWithMessage("PreCondition: buttonsView should be Visible")
+                .that(getCardPreferenceButtonsView().getVisibility())
+                .isEqualTo(VISIBLE);
+        mCardPreference.setSecondaryButtonVisible(false);
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
+    }
+
+    @Test
+    public void resetLayoutState_buttonGroupIsGone() {
+        mCardPreference.setPrimaryButtonVisible(true);
+        mCardPreference.setSecondaryButtonVisible(true);
+        mCardPreference.onBindViewHolder(mHolder);
+        mCardPreference.resetLayoutState();
+        assertThat(getCardPreferenceButtonsView().getVisibility()).isEqualTo(GONE);
+    }
+
+    private View getCardPreferenceButtonsView() {
+        return mHolder.findViewById(R.id.card_preference_buttons);
+    }
+
+    private Button getPrimaryButton() {
+        return (Button) mHolder.findViewById(android.R.id.button1);
+    }
+
+    private Button getSecondaryButton() {
+        return (Button) mHolder.findViewById(android.R.id.button2);
+    }
+}
diff --git a/tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt b/tests/spa_unit/src/com/android/settings/widget/TipCardPreferenceTest.kt
similarity index 98%
rename from tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt
rename to tests/spa_unit/src/com/android/settings/widget/TipCardPreferenceTest.kt
index 0483e36..aeea69f 100644
--- a/tests/spa_unit/src/com/android/settings/widget/CardPreferenceTest.kt
+++ b/tests/spa_unit/src/com/android/settings/widget/TipCardPreferenceTest.kt
@@ -35,7 +35,7 @@
 import org.junit.runner.RunWith
 
 @RunWith(AndroidJUnit4::class)
-class CardPreferenceTest {
+class TipCardPreferenceTest {
 
     @get:Rule val composeTestRule = createComposeRule()
     private lateinit var context: Context
@@ -179,7 +179,7 @@
     fun resetLayoutState_shouldRemoveThePrimaryButton() {
         val buttonText = "9527"
         val cardPreference =
-            CardPreference(context)
+            TipCardPreference(context)
                 .apply {
                     primaryButtonText = buttonText
                     primaryButtonVisibility = true
@@ -196,7 +196,7 @@
     fun resetLayoutState_shouldRemoveTheSecondaryButton() {
         val buttonText = "4567"
         val cardPreference =
-            CardPreference(context)
+            TipCardPreference(context)
                 .apply {
                     secondaryButtonText = buttonText
                     secondaryButtonVisibility = true
@@ -222,7 +222,7 @@
         secondaryButtonVisibility: Boolean = false,
         enableDismiss: Boolean = true,
     ) =
-        CardPreference(context)
+        TipCardPreference(context)
             .apply {
                 this.iconResId = iconResId
                 this.primaryButtonText = primaryButtonText