Merge "Migrate Tips Card in battery uasge to Settings Card." into main
This commit is contained in:
committed by
Android (Google) Code Review
commit
93b093033a
@@ -1,293 +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 static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.Mockito.doNothing;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
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;
|
||||
|
||||
import com.android.settings.DisplaySettings;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.SettingsActivity;
|
||||
import com.android.settings.testutils.BatteryTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.TimeZone;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class BatteryTipsCardPreferenceTest {
|
||||
|
||||
private Context mContext;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private BatteryTipsCardPreference mBatteryTipsCardPreference;
|
||||
private PowerUsageAdvanced mPowerUsageAdvanced;
|
||||
private BatteryTipsController mBatteryTipsController;
|
||||
private BatteryChartPreferenceController mBatteryChartPreferenceController;
|
||||
|
||||
@Mock private View mFakeView;
|
||||
@Mock private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
|
||||
@Mock private BatteryDiffEntry mFakeEntry;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mBatteryTipsCardPreference = new BatteryTipsCardPreference(mContext, /* attrs= */ null);
|
||||
mBatteryTipsController = new BatteryTipsController(mContext);
|
||||
mBatteryChartPreferenceController =
|
||||
spy(new BatteryChartPreferenceController(mContext, null, null));
|
||||
mBatteryChartPreferenceController.mPrefContext = mContext;
|
||||
mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
|
||||
|
||||
mPowerUsageAdvanced = spy(new PowerUsageAdvanced());
|
||||
doReturn(mContext).when(mPowerUsageAdvanced).getContext();
|
||||
mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
|
||||
mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
|
||||
mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
|
||||
mPowerUsageAdvanced.mBatteryLevelData =
|
||||
Optional.of(
|
||||
new BatteryLevelData(
|
||||
Map.of(
|
||||
1694354400000L, 1, // 2023-09-10 22:00:00
|
||||
1694361600000L, 2, // 2023-09-11 00:00:00
|
||||
1694368800000L, 3))); // 2023-09-11 02:00:00
|
||||
doReturn("TestEntriesKey").when(mFakeEntry).getKey();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void constructor_returnExpectedResult() {
|
||||
assertThat(mBatteryTipsCardPreference.getLayoutResource())
|
||||
.isEqualTo(R.layout.battery_tips_card);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClick_mainBtnOfSettingsAnomalyLaunchPage_getAdaptiveBrightnessLauncher() {
|
||||
final ArgumentCaptor<Intent> captor = ArgumentCaptor.forClass(Intent.class);
|
||||
PowerAnomalyEvent adaptiveBrightnessAnomaly =
|
||||
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(/* changeSettings= */ false);
|
||||
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();
|
||||
verify(mContext).startActivity(any(Intent.class));
|
||||
final Intent intent = captor.getValue();
|
||||
assertThat(intent.getStringExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT))
|
||||
.isEqualTo(DisplaySettings.class.getName());
|
||||
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1))
|
||||
.isEqualTo(SettingsEnums.DISPLAY);
|
||||
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_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();
|
||||
DatabaseUtils.removeDismissedPowerAnomalyKeys(mContext);
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(
|
||||
screenTimeoutAnomaly, screenTimeoutAnomaly);
|
||||
mBatteryTipsCardPreference.onClick(mFakeView);
|
||||
|
||||
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
|
||||
assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext)).hasSize(1);
|
||||
assertThat(DatabaseUtils.getDismissedPowerAnomalyKeys(mContext))
|
||||
.contains(PowerAnomalyKey.KEY_SCREEN_TIMEOUT.name());
|
||||
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_SCREEN_TIMEOUT.getNumber());
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS,
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
BatteryTipsController.ANOMALY_KEY,
|
||||
PowerAnomalyKey.KEY_SCREEN_TIMEOUT.getNumber());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClick_mainBtnOfAppsAnomaly_selectHighlightSlot() {
|
||||
final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
when(mFakeView.getId()).thenReturn(R.id.main_button);
|
||||
doNothing().when(mBatteryChartPreferenceController).selectHighlightSlotIndex();
|
||||
when(mPowerUsageAdvanced.findRelatedBatteryDiffEntry(any())).thenReturn(mFakeEntry);
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly, appsAnomaly);
|
||||
assertHighlightSlotIndexPair(1, 0);
|
||||
mBatteryTipsCardPreference.onClick(mFakeView);
|
||||
|
||||
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
|
||||
verify(mContext, never()).startActivity(any(Intent.class));
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
|
||||
verify(mBatteryChartPreferenceController).selectHighlightSlotIndex();
|
||||
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_APP_TOTAL_HIGHER_THAN_USUAL.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_APP_TOTAL_HIGHER_THAN_USUAL.getNumber());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClick_dismissBtnOfAppsAnomaly_keepHighlightSlotIndex() {
|
||||
final PowerAnomalyEvent appsAnomaly = BatteryTestUtils.createAppAnomalyEvent();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
when(mFakeView.getId()).thenReturn(R.id.dismiss_button);
|
||||
when(mPowerUsageAdvanced.findRelatedBatteryDiffEntry(any())).thenReturn(mFakeEntry);
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly, appsAnomaly);
|
||||
assertHighlightSlotIndexPair(1, 0);
|
||||
mBatteryTipsCardPreference.onClick(mFakeView);
|
||||
|
||||
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
|
||||
verify(mContext, never()).startActivity(any(Intent.class));
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
|
||||
verify(mBatteryChartPreferenceController, never()).selectHighlightSlotIndex();
|
||||
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_APP_TOTAL_HIGHER_THAN_USUAL.getNumber());
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS,
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
BatteryTipsController.ANOMALY_KEY,
|
||||
PowerAnomalyKey.KEY_APP_TOTAL_HIGHER_THAN_USUAL.getNumber());
|
||||
}
|
||||
|
||||
private void assertHighlightSlotIndexPair(
|
||||
int dailyHighlightSlotIndex, int hourlyHighlightSlotIndex) {
|
||||
assertThat(mPowerUsageAdvanced.mBatteryLevelData.isPresent()).isTrue();
|
||||
assertThat(mPowerUsageAdvanced.mHighlightEventWrapper.isPresent()).isTrue();
|
||||
Pair<Integer, Integer> slotIndexPair =
|
||||
mPowerUsageAdvanced
|
||||
.mHighlightEventWrapper
|
||||
.get()
|
||||
.getHighlightSlotPair(mPowerUsageAdvanced.mBatteryLevelData.get());
|
||||
assertThat(slotIndexPair)
|
||||
.isEqualTo(Pair.create(dailyHighlightSlotIndex, hourlyHighlightSlotIndex));
|
||||
assertThat(mPowerUsageAdvanced.mBatteryChartPreferenceController.mDailyHighlightSlotIndex)
|
||||
.isEqualTo(dailyHighlightSlotIndex);
|
||||
assertThat(mPowerUsageAdvanced.mBatteryChartPreferenceController.mHourlyHighlightSlotIndex)
|
||||
.isEqualTo(hourlyHighlightSlotIndex);
|
||||
}
|
||||
}
|
@@ -16,8 +16,13 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
@@ -29,11 +34,11 @@ import android.os.LocaleList;
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.testutils.BatteryTestUtils;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
import com.android.settings.widget.TipCardPreference;
|
||||
|
||||
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;
|
||||
@@ -47,134 +52,156 @@ public final class BatteryTipsControllerTest {
|
||||
private Context mContext;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
private BatteryTipsController mBatteryTipsController;
|
||||
|
||||
@Mock private BatteryTipsCardPreference mBatteryTipsCardPreference;
|
||||
private TipCardPreference mCardPreference;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
Locale.setDefault(new Locale("en_US"));
|
||||
org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false);
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
|
||||
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
final Resources resources = spy(mContext.getResources());
|
||||
resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US")));
|
||||
doReturn(resources).when(mContext).getResources();
|
||||
mFeatureFactory = FakeFeatureFactory.setupForTest();
|
||||
mBatteryTipsController = new BatteryTipsController(mContext);
|
||||
mBatteryTipsController.mCardPreference = mBatteryTipsCardPreference;
|
||||
mBatteryTipsController = spy(new BatteryTipsController(mContext));
|
||||
mCardPreference = new TipCardPreference(mContext);
|
||||
mBatteryTipsController.mCardPreference = mCardPreference;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_null_hidePreference() {
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(/* powerAnomalyEvents= */ null, false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setVisible(false);
|
||||
assertThat(mCardPreference.isVisible()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
|
||||
AnomalyEventWrapper anomalyEventWrapper =
|
||||
spy(
|
||||
new AnomalyEventWrapper(
|
||||
mContext,
|
||||
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent(true)));
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(anomalyEventWrapper, false);
|
||||
|
||||
// Check pre-defined string
|
||||
verify(mBatteryTipsCardPreference)
|
||||
.setTitle("Turn on adaptive brightness to extend battery life");
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
|
||||
verify(mBatteryTipsCardPreference).setButtonColorResourceId(R.color.color_accent_selector);
|
||||
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
|
||||
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
|
||||
// Check proto info
|
||||
verify(mBatteryTipsCardPreference).setVisible(true);
|
||||
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());
|
||||
assertThat(mCardPreference.getTitle())
|
||||
.isEqualTo("Turn on adaptive brightness to extend battery life");
|
||||
assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo("Got it");
|
||||
assertThat(mCardPreference.getSecondaryButtonText()).isEqualTo("View Settings");
|
||||
assertThat(mCardPreference.getIconResId()).isEqualTo(R.drawable.ic_battery_tips_lightbulb);
|
||||
assertThat(mCardPreference.getTintColorResId()).isEqualTo(R.color.color_accent_selector);
|
||||
assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
|
||||
assertThat(mCardPreference.getSecondaryButtonVisibility()).isTrue();
|
||||
assertCardButtonActionAndMetrics(anomalyEventWrapper);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_screenTimeoutAnomaly_showAnomaly() {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
|
||||
AnomalyEventWrapper anomalyEventWrapper =
|
||||
spy(
|
||||
new AnomalyEventWrapper(
|
||||
mContext, BatteryTestUtils.createScreenTimeoutAnomalyEvent(true)));
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(anomalyEventWrapper, false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
|
||||
verify(mBatteryTipsCardPreference).setButtonColorResourceId(R.color.color_accent_selector);
|
||||
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
|
||||
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
|
||||
verify(mBatteryTipsCardPreference).setVisible(true);
|
||||
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_SCREEN_TIMEOUT.getNumber());
|
||||
assertThat(mCardPreference.getTitle())
|
||||
.isEqualTo("Reduce screen timeout to extend battery life");
|
||||
assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo("Got it");
|
||||
assertThat(mCardPreference.getSecondaryButtonText()).isEqualTo("View Settings");
|
||||
assertThat(mCardPreference.getIconResId()).isEqualTo(R.drawable.ic_battery_tips_lightbulb);
|
||||
assertThat(mCardPreference.getTintColorResId()).isEqualTo(R.color.color_accent_selector);
|
||||
assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
|
||||
assertThat(mCardPreference.getSecondaryButtonVisibility()).isTrue();
|
||||
assertCardButtonActionAndMetrics(anomalyEventWrapper);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_screenTimeoutAnomalyHasTitle_showAnomaly() {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
|
||||
PowerAnomalyEvent anomalyEvent = BatteryTestUtils.createScreenTimeoutAnomalyEvent(true);
|
||||
String testTitle = "TestTitle";
|
||||
event =
|
||||
event.toBuilder()
|
||||
anomalyEvent =
|
||||
anomalyEvent.toBuilder()
|
||||
.setWarningBannerInfo(
|
||||
event.getWarningBannerInfo().toBuilder()
|
||||
anomalyEvent.getWarningBannerInfo().toBuilder()
|
||||
.setTitleString(testTitle)
|
||||
.build())
|
||||
.build();
|
||||
AnomalyEventWrapper anomalyEventWrapper =
|
||||
spy(new AnomalyEventWrapper(mContext, anomalyEvent));
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(anomalyEventWrapper, false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle(testTitle);
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
|
||||
verify(mBatteryTipsCardPreference).setButtonColorResourceId(R.color.color_accent_selector);
|
||||
verify(mBatteryTipsCardPreference).setMainButtonLabel("View Settings");
|
||||
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
|
||||
verify(mBatteryTipsCardPreference).setVisible(true);
|
||||
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_SCREEN_TIMEOUT.getNumber());
|
||||
assertThat(mCardPreference.getTitle()).isEqualTo(testTitle);
|
||||
assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo("Got it");
|
||||
assertThat(mCardPreference.getSecondaryButtonText()).isEqualTo("View Settings");
|
||||
assertThat(mCardPreference.getIconResId()).isEqualTo(R.drawable.ic_battery_tips_lightbulb);
|
||||
assertThat(mCardPreference.getTintColorResId()).isEqualTo(R.color.color_accent_selector);
|
||||
assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
|
||||
assertThat(mCardPreference.getSecondaryButtonVisibility()).isTrue();
|
||||
assertCardButtonActionAndMetrics(anomalyEventWrapper);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_appAnomaly_showAnomaly() {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
|
||||
AnomalyEventWrapper anomalyEventWrapper =
|
||||
spy(new AnomalyEventWrapper(mContext, BatteryTestUtils.createAppAnomalyEvent()));
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
AnomalyEventWrapper eventWrapper = new AnomalyEventWrapper(mContext, event);
|
||||
eventWrapper.setRelatedBatteryDiffEntry(new BatteryDiffEntry(mContext, "", "Chrome", 0));
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(eventWrapper, false);
|
||||
anomalyEventWrapper.setRelatedBatteryDiffEntry(
|
||||
new BatteryDiffEntry(mContext, "", "Chrome", 0));
|
||||
mBatteryTipsController.setOnAnomalyConfirmListener(
|
||||
() -> mBatteryTipsController.acceptTipsCard());
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(anomalyEventWrapper, true);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle("Chrome used more battery than usual");
|
||||
verify(mBatteryTipsCardPreference)
|
||||
.setIconResourceId(R.drawable.ic_battery_tips_warning_icon);
|
||||
verify(mBatteryTipsCardPreference)
|
||||
.setButtonColorResourceId(R.color.color_battery_anomaly_app_warning_selector);
|
||||
verify(mBatteryTipsCardPreference).setMainButtonLabel("Check");
|
||||
verify(mBatteryTipsCardPreference).setDismissButtonLabel("Got it");
|
||||
verify(mBatteryTipsCardPreference).setVisible(true);
|
||||
assertThat(mCardPreference.getTitle()).isEqualTo("Chrome used more battery than usual");
|
||||
assertThat(mCardPreference.getPrimaryButtonText()).isEqualTo("Got it");
|
||||
assertThat(mCardPreference.getSecondaryButtonText()).isEqualTo("Check");
|
||||
assertThat(mCardPreference.getIconResId())
|
||||
.isEqualTo(R.drawable.ic_battery_tips_warning_icon);
|
||||
assertThat(mCardPreference.getTintColorResId())
|
||||
.isEqualTo(R.color.color_battery_anomaly_app_warning_selector);
|
||||
assertThat(mCardPreference.getPrimaryButtonVisibility()).isTrue();
|
||||
assertThat(mCardPreference.getSecondaryButtonVisibility()).isTrue();
|
||||
assertThat(mCardPreference.isVisible()).isTrue();
|
||||
assertCardButtonActionAndMetrics(anomalyEventWrapper);
|
||||
}
|
||||
|
||||
private void assertCardButtonActionAndMetrics(final AnomalyEventWrapper anomalyEventWrapper) {
|
||||
when(anomalyEventWrapper.updateSystemSettingsIfAvailable()).thenReturn(true);
|
||||
|
||||
final int powerAnomalyKeyNumber = anomalyEventWrapper.getAnomalyKeyNumber();
|
||||
assertCardMetrics(SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, powerAnomalyKeyNumber);
|
||||
assertThat(mCardPreference.isVisible()).isTrue();
|
||||
|
||||
// Check accept button action
|
||||
mCardPreference.setVisible(true);
|
||||
mCardPreference.getSecondaryButtonAction().invoke();
|
||||
assertCardMetrics(SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, powerAnomalyKeyNumber);
|
||||
assertThat(mCardPreference.isVisible()).isFalse();
|
||||
final boolean isAppAnomalyCard = powerAnomalyKeyNumber > 1;
|
||||
verify(anomalyEventWrapper, isAppAnomalyCard ? never() : times(1))
|
||||
.updateSystemSettingsIfAvailable();
|
||||
|
||||
// Check reject button action
|
||||
mCardPreference.setVisible(true);
|
||||
mCardPreference.getPrimaryButtonAction().invoke();
|
||||
assertCardMetrics(SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, powerAnomalyKeyNumber);
|
||||
assertThat(mCardPreference.isVisible()).isFalse();
|
||||
}
|
||||
|
||||
private void assertCardMetrics(final int action, final int powerAnomalyKeyNumber) {
|
||||
verify(mFeatureFactory.metricsFeatureProvider)
|
||||
.action(
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW,
|
||||
action,
|
||||
SettingsEnums.FUELGAUGE_BATTERY_HISTORY_DETAIL,
|
||||
BatteryTipsController.ANOMALY_KEY,
|
||||
PowerAnomalyKey.KEY_APP_TOTAL_HIGHER_THAN_USUAL.getNumber());
|
||||
powerAnomalyKeyNumber);
|
||||
}
|
||||
}
|
||||
|
@@ -264,18 +264,28 @@ public class BatteryTestUtils {
|
||||
|
||||
/** Create a power anomaly event proto of screen timeout. */
|
||||
public static PowerAnomalyEvent createScreenTimeoutAnomalyEvent() {
|
||||
return createScreenTimeoutAnomalyEvent(false);
|
||||
}
|
||||
|
||||
/** Create a power anomaly event proto of screen timeout. */
|
||||
public static PowerAnomalyEvent createScreenTimeoutAnomalyEvent(boolean changeSettings) {
|
||||
WarningBannerInfo.Builder warningBannerInfoBuilder =
|
||||
WarningBannerInfo.newBuilder()
|
||||
.setMainButtonDestination(ScreenTimeoutSettings.class.getName())
|
||||
.setMainButtonSourceMetricsCategory(SettingsEnums.SCREEN_TIMEOUT)
|
||||
.setMainButtonSourceHighlightKey("60000");
|
||||
if (changeSettings) {
|
||||
warningBannerInfoBuilder
|
||||
.setMainButtonConfigSettingsName(Settings.System.SCREEN_OFF_TIMEOUT)
|
||||
.setMainButtonConfigSettingsValue(60000);
|
||||
}
|
||||
return PowerAnomalyEvent.newBuilder()
|
||||
.setEventId("ScreenTimeoutAnomaly")
|
||||
.setType(PowerAnomalyType.TYPE_SETTINGS_BANNER)
|
||||
.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(warningBannerInfoBuilder.build())
|
||||
.build();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user