Merge changes from topic "improve_battery_usage" into main

* changes:
  [Expressive Battery] Implement the expressive style for anomaly hint chip
  [Expressive Battery] Refactor pref with anomaly hint.
This commit is contained in:
Xinyi Mao
2025-02-13 00:32:59 -08:00
committed by Android (Google) Code Review
15 changed files with 284 additions and 263 deletions

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