[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:
@@ -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>
|
@@ -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>
|
@@ -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;
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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());
|
||||
|
@@ -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);
|
||||
|
@@ -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) {
|
||||
|
@@ -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(
|
||||
|
@@ -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
|
||||
|
Reference in New Issue
Block a user