[Expressive Battery] Refactor pref with anomaly hint.

- WarningFramePreference & warning_frame_preference.xml is a battery customized layout which looks like a standard Preference layout with an optional app icon & warning chip.
- PowerGaugePreference extends the WarningFramePreference to display the app Preference with optional warning chip in Battery > Battery Usage.
- PowerUsageTimePreference extends the WarningFramePreference to display the usage time with optional warning chip in Battery > Battery Usage > App battery usage.

Bug: 349652542
Test: atest BatteryUsageBreakdownControllerTest PowerGaugePreferenceTest PowerUsageTimeControllerTest
Flag: com.android.settingslib.widget.theme.flags.is_expressive_design_enabled
Change-Id: I5d22703ccc487c54a2bbbc1d9737b92a2de54ba5
This commit is contained in:
mxyyiyi
2025-02-07 14:43:15 +08:00
parent 8efba3fee5
commit a2bdafaf5e
11 changed files with 178 additions and 260 deletions

View File

@@ -1,49 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2023 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:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:orientation="vertical">
<TextView
android:id="@+id/time_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="20dp"
android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="?android:attr/textColorPrimary" />
<TextView
android:id="@+id/time_summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginVertical="4dp"
android:textAlignment="viewStart"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textColor="?android:attr/textColorSecondary" />
<include layout="@layout/power_anomaly_hints"
android:visibility="gone"
android:id="@+id/anomaly_hints"
android:paddingBottom="20dp"/>
</LinearLayout>

View File

@@ -22,7 +22,7 @@
<include layout="@layout/preference_app"/>
<LinearLayout
android:id="@+id/warning_chip"
android:id="@+id/warning_chip_frame"
android:visibility="gone"
android:clickable="false"
android:layout_width="match_parent"
@@ -32,13 +32,12 @@
android:orientation="horizontal"
android:paddingStart="?android:attr/listPreferredItemPaddingStart"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd">
<Space
android:id="@+id/warning_padding_placeholder"
android:layout_width="@dimen/secondary_app_icon_size"
android:layout_height="wrap_content"
android:layout_height="1px"
android:layout_marginEnd="16dp"/>
<include layout="@layout/power_anomaly_hints" />
<include layout="@layout/power_anomaly_hints"/>
</LinearLayout>
</LinearLayout>

View File

@@ -93,10 +93,10 @@ public class PowerUsageTimeController extends BasePreferenceController {
|| (summaryTimeMs == 0 && !TextUtils.equals(anomalyHintKey, preference.getKey()))) {
return false;
}
preference.setTimeTitle(mContext.getString(titleResId));
preference.setTimeSummary(getPowerUsageTimeInfo(summaryTimeMs));
preference.setTitle(mContext.getString(titleResId));
preference.setSummary(getPowerUsageTimeInfo(summaryTimeMs));
if (TextUtils.equals(anomalyHintKey, preference.getKey())) {
preference.setAnomalyHint(anomalyHintText);
preference.setHint(anomalyHintText);
}
preference.setVisible(true);
return true;

View File

@@ -17,74 +17,17 @@
package com.android.settings.fuelgauge;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settingslib.widget.GroupSectionDividerMixin;
/** Custom preference for displaying the app power usage time. */
public class PowerUsageTimePreference extends Preference {
public class PowerUsageTimePreference extends WarningFramePreference implements
GroupSectionDividerMixin {
private static final String TAG = "PowerUsageTimePreference";
@VisibleForTesting CharSequence mTimeTitle;
@VisibleForTesting CharSequence mTimeSummary;
@VisibleForTesting CharSequence mAnomalyHintText;
public PowerUsageTimePreference(Context context, AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.power_usage_time);
}
void setTimeTitle(CharSequence timeTitle) {
if (!TextUtils.equals(mTimeTitle, timeTitle)) {
mTimeTitle = timeTitle;
notifyChanged();
}
}
void setTimeSummary(CharSequence timeSummary) {
if (!TextUtils.equals(mTimeSummary, timeSummary)) {
mTimeSummary = timeSummary;
notifyChanged();
}
}
void setAnomalyHint(CharSequence anomalyHintText) {
if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
mAnomalyHintText = anomalyHintText;
notifyChanged();
}
}
private void showAnomalyHint(PreferenceViewHolder view) {
if (TextUtils.isEmpty(mAnomalyHintText)) {
return;
}
final View anomalyHintView = view.findViewById(R.id.anomaly_hints);
if (anomalyHintView == null) {
return;
}
final TextView warningInfo = anomalyHintView.findViewById(R.id.warning_info);
if (warningInfo == null) {
return;
}
warningInfo.setText(mAnomalyHintText);
anomalyHintView.setVisibility(View.VISIBLE);
}
@Override
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
((TextView) view.findViewById(R.id.time_title)).setText(mTimeTitle);
((TextView) view.findViewById(R.id.time_summary)).setText(mTimeSummary);
showAnomalyHint(view);
setSelectable(false);
}
}

View File

@@ -0,0 +1,79 @@
/*
* 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.
*/
package com.android.settings.fuelgauge;
import android.annotation.Nullable;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Space;
import android.widget.TextView;
import androidx.preference.Preference;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settingslib.Utils;
/**
* Custom preference for displaying the {@link Preference} with an optional hint chip.
*/
public class WarningFramePreference extends Preference {
private final int mTitleColorNormal;
private final int mSummaryColorNormal;
@Nullable private CharSequence mHintText;
public WarningFramePreference(Context context, AttributeSet attrs) {
super(context, attrs);
setLayoutResource(R.layout.warning_frame_preference);
mTitleColorNormal =
Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary);
mSummaryColorNormal =
Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
}
/** Sets the text of hint to show. */
public void setHint(@Nullable CharSequence hintText) {
if (!TextUtils.equals(mHintText, hintText)) {
mHintText = hintText;
notifyChanged();
}
}
@Override
public void onBindViewHolder(PreferenceViewHolder view) {
super.onBindViewHolder(view);
final LinearLayout warningChipFrame =
(LinearLayout) view.findViewById(R.id.warning_chip_frame);
final Space warningPaddingPlaceHolder =
warningChipFrame.findViewById(R.id.warning_padding_placeholder);
warningPaddingPlaceHolder.setVisibility(getIcon() != null ? View.VISIBLE : View.GONE);
if (!TextUtils.isEmpty(mHintText)) {
((TextView) warningChipFrame.findViewById(R.id.warning_info)).setText(mHintText);
warningChipFrame.setVisibility(View.VISIBLE);
} else {
warningChipFrame.setVisibility(View.GONE);
}
((TextView) view.findViewById(android.R.id.title)).setTextColor(mTitleColorNormal);
((TextView) view.findViewById(android.R.id.summary)).setTextColor(mSummaryColorNormal);
}
}

View File

@@ -1,61 +0,0 @@
/*
* Copyright (C) 2023 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.fuelgauge.batteryusage;
import android.annotation.Nullable;
import android.content.Context;
import android.text.TextUtils;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
class AnomalyAppItemPreference extends PowerGaugePreference {
private static final String TAG = "AnomalyAppItemPreference";
private CharSequence mAnomalyHintText;
AnomalyAppItemPreference(Context context) {
super(context, /* attrs */ null);
setLayoutResource(R.layout.anomaly_app_item_preference);
}
void setAnomalyHint(@Nullable CharSequence anomalyHintText) {
if (!TextUtils.equals(mAnomalyHintText, anomalyHintText)) {
mAnomalyHintText = anomalyHintText;
notifyChanged();
}
}
@Override
public void onBindViewHolder(PreferenceViewHolder viewHolder) {
super.onBindViewHolder(viewHolder);
final LinearLayout warningChipView =
(LinearLayout) viewHolder.findViewById(R.id.warning_chip);
if (!TextUtils.isEmpty(mAnomalyHintText)) {
((TextView) warningChipView.findViewById(R.id.warning_info)).setText(mAnomalyHintText);
warningChipView.setVisibility(View.VISIBLE);
} else {
warningChipView.setVisibility(View.GONE);
}
}
}

View File

@@ -381,15 +381,15 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
continue;
}
final String prefKey = entry.getKey();
AnomalyAppItemPreference preference = mRootPreferenceGroup.findPreference(prefKey);
PowerGaugePreference preference = mRootPreferenceGroup.findPreference(prefKey);
if (preference != null) {
isAdded = true;
} else {
preference = (AnomalyAppItemPreference) mPreferenceCache.get(prefKey);
preference = (PowerGaugePreference) mPreferenceCache.get(prefKey);
}
// Creates new instance if cached preference is not found.
if (preference == null) {
preference = new AnomalyAppItemPreference(mPrefContext);
preference = new PowerGaugePreference(mPrefContext);
preference.setKey(prefKey);
mPreferenceCache.put(prefKey, preference);
}
@@ -398,7 +398,7 @@ public class BatteryUsageBreakdownController extends BasePreferenceController
preference.setOrder(++preferenceOrder);
preference.setSingleLineTitle(true);
// Updates App item preference style
preference.setAnomalyHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
preference.setHint(isAnomalyBatteryDiffEntry(entry) ? mAnomalyHintString : null);
// Sets the BatteryDiffEntry to preference for launching detailed page.
preference.setBatteryDiffEntry(entry);
preference.setSelectable(entry.validForRestriction());

View File

@@ -28,7 +28,7 @@ import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settings.Utils;
import com.android.settingslib.widget.AppPreference;
import com.android.settings.fuelgauge.WarningFramePreference;
/**
* Custom preference for displaying battery usage info as a bar and an icon on the left for the
@@ -37,7 +37,7 @@ import com.android.settingslib.widget.AppPreference;
* <p>The battery usage info could be usage percentage or usage time. The preference won't show any
* icon if it is null.
*/
public class PowerGaugePreference extends AppPreference {
public class PowerGaugePreference extends WarningFramePreference {
// Please see go/battery-usage-app-list-alpha
private static final float SELECTABLE_ALPHA = 1f;
@@ -51,7 +51,6 @@ public class PowerGaugePreference extends AppPreference {
private CharSequence mContentDescription;
private CharSequence mProgress;
private CharSequence mProgressContentDescription;
private boolean mShowAnomalyIcon;
public PowerGaugePreference(
Context context, Drawable icon, CharSequence contentDescription, BatteryEntry info) {
@@ -79,7 +78,6 @@ public class PowerGaugePreference extends AppPreference {
setWidgetLayoutResource(R.layout.preference_widget_summary);
mInfo = info;
mContentDescription = contentDescription;
mShowAnomalyIcon = false;
mTitleColorNormal =
Utils.getColorAttrDefaultColor(context, android.R.attr.textColorPrimary);
}
@@ -108,17 +106,6 @@ public class PowerGaugePreference extends AppPreference {
return mProgress.toString();
}
/** Sets whether to show anomaly icon */
public void shouldShowAnomalyIcon(boolean showAnomalyIcon) {
mShowAnomalyIcon = showAnomalyIcon;
notifyChanged();
}
/** Gets whether to show anomaly icon */
public boolean showAnomalyIcon() {
return mShowAnomalyIcon;
}
public void setBatteryDiffEntry(BatteryDiffEntry entry) {
mBatteryDiffEntry = entry;
}
@@ -149,12 +136,6 @@ public class PowerGaugePreference extends AppPreference {
if (!TextUtils.isEmpty(mProgressContentDescription)) {
subtitle.setContentDescription(mProgressContentDescription);
}
if (mShowAnomalyIcon) {
subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds(
R.drawable.ic_warning_24dp, 0, 0, 0);
} else {
subtitle.setCompoundDrawablesRelativeWithIntrinsicBounds(0, 0, 0, 0);
}
if (mContentDescription != null) {
final TextView titleView = (TextView) view.findViewById(android.R.id.title);
titleView.setContentDescription(mContentDescription);

View File

@@ -99,9 +99,9 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyOnePreferenceInvisible(mBackgroundTimePreference);
verify(mScreenTimePreference).setTimeTitle("Screen time");
verify(mScreenTimePreference).setTimeSummary("1 min");
verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
verify(mScreenTimePreference).setTitle("Screen time");
verify(mScreenTimePreference).setSummary("1 min");
verify(mScreenTimePreference, never()).setHint(anyString());
}
@Test
@@ -117,9 +117,9 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyOnePreferenceInvisible(mScreenTimePreference);
verify(mBackgroundTimePreference).setTimeTitle("Background time");
verify(mBackgroundTimePreference).setTimeSummary("2 min");
verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
verify(mBackgroundTimePreference).setTitle("Background time");
verify(mBackgroundTimePreference).setSummary("2 min");
verify(mBackgroundTimePreference, never()).setHint(anyString());
}
@Test
@@ -135,12 +135,12 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeTitle("Screen time");
verify(mScreenTimePreference).setTimeSummary("1 min");
verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
verify(mBackgroundTimePreference).setTimeTitle("Background time");
verify(mBackgroundTimePreference).setTimeSummary("2 min");
verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
verify(mScreenTimePreference).setTitle("Screen time");
verify(mScreenTimePreference).setSummary("1 min");
verify(mScreenTimePreference, never()).setHint(anyString());
verify(mBackgroundTimePreference).setTitle("Background time");
verify(mBackgroundTimePreference).setSummary("2 min");
verify(mBackgroundTimePreference, never()).setHint(anyString());
verify(mPowerUsageTimeCategory).setTitle("App usage for 12 am-2 am");
}
@@ -173,8 +173,8 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("1 min");
verify(mBackgroundTimePreference).setTimeSummary("Less than a minute");
verify(mScreenTimePreference).setSummary("1 min");
verify(mBackgroundTimePreference).setSummary("Less than a minute");
}
@Test
@@ -190,8 +190,8 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a minute");
verify(mBackgroundTimePreference).setTimeSummary("2 min");
verify(mScreenTimePreference).setSummary("Less than a minute");
verify(mBackgroundTimePreference).setSummary("2 min");
}
@Test
@@ -207,8 +207,8 @@ public final class PowerUsageTimeControllerTest {
/* anomalyHintText= */ null);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a minute");
verify(mBackgroundTimePreference).setTimeSummary("Less than a minute");
verify(mScreenTimePreference).setSummary("Less than a minute");
verify(mBackgroundTimePreference).setSummary("Less than a minute");
}
@Test
@@ -224,8 +224,8 @@ public final class PowerUsageTimeControllerTest {
TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
verify(mScreenTimePreference).setHint(TEST_ANOMALY_HINT_TEXT);
verify(mBackgroundTimePreference, never()).setHint(anyString());
}
@Test
@@ -241,8 +241,8 @@ public final class PowerUsageTimeControllerTest {
TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference, never()).setAnomalyHint(anyString());
verify(mBackgroundTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
verify(mScreenTimePreference, never()).setHint(anyString());
verify(mBackgroundTimePreference).setHint(TEST_ANOMALY_HINT_TEXT);
}
@Test
@@ -258,9 +258,9 @@ public final class PowerUsageTimeControllerTest {
TEST_ANOMALY_HINT_TEXT);
verifyAllPreferencesVisible(true);
verify(mScreenTimePreference).setTimeSummary("Less than a minute");
verify(mScreenTimePreference).setAnomalyHint(TEST_ANOMALY_HINT_TEXT);
verify(mBackgroundTimePreference, never()).setAnomalyHint(anyString());
verify(mScreenTimePreference).setSummary("Less than a minute");
verify(mScreenTimePreference).setHint(TEST_ANOMALY_HINT_TEXT);
verify(mBackgroundTimePreference, never()).setHint(anyString());
}
private void verifySetPrefToVisible(Preference pref, boolean isVisible) {

View File

@@ -67,7 +67,7 @@ public final class BatteryUsageBreakdownControllerTest {
@Mock private PreferenceGroup mRootPreferenceGroup;
@Mock private Drawable mDrawable;
@Mock private BatteryHistEntry mBatteryHistEntry;
@Mock private AnomalyAppItemPreference mAnomalyAppItemPreference;
@Mock private PowerGaugePreference mPowerGaugePreference;
private Context mContext;
private FakeFeatureFactory mFeatureFactory;
@@ -131,13 +131,13 @@ public final class BatteryUsageBreakdownControllerTest {
BatteryDiffEntry.sResourceCache.put(
"fakeBatteryDiffEntryKey",
new BatteryEntry.NameAndIcon("fakeName", /* icon= */ null, /* iconId= */ 1));
doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).findPreference(PREF_KEY);
doReturn(mPowerGaugePreference).when(mRootPreferenceGroup).findPreference(PREF_KEY);
}
@Test
public void onDestroy_clearPreferenceCacheAndPreferenceGroupRemoveAll() {
// Ensures the testing environment is correct.
mBatteryUsageBreakdownController.mPreferenceCache.put(PREF_KEY, mAnomalyAppItemPreference);
mBatteryUsageBreakdownController.mPreferenceCache.put(PREF_KEY, mPowerGaugePreference);
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).hasSize(1);
mBatteryUsageBreakdownController.onDestroy();
@@ -204,25 +204,25 @@ public final class BatteryUsageBreakdownControllerTest {
@Test
public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() {
doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
doReturn(mPowerGaugePreference).when(mRootPreferenceGroup).getPreference(0);
doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey();
doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
// Ensures the testing data is correct.
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();
assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
.isEqualTo(mAnomalyAppItemPreference);
verify(mRootPreferenceGroup).removePreference(mAnomalyAppItemPreference);
.isEqualTo(mPowerGaugePreference);
verify(mRootPreferenceGroup).removePreference(mPowerGaugePreference);
}
@Test
public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() {
doReturn(1).when(mRootPreferenceGroup).getPreferenceCount();
doReturn(mAnomalyAppItemPreference).when(mRootPreferenceGroup).getPreference(0);
doReturn(mPowerGaugePreference).when(mRootPreferenceGroup).getPreference(0);
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
// Ensures the testing data is correct.
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
@@ -246,11 +246,11 @@ public final class BatteryUsageBreakdownControllerTest {
@Test
public void handlePreferenceTreeClick_forAppEntry_returnTrue() {
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
assertThat(
mBatteryUsageBreakdownController.handlePreferenceTreeClick(
mAnomalyAppItemPreference))
mPowerGaugePreference))
.isTrue();
verify(mMetricsFeatureProvider)
.action(
@@ -264,11 +264,11 @@ public final class BatteryUsageBreakdownControllerTest {
@Test
public void handlePreferenceTreeClick_forSystemEntry_returnTrue() {
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_UID_BATTERY;
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
assertThat(
mBatteryUsageBreakdownController.handlePreferenceTreeClick(
mAnomalyAppItemPreference))
mPowerGaugePreference))
.isTrue();
verify(mMetricsFeatureProvider)
.action(

View File

@@ -19,19 +19,20 @@ import static com.google.common.truth.Truth.assertThat;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.VectorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Space;
import androidx.preference.PreferenceViewHolder;
import com.android.settings.R;
import com.android.settingslib.widget.SettingsThemeHelper;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
@@ -48,17 +49,17 @@ public class PowerGaugePreferenceTest {
private View mWidgetView;
private PreferenceViewHolder mPreferenceViewHolder;
@Mock Drawable mMockIcon;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = RuntimeEnvironment.application;
mPowerGaugePreference = new PowerGaugePreference(mContext);
mRootView =
LayoutInflater.from(mContext)
.inflate(
com.android.settingslib.widget.preference.app.R.layout
.preference_app,
null);
.inflate(mPowerGaugePreference.getLayoutResource(), null);
mWidgetView =
LayoutInflater.from(mContext).inflate(R.layout.preference_widget_summary, null);
final LinearLayout widgetFrame = mRootView.findViewById(android.R.id.widget_frame);
@@ -66,31 +67,56 @@ public class PowerGaugePreferenceTest {
widgetFrame.addView(mWidgetView);
mPreferenceViewHolder = PreferenceViewHolder.createInstanceForTests(mRootView);
mPowerGaugePreference = new PowerGaugePreference(mContext);
assertThat(mPowerGaugePreference.getLayoutResource())
.isEqualTo(com.android.settingslib.widget.preference.app.R.layout.preference_app);
.isEqualTo(
SettingsThemeHelper.isExpressiveTheme(mContext)
? R.layout.expressive_warning_frame_preference
: R.layout.warning_frame_preference);
}
@Test
public void testOnBindViewHolder_showAnomaly_bindAnomalyIcon() {
mPowerGaugePreference.shouldShowAnomalyIcon(true);
public void testOnBindViewHolder_showHint_hasHintChip() {
mPowerGaugePreference.setHint("Hint Text");
mPowerGaugePreference.setIcon(mMockIcon);
mPowerGaugePreference.onBindViewHolder(mPreferenceViewHolder);
TextView widgetSummary = (TextView) mPreferenceViewHolder.findViewById(R.id.widget_summary);
final Drawable[] drawables = widgetSummary.getCompoundDrawablesRelative();
final LinearLayout warningChipFrame =
(LinearLayout) mPreferenceViewHolder.findViewById(R.id.warning_chip_frame);
final Space warningPaddingPlaceHolder =
warningChipFrame.findViewById(R.id.warning_padding_placeholder);
assertThat(drawables[0]).isInstanceOf(VectorDrawable.class);
assertThat(warningChipFrame.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(warningPaddingPlaceHolder.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void testOnBindViewHolder_notShowAnomaly_bindAnomalyIcon() {
mPowerGaugePreference.shouldShowAnomalyIcon(false);
public void testOnBindViewHolder_emptyHintText_withoutHintChip() {
mPowerGaugePreference.setHint("");
mPowerGaugePreference.setIcon(mMockIcon);
mPowerGaugePreference.onBindViewHolder(mPreferenceViewHolder);
TextView widgetSummary = (TextView) mPreferenceViewHolder.findViewById(R.id.widget_summary);
final Drawable[] drawables = widgetSummary.getCompoundDrawablesRelative();
final LinearLayout warningChipFrame =
(LinearLayout) mPreferenceViewHolder.findViewById(R.id.warning_chip_frame);
final Space warningPaddingPlaceholder =
warningChipFrame.findViewById(R.id.warning_padding_placeholder);
assertThat(drawables[0]).isNull();
assertThat(warningChipFrame.getVisibility()).isEqualTo(View.GONE);
assertThat(warningPaddingPlaceholder.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void testOnBindViewHolder_noAppIconWithHintText_hasChipWithoutPaddingPlaceholder() {
mPowerGaugePreference.setHint("Anomaly Hint Text");
mPowerGaugePreference.setIcon(null);
mPowerGaugePreference.onBindViewHolder(mPreferenceViewHolder);
final LinearLayout warningChipFrame =
(LinearLayout) mPreferenceViewHolder.findViewById(R.id.warning_chip_frame);
final Space warningPaddingPlaceHolder =
warningChipFrame.findViewById(R.id.warning_padding_placeholder);
assertThat(warningChipFrame.getVisibility()).isEqualTo(View.VISIBLE);
assertThat(warningPaddingPlaceHolder.getVisibility()).isEqualTo(View.GONE);
}
@Test