| /* |
| * Copyright (C) 2021 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 static com.google.common.truth.Truth.assertThat; |
| |
| import static org.mockito.ArgumentMatchers.any; |
| import static org.mockito.Matchers.anyInt; |
| import static org.mockito.Matchers.anyLong; |
| 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.ContentValues; |
| import android.content.pm.PackageManager; |
| import android.content.res.Configuration; |
| import android.content.res.Resources; |
| import android.graphics.drawable.Drawable; |
| import android.os.Bundle; |
| import android.os.LocaleList; |
| import android.text.format.DateUtils; |
| import android.util.Pair; |
| |
| import androidx.preference.Preference; |
| import androidx.preference.PreferenceCategory; |
| import androidx.preference.PreferenceGroup; |
| |
| import com.android.settings.R; |
| import com.android.settings.SettingsActivity; |
| import com.android.settings.core.InstrumentedPreferenceFragment; |
| 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.Arrays; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Locale; |
| import java.util.List; |
| import java.util.Map; |
| |
| @RunWith(RobolectricTestRunner.class) |
| public final class BatteryChartPreferenceControllerTest { |
| private static final String PREF_KEY = "pref_key"; |
| private static final String PREF_SUMMARY = "fake preference summary"; |
| private static final int DESIRED_HISTORY_SIZE = |
| BatteryChartPreferenceController.DESIRED_HISTORY_SIZE; |
| |
| @Mock private InstrumentedPreferenceFragment mFragment; |
| @Mock private SettingsActivity mSettingsActivity; |
| @Mock private PreferenceGroup mAppListGroup; |
| @Mock private PackageManager mPackageManager; |
| @Mock private Drawable mDrawable; |
| @Mock private BatteryHistEntry mBatteryHistEntry; |
| @Mock private BatteryChartView mBatteryChartView; |
| @Mock private PowerGaugePreference mPowerGaugePreference; |
| @Mock private ExpandDividerPreference mExpandDividerPreference; |
| @Mock private BatteryUtils mBatteryUtils; |
| @Mock private Configuration mConfiguration; |
| @Mock private Resources mResources; |
| |
| private Context mContext; |
| private FakeFeatureFactory mFeatureFactory; |
| private BatteryDiffEntry mBatteryDiffEntry; |
| private MetricsFeatureProvider mMetricsFeatureProvider; |
| private BatteryChartPreferenceController mBatteryChartPreferenceController; |
| |
| @Before |
| public void setUp() { |
| MockitoAnnotations.initMocks(this); |
| Locale.setDefault(new Locale("en_US")); |
| org.robolectric.shadows.ShadowSettings.set24HourTimeFormat(false); |
| mFeatureFactory = FakeFeatureFactory.setupForTest(); |
| mMetricsFeatureProvider = mFeatureFactory.metricsFeatureProvider; |
| mContext = spy(RuntimeEnvironment.application); |
| final Resources resources = spy(mContext.getResources()); |
| resources.getConfiguration().setLocales(new LocaleList(new Locale("en_US"))); |
| doReturn(resources).when(mContext).getResources(); |
| doReturn(new String[] {"com.android.googlequicksearchbox"}) |
| .when(resources).getTextArray(R.array.allowlist_hide_summary_in_battery_usage); |
| mBatteryChartPreferenceController = createController(); |
| mBatteryChartPreferenceController.mPrefContext = mContext; |
| mBatteryChartPreferenceController.mAppListPrefGroup = mAppListGroup; |
| mBatteryChartPreferenceController.mBatteryChartView = mBatteryChartView; |
| mBatteryDiffEntry = new BatteryDiffEntry( |
| mContext, |
| /*foregroundUsageTimeInMs=*/ 1, |
| /*backgroundUsageTimeInMs=*/ 2, |
| /*consumePower=*/ 3, |
| mBatteryHistEntry); |
| mBatteryDiffEntry = spy(mBatteryDiffEntry); |
| // Adds fake testing data. |
| BatteryDiffEntry.sResourceCache.put( |
| "fakeBatteryDiffEntryKey", |
| new BatteryEntry.NameAndIcon("fakeName", /*icon=*/ null, /*iconId=*/ 1)); |
| mBatteryChartPreferenceController.setBatteryHistoryMap( |
| createBatteryHistoryMap()); |
| } |
| |
| @Test |
| public void testOnDestroy_activityIsChanging_clearBatteryEntryCache() { |
| doReturn(true).when(mSettingsActivity).isChangingConfigurations(); |
| // Ensures the testing environment is correct. |
| assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); |
| |
| mBatteryChartPreferenceController.onDestroy(); |
| assertThat(BatteryDiffEntry.sResourceCache).isEmpty(); |
| } |
| |
| @Test |
| public void testOnDestroy_activityIsNotChanging_notClearBatteryEntryCache() { |
| doReturn(false).when(mSettingsActivity).isChangingConfigurations(); |
| // Ensures the testing environment is correct. |
| assertThat(BatteryDiffEntry.sResourceCache).hasSize(1); |
| |
| mBatteryChartPreferenceController.onDestroy(); |
| assertThat(BatteryDiffEntry.sResourceCache).isNotEmpty(); |
| } |
| |
| @Test |
| public void testOnDestroy_clearPreferenceCache() { |
| // Ensures the testing environment is correct. |
| mBatteryChartPreferenceController.mPreferenceCache.put( |
| PREF_KEY, mPowerGaugePreference); |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); |
| |
| mBatteryChartPreferenceController.onDestroy(); |
| // Verifies the result after onDestroy. |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); |
| } |
| |
| @Test |
| public void testOnDestroy_removeAllPreferenceFromPreferenceGroup() { |
| mBatteryChartPreferenceController.onDestroy(); |
| verify(mAppListGroup).removeAll(); |
| } |
| |
| @Test |
| public void testSetBatteryHistoryMap_createExpectedKeysAndLevels() { |
| mBatteryChartPreferenceController.setBatteryHistoryMap( |
| createBatteryHistoryMap()); |
| |
| // Verifies the created battery keys array. |
| for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) { |
| assertThat(mBatteryChartPreferenceController.mBatteryHistoryKeys[index]) |
| // These values is are calculated by hand from createBatteryHistoryMap(). |
| .isEqualTo(index + 1); |
| } |
| // Verifies the created battery levels array. |
| for (int index = 0; index < 13; index++) { |
| assertThat(mBatteryChartPreferenceController.mBatteryHistoryLevels[index]) |
| // These values is are calculated by hand from createBatteryHistoryMap(). |
| .isEqualTo(100 - index * 2); |
| } |
| assertThat(mBatteryChartPreferenceController.mBatteryIndexedMap).hasSize(13); |
| } |
| |
| @Test |
| public void testSetBatteryHistoryMap_largeSize_createExpectedKeysAndLevels() { |
| mBatteryChartPreferenceController.setBatteryHistoryMap( |
| createBatteryHistoryMap()); |
| |
| // Verifies the created battery keys array. |
| for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) { |
| assertThat(mBatteryChartPreferenceController.mBatteryHistoryKeys[index]) |
| // These values is are calculated by hand from createBatteryHistoryMap(). |
| .isEqualTo(index + 1); |
| } |
| // Verifies the created battery levels array. |
| for (int index = 0; index < 13; index++) { |
| assertThat(mBatteryChartPreferenceController.mBatteryHistoryLevels[index]) |
| // These values is are calculated by hand from createBatteryHistoryMap(). |
| .isEqualTo(100 - index * 2); |
| } |
| assertThat(mBatteryChartPreferenceController.mBatteryIndexedMap).hasSize(13); |
| } |
| |
| @Test |
| public void testRefreshUi_batteryIndexedMapIsNull_ignoreRefresh() { |
| mBatteryChartPreferenceController.setBatteryHistoryMap(null); |
| assertThat(mBatteryChartPreferenceController.refreshUi( |
| /*trapezoidIndex=*/ 1, /*isForce=*/ false)).isFalse(); |
| } |
| |
| @Test |
| public void testRefreshUi_batteryChartViewIsNull_ignoreRefresh() { |
| mBatteryChartPreferenceController.mBatteryChartView = null; |
| assertThat(mBatteryChartPreferenceController.refreshUi( |
| /*trapezoidIndex=*/ 1, /*isForce=*/ false)).isFalse(); |
| } |
| |
| @Test |
| public void testRefreshUi_trapezoidIndexIsNotChanged_ignoreRefresh() { |
| final int trapezoidIndex = 1; |
| mBatteryChartPreferenceController.mTrapezoidIndex = trapezoidIndex; |
| assertThat(mBatteryChartPreferenceController.refreshUi( |
| trapezoidIndex, /*isForce=*/ false)).isFalse(); |
| } |
| |
| @Test |
| public void testRefreshUi_forceUpdate_refreshUi() { |
| final int trapezoidIndex = 1; |
| mBatteryChartPreferenceController.mTrapezoidIndex = trapezoidIndex; |
| assertThat(mBatteryChartPreferenceController.refreshUi( |
| trapezoidIndex, /*isForce=*/ true)).isTrue(); |
| } |
| |
| @Test |
| public void testForceRefreshUi_updateTrapezoidIndexIntoSelectAll() { |
| mBatteryChartPreferenceController.mTrapezoidIndex = |
| BatteryChartView.SELECTED_INDEX_INVALID; |
| mBatteryChartPreferenceController.setBatteryHistoryMap( |
| createBatteryHistoryMap()); |
| |
| assertThat(mBatteryChartPreferenceController.mTrapezoidIndex) |
| .isEqualTo(BatteryChartView.SELECTED_INDEX_ALL); |
| } |
| |
| @Test |
| public void testRemoveAndCacheAllPrefs_emptyContent_ignoreRemoveAll() { |
| final int trapezoidIndex = 1; |
| doReturn(0).when(mAppListGroup).getPreferenceCount(); |
| |
| mBatteryChartPreferenceController.refreshUi( |
| trapezoidIndex, /*isForce=*/ true); |
| verify(mAppListGroup, never()).removeAll(); |
| } |
| |
| @Test |
| public void testRemoveAndCacheAllPrefs_buildCacheAndRemoveAllPreference() { |
| final int trapezoidIndex = 1; |
| doReturn(1).when(mAppListGroup).getPreferenceCount(); |
| doReturn(mPowerGaugePreference).when(mAppListGroup).getPreference(0); |
| doReturn(PREF_KEY).when(mPowerGaugePreference).getKey(); |
| // Ensures the testing data is correct. |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); |
| |
| mBatteryChartPreferenceController.refreshUi( |
| trapezoidIndex, /*isForce=*/ true); |
| |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache.get(PREF_KEY)) |
| .isEqualTo(mPowerGaugePreference); |
| verify(mAppListGroup).removeAll(); |
| } |
| |
| @Test |
| public void testAddPreferenceToScreen_emptyContent_ignoreAddPreference() { |
| mBatteryChartPreferenceController.addPreferenceToScreen( |
| new ArrayList<BatteryDiffEntry>()); |
| verify(mAppListGroup, never()).addPreference(any()); |
| } |
| |
| @Test |
| public void testAddPreferenceToScreen_addPreferenceIntoScreen() { |
| final String appLabel = "fake app label"; |
| doReturn(1).when(mAppListGroup).getPreferenceCount(); |
| doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); |
| doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); |
| doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); |
| doReturn(null).when(mAppListGroup).findPreference(PREF_KEY); |
| doReturn(false).when(mBatteryDiffEntry).validForRestriction(); |
| |
| mBatteryChartPreferenceController.addPreferenceToScreen( |
| Arrays.asList(mBatteryDiffEntry)); |
| |
| // Verifies the preference cache. |
| final PowerGaugePreference pref = |
| (PowerGaugePreference) mBatteryChartPreferenceController.mPreferenceCache |
| .get(PREF_KEY); |
| assertThat(pref).isNotNull(); |
| // Verifies the added preference configuration. |
| verify(mAppListGroup).addPreference(pref); |
| assertThat(pref.getKey()).isEqualTo(PREF_KEY); |
| assertThat(pref.getTitle()).isEqualTo(appLabel); |
| assertThat(pref.getIcon()).isEqualTo(mDrawable); |
| assertThat(pref.getOrder()).isEqualTo(1); |
| assertThat(pref.getBatteryDiffEntry()).isSameInstanceAs(mBatteryDiffEntry); |
| assertThat(pref.isSingleLineTitle()).isTrue(); |
| assertThat(pref.isEnabled()).isFalse(); |
| } |
| |
| @Test |
| public void testAddPreferenceToScreen_alreadyInScreen_notAddPreferenceAgain() { |
| final String appLabel = "fake app label"; |
| doReturn(1).when(mAppListGroup).getPreferenceCount(); |
| doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); |
| doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel(); |
| doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); |
| doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY); |
| |
| mBatteryChartPreferenceController.addPreferenceToScreen( |
| Arrays.asList(mBatteryDiffEntry)); |
| |
| verify(mAppListGroup, never()).addPreference(any()); |
| } |
| |
| @Test |
| public void testHandlePreferenceTreeiClick_notPowerGaugePreference_returnFalse() { |
| assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick(mAppListGroup)) |
| .isFalse(); |
| |
| verify(mMetricsFeatureProvider, never()) |
| .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM); |
| verify(mMetricsFeatureProvider, never()) |
| .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM); |
| } |
| |
| @Test |
| public void testHandlePreferenceTreeClick_forAppEntry_returnTrue() { |
| doReturn(false).when(mBatteryHistEntry).isAppEntry(); |
| doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry(); |
| |
| assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick( |
| mPowerGaugePreference)).isTrue(); |
| verify(mMetricsFeatureProvider) |
| .action( |
| mContext, |
| SettingsEnums.ACTION_BATTERY_USAGE_SYSTEM_ITEM, |
| (Pair<Integer, Object>[]) new Pair[] { |
| new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null), |
| new Pair(ConvertUtils.METRIC_KEY_BATTERY_LEVEL, 0), |
| new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, null) |
| }); |
| } |
| |
| @Test |
| public void testHandlePreferenceTreeClick_forSystemEntry_returnTrue() { |
| mBatteryChartPreferenceController.mBatteryUtils = mBatteryUtils; |
| doReturn(true).when(mBatteryHistEntry).isAppEntry(); |
| doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry(); |
| |
| assertThat(mBatteryChartPreferenceController.handlePreferenceTreeClick( |
| mPowerGaugePreference)).isTrue(); |
| verify(mMetricsFeatureProvider) |
| .action( |
| mContext, |
| SettingsEnums.ACTION_BATTERY_USAGE_APP_ITEM, |
| (Pair<Integer, Object>[]) new Pair[] { |
| new Pair(ConvertUtils.METRIC_KEY_PACKAGE, null), |
| new Pair(ConvertUtils.METRIC_KEY_BATTERY_LEVEL, 0), |
| new Pair(ConvertUtils.METRIC_KEY_BATTERY_USAGE, null) |
| }); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_setNullContentIfTotalUsageTimeIsZero() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary( |
| pref, createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ 0, |
| /*backgroundUsageTimeInMs=*/ 0)); |
| assertThat(pref.getSummary()).isNull(); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_setBackgroundUsageTimeOnly() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary( |
| pref, createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ 0, |
| /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); |
| assertThat(pref.getSummary()).isEqualTo("Background: 1 min"); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_setTotalUsageTimeLessThanAMinute() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary( |
| pref, createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ 100, |
| /*backgroundUsageTimeInMs=*/ 200)); |
| assertThat(pref.getSummary()).isEqualTo("Total: less than a min"); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_setTotalTimeIfBackgroundTimeLessThanAMinute() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary( |
| pref, createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, |
| /*backgroundUsageTimeInMs=*/ 200)); |
| assertThat(pref.getSummary()) |
| .isEqualTo("Total: 1 min\nBackground: less than a min"); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_setTotalAndBackgroundUsageTime() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary( |
| pref, createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, |
| /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); |
| assertThat(pref.getSummary()).isEqualTo("Total: 2 min\nBackground: 1 min"); |
| } |
| |
| @Test |
| public void testSetPreferenceSummary_notAllowShownPackage_setSummayAsNull() { |
| final PowerGaugePreference pref = new PowerGaugePreference(mContext); |
| pref.setSummary(PREF_SUMMARY); |
| final BatteryDiffEntry batteryDiffEntry = |
| spy(createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, |
| /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS)); |
| doReturn("com.android.googlequicksearchbox").when(batteryDiffEntry) |
| .getPackageName(); |
| |
| mBatteryChartPreferenceController.setPreferenceSummary(pref, batteryDiffEntry); |
| assertThat(pref.getSummary()).isNull(); |
| } |
| |
| @Test |
| public void testValidateUsageTime_returnTrueIfBatteryDiffEntryIsValid() { |
| assertThat(BatteryChartPreferenceController.validateUsageTime( |
| createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS, |
| /*backgroundUsageTimeInMs=*/ DateUtils.MINUTE_IN_MILLIS))) |
| .isTrue(); |
| } |
| |
| @Test |
| public void testValidateUsageTime_foregroundTimeExceedThreshold_returnFalse() { |
| assertThat(BatteryChartPreferenceController.validateUsageTime( |
| createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ DateUtils.HOUR_IN_MILLIS * 3, |
| /*backgroundUsageTimeInMs=*/ 0))) |
| .isFalse(); |
| } |
| |
| @Test |
| public void testValidateUsageTime_backgroundTimeExceedThreshold_returnFalse() { |
| assertThat(BatteryChartPreferenceController.validateUsageTime( |
| createBatteryDiffEntry( |
| /*foregroundUsageTimeInMs=*/ 0, |
| /*backgroundUsageTimeInMs=*/ DateUtils.HOUR_IN_MILLIS * 3))) |
| .isFalse(); |
| } |
| |
| @Test |
| public void testOnExpand_expandedIsTrue_addSystemEntriesToPreferenceGroup() { |
| doReturn(1).when(mAppListGroup).getPreferenceCount(); |
| mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); |
| doReturn("label").when(mBatteryDiffEntry).getAppLabel(); |
| doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon(); |
| doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); |
| |
| mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ true); |
| |
| final ArgumentCaptor<Preference> captor = ArgumentCaptor.forClass(Preference.class); |
| verify(mAppListGroup).addPreference(captor.capture()); |
| // Verifies the added preference. |
| assertThat(captor.getValue().getKey()).isEqualTo(PREF_KEY); |
| verify(mMetricsFeatureProvider) |
| .action( |
| mContext, |
| SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM, |
| true /*isExpanded*/); |
| } |
| |
| @Test |
| public void testOnExpand_expandedIsFalse_removeSystemEntriesFromPreferenceGroup() { |
| doReturn(PREF_KEY).when(mBatteryHistEntry).getKey(); |
| doReturn(mPowerGaugePreference).when(mAppListGroup).findPreference(PREF_KEY); |
| mBatteryChartPreferenceController.mSystemEntries.add(mBatteryDiffEntry); |
| // Verifies the cache is empty first. |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache).isEmpty(); |
| |
| mBatteryChartPreferenceController.onExpand(/*isExpanded=*/ false); |
| |
| verify(mAppListGroup).findPreference(PREF_KEY); |
| verify(mAppListGroup).removePreference(mPowerGaugePreference); |
| assertThat(mBatteryChartPreferenceController.mPreferenceCache).hasSize(1); |
| verify(mMetricsFeatureProvider) |
| .action( |
| mContext, |
| SettingsEnums.ACTION_BATTERY_USAGE_EXPAND_ITEM, |
| false /*isExpanded*/); |
| } |
| |
| @Test |
| public void testOnSelect_selectSpecificTimeSlot_logMetric() { |
| mBatteryChartPreferenceController.onSelect(1 /*slot index*/); |
| |
| verify(mMetricsFeatureProvider) |
| .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_TIME_SLOT); |
| } |
| |
| @Test |
| public void testOnSelect_selectAll_logMetric() { |
| mBatteryChartPreferenceController.onSelect( |
| BatteryChartView.SELECTED_INDEX_ALL /*slot index*/); |
| |
| verify(mMetricsFeatureProvider) |
| .action(mContext, SettingsEnums.ACTION_BATTERY_USAGE_SHOW_ALL); |
| } |
| |
| @Test |
| public void testRefreshCategoryTitle_setHourIntoBothTitleTextView() { |
| mBatteryChartPreferenceController = createController(); |
| setUpBatteryHistoryKeys(); |
| mBatteryChartPreferenceController.mAppListPrefGroup = |
| spy(new PreferenceCategory(mContext)); |
| mBatteryChartPreferenceController.mExpandDividerPreference = |
| spy(new ExpandDividerPreference(mContext)); |
| // Simulates select the first slot. |
| mBatteryChartPreferenceController.mTrapezoidIndex = 0; |
| |
| mBatteryChartPreferenceController.refreshCategoryTitle(); |
| |
| ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); |
| // Verifies the title in the preference group. |
| verify(mBatteryChartPreferenceController.mAppListPrefGroup) |
| .setTitle(captor.capture()); |
| assertThat(captor.getValue()).isNotEqualTo("App usage for past 24 hr"); |
| // Verifies the title in the expandable divider. |
| captor = ArgumentCaptor.forClass(String.class); |
| verify(mBatteryChartPreferenceController.mExpandDividerPreference) |
| .setTitle(captor.capture()); |
| assertThat(captor.getValue()).isNotEqualTo("System usage for past 24 hr"); |
| } |
| |
| @Test |
| public void testRefreshCategoryTitle_setLast24HrIntoBothTitleTextView() { |
| mBatteryChartPreferenceController = createController(); |
| mBatteryChartPreferenceController.mAppListPrefGroup = |
| spy(new PreferenceCategory(mContext)); |
| mBatteryChartPreferenceController.mExpandDividerPreference = |
| spy(new ExpandDividerPreference(mContext)); |
| // Simulates select all condition. |
| mBatteryChartPreferenceController.mTrapezoidIndex = |
| BatteryChartView.SELECTED_INDEX_ALL; |
| |
| mBatteryChartPreferenceController.refreshCategoryTitle(); |
| |
| ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class); |
| // Verifies the title in the preference group. |
| verify(mBatteryChartPreferenceController.mAppListPrefGroup) |
| .setTitle(captor.capture()); |
| assertThat(captor.getValue()) |
| .isEqualTo("App usage for past 24 hr"); |
| // Verifies the title in the expandable divider. |
| captor = ArgumentCaptor.forClass(String.class); |
| verify(mBatteryChartPreferenceController.mExpandDividerPreference) |
| .setTitle(captor.capture()); |
| assertThat(captor.getValue()) |
| .isEqualTo("System usage for past 24 hr"); |
| } |
| |
| @Test |
| public void testSetTimestampLabel_nullBatteryHistoryKeys_ignore() { |
| mBatteryChartPreferenceController = createController(); |
| mBatteryChartPreferenceController.mBatteryHistoryKeys = null; |
| mBatteryChartPreferenceController.mBatteryChartView = |
| spy(new BatteryChartView(mContext)); |
| mBatteryChartPreferenceController.setTimestampLabel(); |
| |
| verify(mBatteryChartPreferenceController.mBatteryChartView, never()) |
| .setLatestTimestamp(anyLong()); |
| } |
| |
| @Test |
| public void testSetTimestampLabel_setExpectedTimestampData() { |
| mBatteryChartPreferenceController = createController(); |
| mBatteryChartPreferenceController.mBatteryChartView = |
| spy(new BatteryChartView(mContext)); |
| setUpBatteryHistoryKeys(); |
| |
| mBatteryChartPreferenceController.setTimestampLabel(); |
| |
| verify(mBatteryChartPreferenceController.mBatteryChartView) |
| .setLatestTimestamp(1619247636826L); |
| } |
| |
| @Test |
| public void testSetTimestampLabel_withoutValidTimestamp_setExpectedTimestampData() { |
| mBatteryChartPreferenceController = createController(); |
| mBatteryChartPreferenceController.mBatteryChartView = |
| spy(new BatteryChartView(mContext)); |
| mBatteryChartPreferenceController.mBatteryHistoryKeys = new long[] {0L}; |
| |
| mBatteryChartPreferenceController.setTimestampLabel(); |
| |
| verify(mBatteryChartPreferenceController.mBatteryChartView) |
| .setLatestTimestamp(anyLong()); |
| } |
| |
| @Test |
| public void testOnSaveInstanceState_restoreSelectedIndexAndExpandState() { |
| final int expectedIndex = 1; |
| final boolean isExpanded = true; |
| final Bundle bundle = new Bundle(); |
| mBatteryChartPreferenceController.mTrapezoidIndex = expectedIndex; |
| mBatteryChartPreferenceController.mIsExpanded = isExpanded; |
| mBatteryChartPreferenceController.onSaveInstanceState(bundle); |
| // Replaces the original controller with other values. |
| mBatteryChartPreferenceController.mTrapezoidIndex = -1; |
| mBatteryChartPreferenceController.mIsExpanded = false; |
| |
| mBatteryChartPreferenceController.onCreate(bundle); |
| mBatteryChartPreferenceController.setBatteryHistoryMap( |
| createBatteryHistoryMap()); |
| |
| assertThat(mBatteryChartPreferenceController.mTrapezoidIndex) |
| .isEqualTo(expectedIndex); |
| assertThat(mBatteryChartPreferenceController.mIsExpanded).isTrue(); |
| } |
| |
| @Test |
| public void testIsValidToShowSummary_returnExpectedResult() { |
| assertThat(mBatteryChartPreferenceController |
| .isValidToShowSummary("com.google.android.apps.scone")) |
| .isTrue(); |
| |
| // Verifies the item which is defined in the array list. |
| assertThat(mBatteryChartPreferenceController |
| .isValidToShowSummary("com.android.googlequicksearchbox")) |
| .isFalse(); |
| } |
| |
| @Test |
| public void testIsValidToShowEntry_returnExpectedResult() { |
| assertThat(mBatteryChartPreferenceController |
| .isValidToShowEntry("com.google.android.apps.scone")) |
| .isTrue(); |
| |
| // Verifies the items which are defined in the array list. |
| assertThat(mBatteryChartPreferenceController |
| .isValidToShowEntry("com.google.android.gms.persistent")) |
| .isFalse(); |
| } |
| |
| private static Map<Long, Map<String, BatteryHistEntry>> createBatteryHistoryMap() { |
| final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>(); |
| for (int index = 0; index < DESIRED_HISTORY_SIZE; index++) { |
| final ContentValues values = new ContentValues(); |
| values.put("batteryLevel", Integer.valueOf(100 - index)); |
| final BatteryHistEntry entry = new BatteryHistEntry(values); |
| final Map<String, BatteryHistEntry> entryMap = new HashMap<>(); |
| entryMap.put("fake_entry_key" + index, entry); |
| batteryHistoryMap.put(Long.valueOf(index + 1), entryMap); |
| } |
| return batteryHistoryMap; |
| } |
| |
| private BatteryDiffEntry createBatteryDiffEntry( |
| long foregroundUsageTimeInMs, long backgroundUsageTimeInMs) { |
| return new BatteryDiffEntry( |
| mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, |
| /*consumePower=*/ 0, mBatteryHistEntry); |
| } |
| |
| private void setUpBatteryHistoryKeys() { |
| mBatteryChartPreferenceController.mBatteryHistoryKeys = |
| new long[] {1619196786769L, 0L, 1619247636826L}; |
| ConvertUtils.utcToLocalTimeHour( |
| mContext, /*timestamp=*/ 0, /*is24HourFormat=*/ false); |
| } |
| |
| private BatteryChartPreferenceController createController() { |
| final BatteryChartPreferenceController controller = |
| new BatteryChartPreferenceController( |
| mContext, "app_list", /*lifecycle=*/ null, |
| mSettingsActivity, mFragment); |
| controller.mPrefContext = mContext; |
| return controller; |
| } |
| } |