App anomaly tips on PowerUsage App list
Screenshots: [in bg - banner] https://screenshot.googleplex.com/MzLC6LfX93TkkYf [in bg - hints] https://screenshot.googleplex.com/9JLXNsRiVG8arAU [in fg - banner] https://screenshot.googleplex.com/9oYbwUkeeLbQX2t [in fg - hints] https://screenshot.googleplex.com/53DTTUCUnf8rsoE [apps anomaly highlight hint + settings anomaly banner] https://screenshot.googleplex.com/8NdS2VMrSzwv2DM Bug: 291689643 Bug: 291689623 Bug: 284893240 Test: manual Change-Id: Ic02db49cb3794ef134759d9dcec5f5ef32454a95 Merged-In: Ic02db49cb3794ef134759d9dcec5f5ef32454a95 Merged-In: I7015cdf5a96d518febb160934d780ae84fe14427
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* 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.Mockito.spy;
|
||||
|
||||
import android.content.Context;
|
||||
|
||||
import com.android.settings.testutils.BatteryTestUtils;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.TimeZone;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class AnomalyEventWrapperTest {
|
||||
private AnomalyEventWrapper mAnomalyEventWrapper;
|
||||
private Context mContext;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDismissRecordKey_returnExpectedResult() {
|
||||
mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
|
||||
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
|
||||
assertThat(mAnomalyEventWrapper.getDismissRecordKey())
|
||||
.isEqualTo("KEY_BRIGHTNESS");
|
||||
|
||||
mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
|
||||
BatteryTestUtils.createScreenTimeoutAnomalyEvent());
|
||||
assertThat(mAnomalyEventWrapper.getDismissRecordKey())
|
||||
.isEqualTo("KEY_SCREEN_TIMEOUT");
|
||||
|
||||
mAnomalyEventWrapper = new AnomalyEventWrapper(mContext,
|
||||
BatteryTestUtils.createAppAnomalyEvent());
|
||||
assertThat(mAnomalyEventWrapper.getDismissRecordKey())
|
||||
.isEqualTo("KEY_APP_1");
|
||||
}
|
||||
}
|
@@ -21,6 +21,7 @@ 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;
|
||||
@@ -58,13 +59,14 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
private BatteryTipsCardPreference mBatteryTipsCardPreference;
|
||||
private PowerUsageAdvanced mPowerUsageAdvanced;
|
||||
private BatteryTipsController mBatteryTipsController;
|
||||
private BatteryChartPreferenceController mBatteryChartPreferenceController;
|
||||
|
||||
@Mock
|
||||
private View mFakeView;
|
||||
@Mock
|
||||
private BatteryChartPreferenceController mBatteryChartPreferenceController;
|
||||
@Mock
|
||||
private BatteryUsageBreakdownController mBatteryUsageBreakdownController;
|
||||
@Mock
|
||||
private BatteryDiffEntry mFakeEntry;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -73,8 +75,13 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
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 = new PowerUsageAdvanced();
|
||||
|
||||
mPowerUsageAdvanced = spy(new PowerUsageAdvanced());
|
||||
doReturn(mContext).when(mPowerUsageAdvanced).getContext();
|
||||
mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
|
||||
mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
|
||||
mPowerUsageAdvanced.mBatteryUsageBreakdownController = mBatteryUsageBreakdownController;
|
||||
@@ -82,6 +89,7 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
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
|
||||
@@ -99,7 +107,8 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
when(mFakeView.getId()).thenReturn(R.id.main_button);
|
||||
doNothing().when(mContext).startActivity(captor.capture());
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(adaptiveBrightnessAnomaly);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(
|
||||
adaptiveBrightnessAnomaly, adaptiveBrightnessAnomaly);
|
||||
mBatteryTipsCardPreference.onClick(mFakeView);
|
||||
|
||||
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
|
||||
@@ -109,25 +118,30 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
.isEqualTo(DisplaySettings.class.getName());
|
||||
assertThat(intent.getIntExtra(MetricsFeatureProvider.EXTRA_SOURCE_METRICS_CATEGORY, -1))
|
||||
.isEqualTo(SettingsEnums.DISPLAY);
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "BrightnessAnomaly");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "BrightnessAnomaly");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClick_dismissBtn_cardDismissAndLogged() {
|
||||
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);
|
||||
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(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "ScreenTimeoutAnomaly");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "ScreenTimeoutAnomaly");
|
||||
}
|
||||
@@ -137,30 +151,40 @@ public final class BatteryTipsCardPreferenceTest {
|
||||
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);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly, appsAnomaly);
|
||||
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(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_ACCEPT, "AppAnomaly");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onClick_dismissBtnOfAppsAnomaly_removeHighlightSlotIndex() {
|
||||
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);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(appsAnomaly, appsAnomaly);
|
||||
mBatteryTipsCardPreference.onClick(mFakeView);
|
||||
|
||||
assertThat(mBatteryTipsCardPreference.isVisible()).isFalse();
|
||||
verify(mContext, never()).startActivity(any(Intent.class));
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
|
||||
eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
|
||||
eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
|
||||
eq(1), eq(0));
|
||||
verify(mBatteryChartPreferenceController, never()).selectHighlightSlotIndex();
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_SHOW, "AppAnomaly");
|
||||
verify(mFeatureFactory.metricsFeatureProvider).action(
|
||||
mContext, SettingsEnums.ACTION_BATTERY_TIPS_CARD_DISMISS, "AppAnomaly");
|
||||
}
|
||||
|
@@ -16,8 +16,6 @@
|
||||
|
||||
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.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
@@ -70,30 +68,18 @@ public final class BatteryTipsControllerTest {
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_null_hidePreference() {
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(/* powerAnomalyEvents= */ null);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(/* powerAnomalyEvents= */ null, false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setVisible(false);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDismissRecordKey_returnExpectedResult() {
|
||||
assertThat(BatteryTipsController.getDismissRecordKey(
|
||||
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent()))
|
||||
.isEqualTo("KEY_BRIGHTNESS");
|
||||
assertThat(BatteryTipsController.getDismissRecordKey(
|
||||
BatteryTestUtils.createScreenTimeoutAnomalyEvent()))
|
||||
.isEqualTo("KEY_SCREEN_TIMEOUT");
|
||||
assertThat(BatteryTipsController.getDismissRecordKey(
|
||||
BatteryTestUtils.createAppAnomalyEvent()))
|
||||
.isEqualTo("KEY_APP_1");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void handleBatteryTipsCardUpdated_adaptiveBrightnessAnomaly_showAnomaly() {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
|
||||
// Check pre-defined string
|
||||
verify(mBatteryTipsCardPreference).setTitle(
|
||||
@@ -114,7 +100,8 @@ public final class BatteryTipsControllerTest {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createScreenTimeoutAnomalyEvent();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle("Reduce screen timeout to extend battery life");
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
|
||||
@@ -139,7 +126,8 @@ public final class BatteryTipsControllerTest {
|
||||
.build();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(
|
||||
new AnomalyEventWrapper(mContext, event), false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle(testTitle);
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(R.drawable.ic_battery_tips_lightbulb);
|
||||
@@ -157,10 +145,13 @@ public final class BatteryTipsControllerTest {
|
||||
PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
|
||||
when(mFeatureFactory.powerUsageFeatureProvider.isBatteryTipsEnabled()).thenReturn(true);
|
||||
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(event);
|
||||
AnomalyEventWrapper eventWrapper = new AnomalyEventWrapper(mContext, event);
|
||||
eventWrapper.setRelatedBatteryDiffEntry(
|
||||
new BatteryDiffEntry(mContext, "", "Chrome", 0));
|
||||
mBatteryTipsController.handleBatteryTipsCardUpdated(eventWrapper, false);
|
||||
|
||||
verify(mBatteryTipsCardPreference).setTitle(
|
||||
"Chrome used more battery than usual in foreground");
|
||||
"Chrome used more battery than usual");
|
||||
verify(mBatteryTipsCardPreference).setIconResourceId(
|
||||
R.drawable.ic_battery_tips_warning_icon);
|
||||
verify(mBatteryTipsCardPreference).setMainButtonStrokeColorResourceId(
|
||||
|
@@ -69,7 +69,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
@Mock
|
||||
private BatteryHistEntry mBatteryHistEntry;
|
||||
@Mock
|
||||
private PowerGaugePreference mPowerGaugePreference;
|
||||
private AnomalyAppItemPreference mAnomalyAppItemPreference;
|
||||
|
||||
private Context mContext;
|
||||
private FakeFeatureFactory mFeatureFactory;
|
||||
@@ -123,13 +123,14 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
BatteryDiffEntry.sResourceCache.put(
|
||||
"fakeBatteryDiffEntryKey",
|
||||
new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1));
|
||||
doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDestroy_clearPreferenceCacheAndPreferenceGroupRemoveAll() {
|
||||
// Ensures the testing environment is correct.
|
||||
mBatteryUsageBreakdownController.mPreferenceCache.put(
|
||||
PREF_KEY, mPowerGaugePreference);
|
||||
PREF_KEY, mAnomalyAppItemPreference);
|
||||
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).hasSize(1);
|
||||
|
||||
mBatteryUsageBreakdownController.onDestroy();
|
||||
@@ -178,7 +179,6 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
|
||||
doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
|
||||
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
|
||||
mBatteryUsageBreakdownController.addAllPreferences();
|
||||
|
||||
@@ -188,27 +188,25 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
@Test
|
||||
public void removeAndCacheAllUnusedPreferences_removePref_buildCacheAndRemoveAllPreference() {
|
||||
doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0);
|
||||
doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
|
||||
doReturn(PREF_KEY2).when(mBatteryHistEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
|
||||
// Ensures the testing data is correct.
|
||||
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
|
||||
|
||||
mBatteryUsageBreakdownController.removeAndCacheAllUnusedPreferences();
|
||||
|
||||
assertThat(mBatteryUsageBreakdownController.mPreferenceCache.get(PREF_KEY))
|
||||
.isEqualTo(mPowerGaugePreference);
|
||||
verify(mAppListPreferenceGroup).removePreference(mPowerGaugePreference);
|
||||
.isEqualTo(mAnomalyAppItemPreference);
|
||||
verify(mAppListPreferenceGroup).removePreference(mAnomalyAppItemPreference);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() {
|
||||
doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0);
|
||||
doReturn(mAnomalyAppItemPreference).when(mAppListPreferenceGroup).getPreference(0);
|
||||
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
doReturn(PREF_KEY).when(mAnomalyAppItemPreference).getKey();
|
||||
// Ensures the testing data is correct.
|
||||
assertThat(mBatteryUsageBreakdownController.mPreferenceCache).isEmpty();
|
||||
|
||||
@@ -232,10 +230,10 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
@Test
|
||||
public void handlePreferenceTreeClick_forAppEntry_returnTrue() {
|
||||
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
|
||||
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
|
||||
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
|
||||
|
||||
assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
|
||||
mPowerGaugePreference)).isTrue();
|
||||
mAnomalyAppItemPreference)).isTrue();
|
||||
verify(mMetricsFeatureProvider)
|
||||
.action(
|
||||
SettingsEnums.OPEN_BATTERY_USAGE,
|
||||
@@ -248,10 +246,10 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
@Test
|
||||
public void handlePreferenceTreeClick_forSystemEntry_returnTrue() {
|
||||
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_UID_BATTERY;
|
||||
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
|
||||
doReturn(mBatteryDiffEntry).when(mAnomalyAppItemPreference).getBatteryDiffEntry();
|
||||
|
||||
assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
|
||||
mPowerGaugePreference)).isTrue();
|
||||
mAnomalyAppItemPreference)).isTrue();
|
||||
verify(mMetricsFeatureProvider)
|
||||
.action(
|
||||
SettingsEnums.OPEN_BATTERY_USAGE,
|
||||
|
@@ -72,6 +72,7 @@ public final class ConvertUtilsTest {
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
ConvertUtils.sUsageSource = ConvertUtils.EMPTY_USAGE_SOURCE;
|
||||
when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
|
||||
|
@@ -20,8 +20,8 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
import static org.mockito.ArgumentMatchers.eq;
|
||||
import static org.mockito.ArgumentMatchers.isNull;
|
||||
import static org.mockito.ArgumentMatchers.notNull;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.times;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.Context;
|
||||
@@ -41,7 +41,9 @@ import org.robolectric.annotation.Config;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@Config(shadows = ShadowDashboardFragment.class)
|
||||
@@ -50,6 +52,9 @@ public final class PowerUsageAdvancedTest {
|
||||
private Context mContext;
|
||||
private PowerUsageAdvanced mPowerUsageAdvanced;
|
||||
|
||||
private Predicate<PowerAnomalyEvent> mCardFilterPredicate;
|
||||
private Predicate<PowerAnomalyEvent> mSlotFilterPredicate;
|
||||
|
||||
@Mock
|
||||
private BatteryTipsController mBatteryTipsController;
|
||||
@Mock
|
||||
@@ -65,7 +70,7 @@ public final class PowerUsageAdvancedTest {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
|
||||
mPowerUsageAdvanced = new PowerUsageAdvanced();
|
||||
mPowerUsageAdvanced = spy(new PowerUsageAdvanced());
|
||||
mPowerUsageAdvanced.mBatteryTipsController = mBatteryTipsController;
|
||||
mPowerUsageAdvanced.mBatteryChartPreferenceController = mBatteryChartPreferenceController;
|
||||
mPowerUsageAdvanced.mScreenOnTimeController = mScreenOnTimeController;
|
||||
@@ -74,43 +79,63 @@ public final class PowerUsageAdvancedTest {
|
||||
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(mContext).when(mPowerUsageAdvanced).getContext();
|
||||
mSlotFilterPredicate = PowerAnomalyEvent::hasWarningItemInfo;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestScoreAnomalyEvent_withEmptyOrNullList_getNull() {
|
||||
assertThat(PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, null)).isNull();
|
||||
assertThat(PowerUsageAdvanced.getHighestScoreAnomalyEvent(
|
||||
mContext, BatteryTestUtils.createEmptyPowerAnomalyEventList())).isNull();
|
||||
public void getFilterAnomalyEvent_withEmptyOrNullList_getNull() {
|
||||
prepareCardFilterPredicate(null);
|
||||
assertThat(PowerUsageAdvanced
|
||||
.getAnomalyEvent(null, mCardFilterPredicate)).isNull();
|
||||
assertThat(PowerUsageAdvanced
|
||||
.getAnomalyEvent(null, mSlotFilterPredicate)).isNull();
|
||||
assertThat(PowerUsageAdvanced.getAnomalyEvent(
|
||||
BatteryTestUtils.createEmptyPowerAnomalyEventList(), mCardFilterPredicate))
|
||||
.isNull();
|
||||
assertThat(PowerUsageAdvanced.getAnomalyEvent(
|
||||
BatteryTestUtils.createEmptyPowerAnomalyEventList(), mSlotFilterPredicate))
|
||||
.isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestScoreAnomalyEvent_withoutDismissed_getHighestScoreEvent() {
|
||||
public void getFilterAnomalyEvent_withoutDismissed_getHighestScoreEvent() {
|
||||
final PowerAnomalyEventList powerAnomalyEventList =
|
||||
BatteryTestUtils.createNonEmptyPowerAnomalyEventList();
|
||||
|
||||
final PowerAnomalyEvent highestScoreEvent =
|
||||
PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, powerAnomalyEventList);
|
||||
final PowerAnomalyEvent slotEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mSlotFilterPredicate);
|
||||
prepareCardFilterPredicate(slotEvent);
|
||||
final PowerAnomalyEvent cardEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mCardFilterPredicate);
|
||||
|
||||
assertThat(highestScoreEvent)
|
||||
.isEqualTo(BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
|
||||
assertThat(cardEvent).isEqualTo(BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent());
|
||||
assertThat(slotEvent).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestScoreAnomalyEvent_withBrightnessDismissed_getScreenTimeout() {
|
||||
public void getFilterAnomalyEvent_withBrightnessDismissed_getScreenTimeout() {
|
||||
final PowerAnomalyEventList powerAnomalyEventList =
|
||||
BatteryTestUtils.createNonEmptyPowerAnomalyEventList();
|
||||
DatabaseUtils.removeDismissedPowerAnomalyKeys(mContext);
|
||||
DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, PowerAnomalyKey.KEY_BRIGHTNESS.name());
|
||||
|
||||
final PowerAnomalyEvent highestScoreEvent =
|
||||
PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, powerAnomalyEventList);
|
||||
final PowerAnomalyEvent slotEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mSlotFilterPredicate);
|
||||
prepareCardFilterPredicate(slotEvent);
|
||||
final PowerAnomalyEvent cardEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mCardFilterPredicate);
|
||||
|
||||
assertThat(highestScoreEvent)
|
||||
.isEqualTo(BatteryTestUtils.createScreenTimeoutAnomalyEvent());
|
||||
assertThat(cardEvent).isEqualTo(BatteryTestUtils.createScreenTimeoutAnomalyEvent());
|
||||
assertThat(slotEvent).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHighestScoreAnomalyEvent_withAllDismissed_getNull() {
|
||||
public void getFilterAnomalyEvent_withAllDismissed_getNull() {
|
||||
final PowerAnomalyEventList powerAnomalyEventList =
|
||||
BatteryTestUtils.createNonEmptyPowerAnomalyEventList();
|
||||
DatabaseUtils.removeDismissedPowerAnomalyKeys(mContext);
|
||||
@@ -118,20 +143,26 @@ public final class PowerUsageAdvancedTest {
|
||||
DatabaseUtils.setDismissedPowerAnomalyKeys(mContext, key.name());
|
||||
}
|
||||
|
||||
final PowerAnomalyEvent highestScoreEvent =
|
||||
PowerUsageAdvanced.getHighestScoreAnomalyEvent(mContext, powerAnomalyEventList);
|
||||
final PowerAnomalyEvent slotEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mSlotFilterPredicate);
|
||||
prepareCardFilterPredicate(slotEvent);
|
||||
final PowerAnomalyEvent cardEvent =
|
||||
PowerUsageAdvanced.getAnomalyEvent(powerAnomalyEventList,
|
||||
mCardFilterPredicate);
|
||||
|
||||
assertThat(highestScoreEvent).isNull();
|
||||
assertThat(cardEvent).isNull();
|
||||
assertThat(slotEvent).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDisplayAnomalyEventUpdated_withSettingsAnomalyEvent_skipHighlightSlotEffect() {
|
||||
final PowerAnomalyEvent event = BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event, event);
|
||||
|
||||
assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
|
||||
verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
|
||||
assertThat(mPowerUsageAdvanced.mHighlightEventWrapper.get().getEventId())
|
||||
.isEqualTo(event.getEventId());
|
||||
verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
|
||||
verify(mPowerUsageAdvanced.mBatteryTipsController).setOnAnomalyRejectListener(isNull());
|
||||
verify(mPowerUsageAdvanced.mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
|
||||
@@ -140,46 +171,44 @@ public final class PowerUsageAdvancedTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDisplayAnomalyEventUpdated_withAppAnomalyEvent_setHighlightSlotEffect() {
|
||||
public void onDisplayAnomalyEventUpdated_onlyAppAnomalyEvent_setHighlightSlotEffect() {
|
||||
final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event, event);
|
||||
|
||||
assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isEqualTo(event);
|
||||
verify(mBatteryTipsController).handleBatteryTipsCardUpdated(eq(event));
|
||||
assertThat(mPowerUsageAdvanced.mHighlightEventWrapper.get().getEventId())
|
||||
.isEqualTo(event.getEventId());
|
||||
verify(mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
|
||||
verify(mBatteryTipsController).setOnAnomalyRejectListener(isNull());
|
||||
|
||||
assertThat(event.getWarningItemInfo().hasStartTimestamp()).isTrue();
|
||||
assertThat(event.getWarningItemInfo().hasEndTimestamp()).isTrue();
|
||||
assertThat(mPowerUsageAdvanced.mBatteryLevelData.get().getIndexByTimestamps(
|
||||
event.getWarningItemInfo().getStartTimestamp(),
|
||||
event.getWarningItemInfo().getEndTimestamp()
|
||||
)).isEqualTo(Pair.create(1, 0));
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
|
||||
verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
|
||||
verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onDisplayAnomalyEventUpdated_withNull_removeHighlightSlotEffect() {
|
||||
final PowerAnomalyEvent event = BatteryTestUtils.createAppAnomalyEvent();
|
||||
public void onDisplayAnomalyEventUpdated_withSettingsCardAndAppsSlotEvent_showExpected() {
|
||||
final PowerAnomalyEvent settingsEvent =
|
||||
BatteryTestUtils.createAdaptiveBrightnessAnomalyEvent();
|
||||
final PowerAnomalyEvent appsEvent =
|
||||
BatteryTestUtils.createAppAnomalyEvent();
|
||||
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(event);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(null);
|
||||
mPowerUsageAdvanced.onDisplayAnomalyEventUpdated(settingsEvent, appsEvent);
|
||||
|
||||
assertThat(mPowerUsageAdvanced.mPowerAnomalyEvent).isNull();
|
||||
verify(mBatteryTipsController, times(2))
|
||||
.setOnAnomalyConfirmListener(isNull());
|
||||
verify(mBatteryTipsController, times(2))
|
||||
.setOnAnomalyRejectListener(isNull());
|
||||
verify(mBatteryTipsController).setOnAnomalyConfirmListener(notNull());
|
||||
verify(mBatteryTipsController).setOnAnomalyRejectListener(notNull());
|
||||
|
||||
verify(mBatteryChartPreferenceController)
|
||||
.onHighlightSlotIndexUpdate(eq(1), eq(0));
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(
|
||||
eq(BatteryChartViewModel.SELECTED_INDEX_INVALID),
|
||||
eq(BatteryChartViewModel.SELECTED_INDEX_INVALID));
|
||||
assertThat(mPowerUsageAdvanced.mHighlightEventWrapper.get().getEventId())
|
||||
.isEqualTo(appsEvent.getEventId());
|
||||
verify(mBatteryChartPreferenceController).onHighlightSlotIndexUpdate(eq(1), eq(0));
|
||||
verify(mBatteryTipsController).setOnAnomalyConfirmListener(isNull());
|
||||
verify(mBatteryTipsController).setOnAnomalyRejectListener(isNull());
|
||||
}
|
||||
}
|
||||
|
||||
private void prepareCardFilterPredicate(PowerAnomalyEvent slotEvent) {
|
||||
final Set<String> dismissedPowerAnomalyKeys =
|
||||
DatabaseUtils.getDismissedPowerAnomalyKeys(mContext);
|
||||
mCardFilterPredicate = event -> !dismissedPowerAnomalyKeys.contains(
|
||||
event.getDismissRecordKey())
|
||||
&& (event.equals(slotEvent) || !event.hasWarningItemInfo());
|
||||
}
|
||||
}
|
@@ -247,6 +247,7 @@ public class BatteryTestUtils {
|
||||
.setEventId("BrightnessAnomaly")
|
||||
.setType(PowerAnomalyType.TYPE_SETTINGS_BANNER)
|
||||
.setKey(PowerAnomalyKey.KEY_BRIGHTNESS)
|
||||
.setDismissRecordKey(PowerAnomalyKey.KEY_BRIGHTNESS.name())
|
||||
.setScore(1.2f)
|
||||
.setWarningBannerInfo(WarningBannerInfo.newBuilder()
|
||||
.setMainButtonDestination(DisplaySettings.class.getName())
|
||||
@@ -264,6 +265,7 @@ public class BatteryTestUtils {
|
||||
.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())
|
||||
@@ -280,15 +282,12 @@ public class BatteryTestUtils {
|
||||
return PowerAnomalyEvent.newBuilder()
|
||||
.setEventId("AppAnomaly")
|
||||
.setType(PowerAnomalyType.TYPE_APPS_ITEM)
|
||||
.setKey(PowerAnomalyKey.KEY_APP)
|
||||
.setKey(PowerAnomalyKey.KEY_APP_TOTAL_HIGHER_THAN_USUAL)
|
||||
.setDismissRecordKey("KEY_APP_1")
|
||||
.setScore(2.0f)
|
||||
.setWarningItemInfo(WarningItemInfo.newBuilder()
|
||||
.setDismissRecordKey("KEY_APP_1")
|
||||
.setStartTimestamp(1694361600000L) // 2023-09-11 00:00:00
|
||||
.setEndTimestamp(1694368800000L) // 2023-09-11 02:00:00
|
||||
.setTitleString("Chrome used more battery than usual in foreground")
|
||||
.setMainButtonString("Check")
|
||||
.setCancelButtonString("Got it")
|
||||
.build())
|
||||
.build();
|
||||
}
|
||||
|
Reference in New Issue
Block a user