Merge "Battery usage page latency improvement (1-8)" into udc-qpr-dev am: 1dad0bf856
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/24211971 Change-Id: I5b3b38a62fba34203e0195cdcc510c68f8e12652 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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 org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.os.UserManager;
|
||||
|
||||
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;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class AppUsageDataLoaderTest {
|
||||
private Context mContext;
|
||||
@Mock
|
||||
private ContentResolver mMockContentResolver;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
doReturn(mContext).when(mContext).getApplicationContext();
|
||||
doReturn(mMockContentResolver).when(mContext).getContentResolver();
|
||||
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
|
||||
doReturn(new Intent()).when(mContext).registerReceiver(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_withData_insertFakeDataIntoProvider() {
|
||||
final List<AppUsageEvent> AppUsageEventList = new ArrayList<>();
|
||||
final AppUsageEvent appUsageEvent = AppUsageEvent.newBuilder().setUid(0).build();
|
||||
AppUsageEventList.add(appUsageEvent);
|
||||
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> AppUsageEventList;
|
||||
|
||||
AppUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verify(mMockContentResolver).bulkInsert(any(), any());
|
||||
verify(mMockContentResolver).notifyChange(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_nullAppUsageEvents_notInsertDataIntoProvider() {
|
||||
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> null;
|
||||
|
||||
AppUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_nullUsageEventsList_notInsertDataIntoProvider() {
|
||||
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> null;
|
||||
|
||||
AppUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_emptyUsageEventsList_notInsertDataIntoProvider() {
|
||||
AppUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
AppUsageDataLoader.sFakeUsageEventsListSupplier = () -> new ArrayList<>();
|
||||
|
||||
AppUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
}
|
@@ -16,6 +16,8 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
import static com.android.settings.fuelgauge.batteryusage.BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
||||
@@ -30,7 +32,6 @@ import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.content.res.Resources;
|
||||
@@ -39,6 +40,7 @@ import android.os.Bundle;
|
||||
import android.os.LocaleList;
|
||||
import android.os.UserManager;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.view.View;
|
||||
import android.view.ViewPropertyAnimator;
|
||||
import android.widget.LinearLayout;
|
||||
@@ -54,7 +56,6 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
@@ -112,6 +113,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
mBatteryChartPreferenceController.mPrefContext = mContext;
|
||||
mBatteryChartPreferenceController.mDailyChartView = mDailyChartView;
|
||||
mBatteryChartPreferenceController.mHourlyChartView = mHourlyChartView;
|
||||
BatteryDiffEntry.clearCache();
|
||||
// Adds fake testing data.
|
||||
BatteryDiffEntry.sResourceCache.put(
|
||||
"fakeBatteryDiffEntryKey",
|
||||
@@ -144,7 +146,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
reset(mHourlyChartView);
|
||||
setupHourlyChartViewAnimationMock();
|
||||
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
|
||||
verify(mDailyChartView, atLeastOnce()).setVisibility(View.GONE);
|
||||
// Ignore fast refresh ui from the data processor callback.
|
||||
@@ -176,16 +178,18 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
BatteryChartViewModel.AxisLabelPosition.CENTER_OF_TRAPEZOIDS,
|
||||
mBatteryChartPreferenceController.mDailyChartLabelTextGenerator);
|
||||
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(60));
|
||||
mBatteryChartPreferenceController.onBatteryUsageMapUpdate(getEmptyBatteryUsageMap());
|
||||
|
||||
verify(mDailyChartView, atLeastOnce()).setVisibility(View.VISIBLE);
|
||||
verify(mViewPropertyAnimator, atLeastOnce()).alpha(0f);
|
||||
verify(mDailyChartView).setViewModel(expectedDailyViewModel);
|
||||
verify(mDailyChartView, atLeastOnce()).setViewModel(expectedDailyViewModel);
|
||||
|
||||
reset(mDailyChartView);
|
||||
reset(mHourlyChartView);
|
||||
setupHourlyChartViewAnimationMock();
|
||||
doReturn(mLayoutParams).when(mDailyChartView).getLayoutParams();
|
||||
doReturn(View.GONE).when(mHourlyChartView).getVisibility();
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.refreshUi();
|
||||
verify(mDailyChartView).setVisibility(View.VISIBLE);
|
||||
@@ -245,8 +249,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
setupHourlyChartViewAnimationMock();
|
||||
doReturn(mLayoutParams).when(mDailyChartView).getLayoutParams();
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 2;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex =
|
||||
BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.refreshUi();
|
||||
verify(mDailyChartView).setVisibility(View.VISIBLE);
|
||||
verify(mViewPropertyAnimator, atLeastOnce()).alpha(1f);
|
||||
@@ -272,13 +275,15 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void refreshUi_normalCase_returnTrue() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
mBatteryChartPreferenceController.onBatteryUsageMapUpdate(getEmptyBatteryUsageMap());
|
||||
assertThat(mBatteryChartPreferenceController.refreshUi()).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void refreshUi_batteryIndexedMapIsNull_returnTrue() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(null);
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(null);
|
||||
mBatteryChartPreferenceController.onBatteryUsageMapUpdate(getEmptyBatteryUsageMap());
|
||||
assertThat(mBatteryChartPreferenceController.refreshUi()).isTrue();
|
||||
}
|
||||
|
||||
@@ -296,38 +301,34 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_selectAllDaysAllHours_returnNull() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex =
|
||||
BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex =
|
||||
BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(60));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
|
||||
|
||||
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_onlyOneDayDataSelectAllHours_returnNull() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex =
|
||||
BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
|
||||
|
||||
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_selectADayAllHours_onlyDayText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(60));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 1;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex =
|
||||
BatteryChartViewModel.SELECTED_INDEX_ALL;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = SELECTED_INDEX_ALL;
|
||||
|
||||
assertThat(mBatteryChartPreferenceController.getSlotInformation()).isEqualTo("Sunday");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_onlyOneDayDataSelectAnHour_onlyHourText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = 2;
|
||||
|
||||
@@ -337,7 +338,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_SelectADayAnHour_dayAndHourText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(60));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(60));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 1;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = 8;
|
||||
|
||||
@@ -347,7 +348,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_selectFirstSlot_withMinuteText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = 0;
|
||||
|
||||
@@ -357,7 +358,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_selectLastSlot_withNowText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(6));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(6));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = 3;
|
||||
|
||||
@@ -367,7 +368,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void selectedSlotText_selectOnlySlot_withMinuteAndNowText() {
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(1));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(1));
|
||||
mBatteryChartPreferenceController.mDailyChartIndex = 0;
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = 0;
|
||||
|
||||
@@ -388,7 +389,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
mBatteryChartPreferenceController.mHourlyChartIndex = -1;
|
||||
|
||||
mBatteryChartPreferenceController.onCreate(bundle);
|
||||
mBatteryChartPreferenceController.setBatteryHistoryMap(createBatteryHistoryMap(25));
|
||||
mBatteryChartPreferenceController.onBatteryLevelDataUpdate(createBatteryLevelData(25));
|
||||
|
||||
assertThat(mBatteryChartPreferenceController.mDailyChartIndex)
|
||||
.isEqualTo(expectedDailyIndex);
|
||||
@@ -398,9 +399,7 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
|
||||
@Test
|
||||
public void getTotalHours_getExpectedResult() {
|
||||
Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = createBatteryHistoryMap(60);
|
||||
BatteryLevelData batteryLevelData =
|
||||
DataProcessManager.getBatteryLevelData(mContext, null, batteryHistoryMap, null);
|
||||
BatteryLevelData batteryLevelData = createBatteryLevelData(60);
|
||||
|
||||
final int totalHour = BatteryChartPreferenceController.getTotalHours(batteryLevelData);
|
||||
|
||||
@@ -413,37 +412,26 @@ public final class BatteryChartPreferenceControllerTest {
|
||||
return 1619247600000L + index * DateUtils.HOUR_IN_MILLIS;
|
||||
}
|
||||
|
||||
private static Map<Long, Map<String, BatteryHistEntry>> createBatteryHistoryMap(
|
||||
int numOfHours) {
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
|
||||
for (int index = 0; index < numOfHours; index++) {
|
||||
final ContentValues values = new ContentValues();
|
||||
final DeviceBatteryState deviceBatteryState =
|
||||
DeviceBatteryState
|
||||
.newBuilder()
|
||||
.setBatteryLevel(100 - index)
|
||||
.build();
|
||||
final BatteryInformation batteryInformation =
|
||||
BatteryInformation
|
||||
.newBuilder()
|
||||
.setDeviceBatteryState(deviceBatteryState)
|
||||
.setConsumePower(100 - index)
|
||||
.build();
|
||||
values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
|
||||
ConvertUtils.convertBatteryInformationToString(batteryInformation));
|
||||
values.put(BatteryHistEntry.KEY_PACKAGE_NAME, "package" + index);
|
||||
final BatteryHistEntry entry = new BatteryHistEntry(values);
|
||||
final Map<String, BatteryHistEntry> entryMap = new HashMap<>();
|
||||
entryMap.put("fake_entry_key" + index, entry);
|
||||
long timestamp = generateTimestamp(index);
|
||||
private static BatteryLevelData createBatteryLevelData(int numOfHours) {
|
||||
Map<Long, Integer> batteryLevelMap = new ArrayMap<>();
|
||||
for (int index = 0; index < numOfHours; index += 2) {
|
||||
final Integer level = 100 - index;
|
||||
Long timestamp = generateTimestamp(index);
|
||||
if (index == 0) {
|
||||
timestamp += DateUtils.MINUTE_IN_MILLIS;
|
||||
index--;
|
||||
}
|
||||
batteryHistoryMap.put(timestamp, entryMap);
|
||||
batteryLevelMap.put(timestamp, level);
|
||||
}
|
||||
DataProcessor.sTestCurrentTimeMillis =
|
||||
generateTimestamp(numOfHours - 1) + DateUtils.MINUTE_IN_MILLIS * 2;
|
||||
return batteryHistoryMap;
|
||||
long current = generateTimestamp(numOfHours - 1) + DateUtils.MINUTE_IN_MILLIS * 2;
|
||||
batteryLevelMap.put(current, 66);
|
||||
DataProcessor.sTestCurrentTimeMillis = current;
|
||||
return new BatteryLevelData(batteryLevelMap);
|
||||
}
|
||||
|
||||
private static Map<Integer, Map<Integer, BatteryDiffData>> getEmptyBatteryUsageMap() {
|
||||
return Map.of(SELECTED_INDEX_ALL, Map.of(SELECTED_INDEX_ALL, new BatteryDiffData(
|
||||
null, 0, 0, 0, 0, 0, List.of(), List.of(), Set.of(), Set.of(), false)));
|
||||
}
|
||||
|
||||
private BatteryChartPreferenceController createController() {
|
||||
|
@@ -147,6 +147,14 @@ public class BatteryDiffDataTest {
|
||||
/*foregroundUsageTimeInMs=*/ 0L, /*backgroundUsageTimeInMs=*/ 0L, isHidden);
|
||||
return new BatteryDiffEntry(
|
||||
context,
|
||||
batteryHistEntry.mUid,
|
||||
batteryHistEntry.mUserId,
|
||||
batteryHistEntry.getKey(),
|
||||
batteryHistEntry.mIsHidden,
|
||||
batteryHistEntry.mDrainType,
|
||||
batteryHistEntry.mPackageName,
|
||||
batteryHistEntry.mAppLabel,
|
||||
batteryHistEntry.mConsumerType,
|
||||
/*foregroundUsageTimeInMs=*/ 0,
|
||||
/*backgroundUsageTimeInMs=*/ 0,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
@@ -154,8 +162,7 @@ public class BatteryDiffDataTest {
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0,
|
||||
batteryHistEntry);
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
}
|
||||
|
||||
private static BatteryHistEntry createBatteryHistEntry(
|
||||
|
@@ -95,6 +95,14 @@ public final class BatteryDiffEntryTest {
|
||||
final BatteryDiffEntry entry =
|
||||
new BatteryDiffEntry(
|
||||
mContext,
|
||||
/*uid=*/ 0,
|
||||
/*userId=*/ 0,
|
||||
/*key=*/ "key",
|
||||
/*isHidden=*/ false,
|
||||
/*componentId=*/ -1,
|
||||
/*legacyPackageName=*/ null,
|
||||
/*legacyLabel=*/ null,
|
||||
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
|
||||
/*foregroundUsageTimeInMs=*/ 10001L,
|
||||
/*backgroundUsageTimeInMs=*/ 20002L,
|
||||
/*screenOnTimeInMs=*/ 30003L,
|
||||
@@ -102,8 +110,7 @@ public final class BatteryDiffEntryTest {
|
||||
/*foregroundUsageConsumePower=*/ 10.0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 10.0,
|
||||
/*backgroundUsageConsumePower=*/ 1.0,
|
||||
/*cachedUsageConsumePower=*/ 1.0,
|
||||
/*batteryHistEntry=*/ null);
|
||||
/*cachedUsageConsumePower=*/ 1.0);
|
||||
entry.setTotalConsumePower(100.0);
|
||||
|
||||
assertThat(entry.getPercentage()).isEqualTo(22.0);
|
||||
@@ -114,6 +121,14 @@ public final class BatteryDiffEntryTest {
|
||||
final BatteryDiffEntry entry =
|
||||
new BatteryDiffEntry(
|
||||
mContext,
|
||||
/*uid=*/ 0,
|
||||
/*userId=*/ 0,
|
||||
/*key=*/ "key",
|
||||
/*isHidden=*/ false,
|
||||
/*componentId=*/ -1,
|
||||
/*legacyPackageName=*/ null,
|
||||
/*legacyLabel=*/ null,
|
||||
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
|
||||
/*foregroundUsageTimeInMs=*/ 10001L,
|
||||
/*backgroundUsageTimeInMs=*/ 20002L,
|
||||
/*screenOnTimeInMs=*/ 30003L,
|
||||
@@ -121,8 +136,7 @@ public final class BatteryDiffEntryTest {
|
||||
/*foregroundUsageConsumePower=*/ 10.0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 10.0,
|
||||
/*backgroundUsageConsumePower=*/ 1.0,
|
||||
/*cachedUsageConsumePower=*/ 1.0,
|
||||
/*batteryHistEntry=*/ null);
|
||||
/*cachedUsageConsumePower=*/ 1.0);
|
||||
entry.setTotalConsumePower(0);
|
||||
|
||||
assertThat(entry.getPercentage()).isEqualTo(0);
|
||||
@@ -133,7 +147,24 @@ public final class BatteryDiffEntryTest {
|
||||
final List<BatteryDiffEntry> entryList = new ArrayList<>();
|
||||
// Generates fake testing data.
|
||||
BatteryDiffEntry systemAppsBatteryDiffEntry =
|
||||
new BatteryDiffEntry.SystemAppsBatteryDiffEntry(mContext);
|
||||
new BatteryDiffEntry(
|
||||
mContext,
|
||||
/*uid=*/ 0,
|
||||
/*userId=*/ 0,
|
||||
/*key=*/ BatteryDiffEntry.SYSTEM_APPS_KEY,
|
||||
/*isHidden=*/ false,
|
||||
/*componentId=*/ -1,
|
||||
/*legacyPackageName=*/ null,
|
||||
/*legacyLabel=*/ BatteryDiffEntry.SYSTEM_APPS_KEY,
|
||||
/*consumerType*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
|
||||
/*foregroundUsageTimeInMs=*/ 0,
|
||||
/*backgroundUsageTimeInMs=*/ 0,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
/*consumePower=*/ 0,
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
systemAppsBatteryDiffEntry.mConsumePower = 16;
|
||||
systemAppsBatteryDiffEntry.setTotalConsumePower(100);
|
||||
entryList.add(systemAppsBatteryDiffEntry);
|
||||
@@ -448,17 +479,16 @@ public final class BatteryDiffEntryTest {
|
||||
|
||||
private BatteryDiffEntry createBatteryDiffEntry(
|
||||
int consumerType, long uid, boolean isHidden) {
|
||||
final ContentValues values = getContentValuesWithType(consumerType);
|
||||
final BatteryInformation batteryInformation =
|
||||
BatteryInformation
|
||||
.newBuilder()
|
||||
.setIsHidden(isHidden)
|
||||
.build();
|
||||
values.put(BatteryHistEntry.KEY_BATTERY_INFORMATION,
|
||||
ConvertUtils.convertBatteryInformationToString(batteryInformation));
|
||||
values.put(BatteryHistEntry.KEY_UID, uid);
|
||||
return new BatteryDiffEntry(
|
||||
mContext,
|
||||
/*uid=*/ uid,
|
||||
/*userId=*/ 0,
|
||||
/*key=*/ "key",
|
||||
/*isHidden=*/ isHidden,
|
||||
/*componentId=*/ -1,
|
||||
/*legacyPackageName=*/ null,
|
||||
/*legacyLabel=*/ null,
|
||||
/*consumerType*/ consumerType,
|
||||
/*foregroundUsageTimeInMs=*/ 0,
|
||||
/*backgroundUsageTimeInMs=*/ 0,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
@@ -466,14 +496,21 @@ public final class BatteryDiffEntryTest {
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0,
|
||||
new BatteryHistEntry(values));
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
}
|
||||
|
||||
private BatteryDiffEntry createBatteryDiffEntry(
|
||||
double consumePower, BatteryHistEntry batteryHistEntry) {
|
||||
final BatteryDiffEntry entry = new BatteryDiffEntry(
|
||||
mContext,
|
||||
batteryHistEntry.mUid,
|
||||
batteryHistEntry.mUserId,
|
||||
batteryHistEntry.getKey(),
|
||||
batteryHistEntry.mIsHidden,
|
||||
batteryHistEntry.mDrainType,
|
||||
batteryHistEntry.mPackageName,
|
||||
batteryHistEntry.mAppLabel,
|
||||
batteryHistEntry.mConsumerType,
|
||||
/*foregroundUsageTimeInMs=*/ 0,
|
||||
/*backgroundUsageTimeInMs=*/ 0,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
@@ -481,8 +518,7 @@ public final class BatteryDiffEntryTest {
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0,
|
||||
batteryHistEntry);
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
entry.setTotalConsumePower(100.0);
|
||||
return entry;
|
||||
}
|
||||
|
@@ -15,6 +15,10 @@
|
||||
*/
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.isSystemConsumer;
|
||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.isUidConsumer;
|
||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.isUserConsumer;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
@@ -147,32 +151,32 @@ public final class BatteryHistEntryTest {
|
||||
|
||||
@Test
|
||||
public void testIsAppEntry_returnExpectedResult() {
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).isAppEntry())
|
||||
.isFalse();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).isAppEntry())
|
||||
.isFalse();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).isAppEntry())
|
||||
.isTrue();
|
||||
assertThat(isUidConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isFalse();
|
||||
assertThat(isUidConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isFalse();
|
||||
assertThat(isUidConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsUserEntry_returnExpectedResult() {
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).isUserEntry())
|
||||
.isFalse();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).isUserEntry())
|
||||
.isTrue();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).isUserEntry())
|
||||
.isFalse();
|
||||
assertThat(isUserConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isFalse();
|
||||
assertThat(isUserConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isTrue();
|
||||
assertThat(isUserConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIsSystemEntry_returnExpectedResult() {
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).isSystemEntry())
|
||||
.isTrue();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).isSystemEntry())
|
||||
.isFalse();
|
||||
assertThat(createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).isSystemEntry())
|
||||
.isFalse();
|
||||
assertThat(isSystemConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY).mConsumerType)).isTrue();
|
||||
assertThat(isSystemConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_USER_BATTERY).mConsumerType)).isFalse();
|
||||
assertThat(isSystemConsumer(
|
||||
createEntry(ConvertUtils.CONSUMER_TYPE_UID_BATTERY).mConsumerType)).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@@ -27,7 +27,6 @@ import android.widget.TextView;
|
||||
import androidx.preference.PreferenceViewHolder;
|
||||
|
||||
import com.android.settings.R;
|
||||
import com.android.settings.fuelgauge.BatteryInfo;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -42,8 +41,6 @@ public class BatteryHistoryPreferenceTest {
|
||||
@Mock
|
||||
private PreferenceViewHolder mViewHolder;
|
||||
@Mock
|
||||
private BatteryInfo mBatteryInfo;
|
||||
@Mock
|
||||
private TextView mTextView;
|
||||
@Mock
|
||||
private BatteryChartView mDailyChartView;
|
||||
@@ -59,7 +56,6 @@ public class BatteryHistoryPreferenceTest {
|
||||
LayoutInflater.from(context).inflate(R.layout.battery_chart_graph, null);
|
||||
|
||||
mBatteryHistoryPreference = new BatteryHistoryPreference(context, null);
|
||||
mBatteryHistoryPreference.mBatteryInfo = mBatteryInfo;
|
||||
mViewHolder = spy(PreferenceViewHolder.createInstanceForTests(itemView));
|
||||
when(mViewHolder.findViewById(R.id.daily_battery_chart)).thenReturn(mDailyChartView);
|
||||
when(mViewHolder.findViewById(R.id.hourly_battery_chart)).thenReturn(mHourlyChartView);
|
||||
|
@@ -0,0 +1,214 @@
|
||||
/*
|
||||
* 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 org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.TimeZone;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class BatteryLevelDataTest {
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_allDataInOneHour_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640970006000L, // 2022-01-01 01:00:06
|
||||
1640973608000L // 2022-01-01 01:00:08
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640970006000L, // 2022-01-01 01:00:06
|
||||
1640973608000L // 2022-01-01 01:00:08
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_OneHourDataPerDay_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L // 2022-01-02 01:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L // 2022-01-02 01:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_OneDayData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640966400000L, // 2022-01-01 00:00:00
|
||||
1640970000000L, // 2022-01-01 01:00:00
|
||||
1640973600000L, // 2022-01-01 02:00:00
|
||||
1640977200000L, // 2022-01-01 03:00:00
|
||||
1640980800000L // 2022-01-01 04:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640966400000L, // 2022-01-01 00:00:00
|
||||
1640980800000L // 2022-01-01 04:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_MultipleDaysData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641232800000L // 2022-01-04 02:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641232800000L // 2022-01-04 02:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_FirstDayOneHourData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641254400000L // 2022-01-04 08:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641254400000L // 2022-01-04 08:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_LastDayNoData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641225600000L // 2022-01-04 00:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L // 2022-01-04 00:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_LastDayOneHourData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641229200000L // 2022-01-04 01:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641229200000L // 2022-01-04 01:00:00
|
||||
);
|
||||
assertThat(BatteryLevelData.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void combine_normalFlow_returnExpectedResult() {
|
||||
final BatteryLevelData batteryLevelData =
|
||||
new BatteryLevelData(Map.of(1691596800000L, 90, 1691604000000L, 80));
|
||||
final List<BatteryEvent> batteryLevelRecordEvents = List.of(
|
||||
BatteryEvent.newBuilder().setTimestamp(1691586000166L).setBatteryLevel(100)
|
||||
.setType(BatteryEventType.FULL_CHARGED).build(),
|
||||
BatteryEvent.newBuilder().setTimestamp(1691589600000L).setBatteryLevel(98)
|
||||
.setType(BatteryEventType.EVEN_HOUR).build());
|
||||
|
||||
BatteryLevelData result =
|
||||
BatteryLevelData.combine(batteryLevelData, batteryLevelRecordEvents);
|
||||
|
||||
assertThat(result.getDailyBatteryLevels().getTimestamps())
|
||||
.isEqualTo(List.of(1691586000166L, 1691596800000L, 1691604000000L));
|
||||
assertThat(result.getDailyBatteryLevels().getLevels())
|
||||
.isEqualTo(List.of(100, 90, 80));
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay())
|
||||
.hasSize(2);
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getTimestamps())
|
||||
.isEqualTo(List.of(1691586000166L, 1691589600000L, 1691596800000L));
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
|
||||
.isEqualTo(List.of(100, 98, 90));
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(1).getTimestamps())
|
||||
.isEqualTo(List.of(1691596800000L, 1691604000000L));
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(1).getLevels())
|
||||
.isEqualTo(List.of(90, 80));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void combine_existingBatteryLevelDataIsNull_returnExpectedResult() {
|
||||
final List<BatteryEvent> batteryLevelRecordEvents = List.of(
|
||||
BatteryEvent.newBuilder().setTimestamp(1691586000166L).setBatteryLevel(100)
|
||||
.setType(BatteryEventType.FULL_CHARGED).build(),
|
||||
BatteryEvent.newBuilder().setTimestamp(1691589600000L).setBatteryLevel(98)
|
||||
.setType(BatteryEventType.EVEN_HOUR).build());
|
||||
|
||||
BatteryLevelData result =
|
||||
BatteryLevelData.combine(null, batteryLevelRecordEvents);
|
||||
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay())
|
||||
.hasSize(1);
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getTimestamps())
|
||||
.isEqualTo(List.of(1691586000166L, 1691589600000L));
|
||||
assertThat(result.getHourlyBatteryLevelsPerDay().get(0).getLevels())
|
||||
.isEqualTo(List.of(100, 98));
|
||||
}
|
||||
}
|
@@ -96,6 +96,14 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
mBatteryUsageBreakdownController.mAppListPreferenceGroup = mAppListPreferenceGroup;
|
||||
mBatteryDiffEntry = new BatteryDiffEntry(
|
||||
mContext,
|
||||
/*uid=*/ 0L,
|
||||
/*userId=*/ 0L,
|
||||
/*key=*/ "key",
|
||||
/*isHidden=*/ false,
|
||||
/*componentId=*/ -1,
|
||||
/*legacyPackageName=*/ null,
|
||||
/*legacyLabel=*/ null,
|
||||
/*consumerType=*/ ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
|
||||
/*foregroundUsageTimeInMs=*/ 1,
|
||||
/*backgroundUsageTimeInMs=*/ 2,
|
||||
/*screenOnTimeInMs=*/ 0,
|
||||
@@ -103,13 +111,14 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 1,
|
||||
/*backgroundUsageConsumePower=*/ 2,
|
||||
/*cachedUsageConsumePower=*/ 0,
|
||||
mBatteryHistEntry);
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
mBatteryDiffEntry = spy(mBatteryDiffEntry);
|
||||
mBatteryUsageBreakdownController.mBatteryDiffData =
|
||||
new BatteryDiffData(mContext, /* screenOnTime= */ 0L,
|
||||
Arrays.asList(mBatteryDiffEntry), Arrays.asList(), Set.of(), Set.of(),
|
||||
/* isAccumulated= */ false);
|
||||
new BatteryDiffData(mContext, /* startTimestamp= */ 0L, /* endTimestamp= */ 0L,
|
||||
/* startBatteryLevel= */ 0, /* endBatteryLevel= */ 0,
|
||||
/* screenOnTime= */ 0L, Arrays.asList(mBatteryDiffEntry), Arrays.asList(),
|
||||
Set.of(), Set.of(), /* isAccumulated= */ false);
|
||||
BatteryDiffEntry.clearCache();
|
||||
// Adds fake testing data.
|
||||
BatteryDiffEntry.sResourceCache.put(
|
||||
"fakeBatteryDiffEntryKey",
|
||||
@@ -140,7 +149,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
|
||||
doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
|
||||
doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
|
||||
doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
|
||||
doReturn(null).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
doReturn(false).when(mBatteryDiffEntry).validForRestriction();
|
||||
|
||||
@@ -168,7 +177,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
|
||||
doReturn(mDrawable).when(mBatteryDiffEntry).getAppIcon();
|
||||
doReturn(appLabel).when(mBatteryDiffEntry).getAppLabel();
|
||||
doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
|
||||
mBatteryUsageBreakdownController.addAllPreferences();
|
||||
@@ -197,7 +206,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
public void removeAndCacheAllUnusedPreferences_keepPref_KeepAllPreference() {
|
||||
doReturn(1).when(mAppListPreferenceGroup).getPreferenceCount();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).getPreference(0);
|
||||
doReturn(PREF_KEY).when(mBatteryHistEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mBatteryDiffEntry).getKey();
|
||||
doReturn(PREF_KEY).when(mPowerGaugePreference).getKey();
|
||||
doReturn(mPowerGaugePreference).when(mAppListPreferenceGroup).findPreference(PREF_KEY);
|
||||
// Ensures the testing data is correct.
|
||||
@@ -222,7 +231,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
|
||||
@Test
|
||||
public void handlePreferenceTreeClick_forAppEntry_returnTrue() {
|
||||
doReturn(false).when(mBatteryHistEntry).isAppEntry();
|
||||
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_SYSTEM_BATTERY;
|
||||
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
|
||||
|
||||
assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
|
||||
@@ -238,7 +247,7 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
|
||||
@Test
|
||||
public void handlePreferenceTreeClick_forSystemEntry_returnTrue() {
|
||||
doReturn(true).when(mBatteryHistEntry).isAppEntry();
|
||||
mBatteryDiffEntry.mConsumerType = ConvertUtils.CONSUMER_TYPE_UID_BATTERY;
|
||||
doReturn(mBatteryDiffEntry).when(mPowerGaugePreference).getBatteryDiffEntry();
|
||||
|
||||
assertThat(mBatteryUsageBreakdownController.handlePreferenceTreeClick(
|
||||
@@ -394,10 +403,23 @@ public final class BatteryUsageBreakdownControllerTest {
|
||||
contentValues.put(BatteryHistEntry.KEY_USER_ID, Integer.valueOf(1001));
|
||||
final BatteryHistEntry batteryHistEntry = new BatteryHistEntry(contentValues);
|
||||
return new BatteryDiffEntry(
|
||||
mContext, foregroundUsageTimeInMs, backgroundUsageTimeInMs, screenOnTimeInMs,
|
||||
/*consumePower=*/ 0, /*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0, /*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0, batteryHistEntry);
|
||||
mContext,
|
||||
batteryHistEntry.mUid,
|
||||
batteryHistEntry.mUserId,
|
||||
batteryHistEntry.getKey(),
|
||||
batteryHistEntry.mIsHidden,
|
||||
batteryHistEntry.mDrainType,
|
||||
batteryHistEntry.mPackageName,
|
||||
batteryHistEntry.mAppLabel,
|
||||
batteryHistEntry.mConsumerType,
|
||||
foregroundUsageTimeInMs,
|
||||
backgroundUsageTimeInMs,
|
||||
screenOnTimeInMs,
|
||||
/*consumePower=*/ 0,
|
||||
/*foregroundUsageConsumePower=*/ 0,
|
||||
/*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0,
|
||||
/*cachedUsageConsumePower=*/ 0);
|
||||
}
|
||||
|
||||
private BatteryUsageBreakdownController createController() {
|
||||
|
@@ -20,11 +20,9 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.junit.Assert.assertThrows;
|
||||
|
||||
import android.app.Application;
|
||||
import android.content.ContentResolver;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
|
||||
@@ -34,6 +32,7 @@ import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryState;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryStateDatabase;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryUsageSlotEntity;
|
||||
import com.android.settings.testutils.BatteryTestUtils;
|
||||
import com.android.settings.testutils.FakeClock;
|
||||
|
||||
@@ -41,12 +40,10 @@ import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.Shadows;
|
||||
|
||||
import java.time.Duration;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/** Tests for {@link BatteryUsageContentProvider}. */
|
||||
@@ -126,11 +123,29 @@ public final class BatteryUsageContentProviderTest {
|
||||
() -> mProvider.insert(uri, /*contentValues=*/ null));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_getLastFullChargeTimestamp_returnsExpectedResult() throws Exception {
|
||||
mProvider.onCreate();
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L);
|
||||
values.put(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE,
|
||||
BatteryEventType.FULL_CHARGED.getNumber());
|
||||
values.put(BatteryEventEntity.KEY_BATTERY_LEVEL, 100);
|
||||
mProvider.insert(DatabaseUtils.BATTERY_EVENT_URI, values);
|
||||
|
||||
final Cursor cursor = getCursorOfLastFullChargeTimestamp();
|
||||
|
||||
assertThat(cursor.getCount()).isEqualTo(1);
|
||||
cursor.moveToFirst();
|
||||
final long lastFullChargeTimestamp = cursor.getLong(0);
|
||||
assertThat(lastFullChargeTimestamp).isEqualTo(10001L);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_batteryState_returnsExpectedResult() throws Exception {
|
||||
mProvider.onCreate();
|
||||
final Duration currentTime = Duration.ofHours(52);
|
||||
final long expiredTimeCutoff = currentTime.toMillis() - 3;
|
||||
final long expiredTimeCutoff = currentTime.toMillis() - 8;
|
||||
|
||||
final Cursor cursor = insertBatteryState(currentTime, Long.toString(expiredTimeCutoff));
|
||||
|
||||
@@ -150,19 +165,13 @@ public final class BatteryUsageContentProviderTest {
|
||||
final String actualPackageName3 = cursor.getString(packageNameIndex);
|
||||
assertThat(actualPackageName3).isEqualTo(PACKAGE_NAME3);
|
||||
cursor.close();
|
||||
// Verifies the broadcast intent.
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
|
||||
assertThat(intents).hasSize(1);
|
||||
assertThat(intents.get(0).getAction()).isEqualTo(
|
||||
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_batteryStateTimestamp_returnsExpectedResult() throws Exception {
|
||||
mProvider.onCreate();
|
||||
final Duration currentTime = Duration.ofHours(52);
|
||||
final long expiredTimeCutoff = currentTime.toMillis() - 1;
|
||||
final long expiredTimeCutoff = currentTime.toMillis() - 2;
|
||||
|
||||
final Cursor cursor = insertBatteryState(currentTime, Long.toString(expiredTimeCutoff));
|
||||
|
||||
@@ -178,12 +187,25 @@ public final class BatteryUsageContentProviderTest {
|
||||
final String actualPackageName2 = cursor.getString(packageNameIndex);
|
||||
assertThat(actualPackageName2).isEqualTo(PACKAGE_NAME3);
|
||||
cursor.close();
|
||||
// Verifies the broadcast intent.
|
||||
TimeUnit.SECONDS.sleep(1);
|
||||
final List<Intent> intents = Shadows.shadowOf((Application) mContext).getBroadcastIntents();
|
||||
assertThat(intents).hasSize(1);
|
||||
assertThat(intents.get(0).getAction()).isEqualTo(
|
||||
BootBroadcastReceiver.ACTION_PERIODIC_JOB_RECHECK);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void query_getBatteryStateLatestTimestamp_returnsExpectedResult() throws Exception {
|
||||
mProvider.onCreate();
|
||||
final Duration currentTime = Duration.ofHours(52);
|
||||
insertBatteryState(currentTime, Long.toString(currentTime.toMillis()));
|
||||
|
||||
final Cursor cursor1 = getCursorOfBatteryStateLatestTimestamp(currentTime.toMillis() - 5);
|
||||
assertThat(cursor1.getCount()).isEqualTo(1);
|
||||
cursor1.moveToFirst();
|
||||
final long latestTimestamp1 = cursor1.getLong(0);
|
||||
assertThat(latestTimestamp1).isEqualTo(currentTime.toMillis() - 6);
|
||||
|
||||
final Cursor cursor2 = getCursorOfBatteryStateLatestTimestamp(currentTime.toMillis() - 2);
|
||||
assertThat(cursor2.getCount()).isEqualTo(1);
|
||||
cursor2.moveToFirst();
|
||||
final long latestTimestamp2 = cursor2.getLong(0);
|
||||
assertThat(latestTimestamp2).isEqualTo(currentTime.toMillis() - 2);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -355,7 +377,7 @@ public final class BatteryUsageContentProviderTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insert_batteryEvent_returnsExpectedResult() {
|
||||
public void insertAndQuery_batteryEvent_returnsExpectedResult() {
|
||||
mProvider.onCreate();
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(BatteryEventEntity.KEY_TIMESTAMP, 10001L);
|
||||
@@ -366,7 +388,7 @@ public final class BatteryUsageContentProviderTest {
|
||||
final Uri uri = mProvider.insert(DatabaseUtils.BATTERY_EVENT_URI, values);
|
||||
|
||||
assertThat(uri).isEqualTo(DatabaseUtils.BATTERY_EVENT_URI);
|
||||
// Verifies the AppUsageEventEntity content.
|
||||
// Verifies the BatteryEventEntity content.
|
||||
final List<BatteryEventEntity> entities =
|
||||
BatteryStateDatabase.getInstance(mContext).batteryEventDao().getAll();
|
||||
assertThat(entities).hasSize(1);
|
||||
@@ -374,6 +396,50 @@ public final class BatteryUsageContentProviderTest {
|
||||
assertThat(entities.get(0).batteryEventType).isEqualTo(
|
||||
BatteryEventType.POWER_CONNECTED.getNumber());
|
||||
assertThat(entities.get(0).batteryLevel).isEqualTo(66);
|
||||
|
||||
final Cursor cursor1 = getCursorOfBatteryEvents(
|
||||
0L, List.of(BatteryEventType.POWER_CONNECTED.getNumber()));
|
||||
assertThat(cursor1.getCount()).isEqualTo(1);
|
||||
cursor1.moveToFirst();
|
||||
assertThat(cursor1.getLong(cursor1.getColumnIndex(BatteryEventEntity.KEY_TIMESTAMP)))
|
||||
.isEqualTo(10001L);
|
||||
assertThat(
|
||||
cursor1.getInt(cursor1.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)))
|
||||
.isEqualTo(BatteryEventType.POWER_CONNECTED.getNumber());
|
||||
assertThat(cursor1.getInt(cursor1.getColumnIndex(BatteryEventEntity.KEY_BATTERY_LEVEL)))
|
||||
.isEqualTo(66);
|
||||
|
||||
final Cursor cursor2 = getCursorOfBatteryEvents(
|
||||
0L, List.of(BatteryEventType.POWER_DISCONNECTED.getNumber()));
|
||||
assertThat(cursor2.getCount()).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void insertAndQuery_batteryUsageSlot_returnsExpectedResult() {
|
||||
mProvider.onCreate();
|
||||
ContentValues values = new ContentValues();
|
||||
values.put(BatteryUsageSlotEntity.KEY_TIMESTAMP, 10001L);
|
||||
values.put(BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT, "TEST_STRING");
|
||||
|
||||
final Uri uri = mProvider.insert(DatabaseUtils.BATTERY_USAGE_SLOT_URI, values);
|
||||
// Verifies the BatteryUsageSlotEntity content.
|
||||
assertThat(uri).isEqualTo(DatabaseUtils.BATTERY_USAGE_SLOT_URI);
|
||||
final List<BatteryUsageSlotEntity> entities =
|
||||
BatteryStateDatabase.getInstance(mContext).batteryUsageSlotDao().getAll();
|
||||
assertThat(entities).hasSize(1);
|
||||
assertThat(entities.get(0).timestamp).isEqualTo(10001L);
|
||||
assertThat(entities.get(0).batteryUsageSlot).isEqualTo("TEST_STRING");
|
||||
|
||||
final Cursor cursor1 = getCursorOfBatteryUsageSlots(10001L);
|
||||
assertThat(cursor1.getCount()).isEqualTo(1);
|
||||
cursor1.moveToFirst();
|
||||
assertThat(cursor1.getLong(cursor1.getColumnIndex(BatteryUsageSlotEntity.KEY_TIMESTAMP)))
|
||||
.isEqualTo(10001L);
|
||||
assertThat(cursor1.getString(cursor1.getColumnIndex(
|
||||
BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT))).isEqualTo("TEST_STRING");
|
||||
|
||||
final Cursor cursor2 = getCursorOfBatteryUsageSlots(10002L);
|
||||
assertThat(cursor2.getCount()).isEqualTo(0);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -404,10 +470,10 @@ public final class BatteryUsageContentProviderTest {
|
||||
final long currentTimestamp = currentTime.toMillis();
|
||||
// Inserts some valid testing data.
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(
|
||||
mContext, currentTimestamp - 2, PACKAGE_NAME1,
|
||||
mContext, currentTimestamp - 6, PACKAGE_NAME1,
|
||||
/*isFullChargeStart=*/ true);
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(
|
||||
mContext, currentTimestamp - 1, PACKAGE_NAME2);
|
||||
mContext, currentTimestamp - 2, PACKAGE_NAME2);
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(
|
||||
mContext, currentTimestamp, PACKAGE_NAME3);
|
||||
|
||||
@@ -420,17 +486,35 @@ public final class BatteryUsageContentProviderTest {
|
||||
DatabaseUtils.QUERY_KEY_TIMESTAMP, queryTimestamp)
|
||||
.build();
|
||||
|
||||
final Cursor cursor =
|
||||
mProvider.query(
|
||||
batteryStateQueryContentUri,
|
||||
/*strings=*/ null,
|
||||
/*s=*/ null,
|
||||
/*strings1=*/ null,
|
||||
/*s1=*/ null);
|
||||
final Cursor cursor = query(batteryStateQueryContentUri);
|
||||
|
||||
return cursor;
|
||||
}
|
||||
|
||||
private Cursor getCursorOfLastFullChargeTimestamp() {
|
||||
final Uri lastFullChargeTimestampContentUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(DatabaseUtils.AUTHORITY)
|
||||
.appendPath(DatabaseUtils.LAST_FULL_CHARGE_TIMESTAMP_PATH)
|
||||
.build();
|
||||
|
||||
return query(lastFullChargeTimestampContentUri);
|
||||
}
|
||||
|
||||
private Cursor getCursorOfBatteryStateLatestTimestamp(final long queryTimestamp) {
|
||||
final Uri batteryStateLatestTimestampUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(DatabaseUtils.AUTHORITY)
|
||||
.appendPath(DatabaseUtils.BATTERY_STATE_LATEST_TIMESTAMP_PATH)
|
||||
.appendQueryParameter(
|
||||
DatabaseUtils.QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.build();
|
||||
|
||||
return query(batteryStateLatestTimestampUri);
|
||||
}
|
||||
|
||||
private void insertAppUsageEvent() {
|
||||
mProvider.onCreate();
|
||||
// Inserts some valid testing data.
|
||||
@@ -452,12 +536,7 @@ public final class BatteryUsageContentProviderTest {
|
||||
DatabaseUtils.QUERY_KEY_USERID, Long.toString(userId))
|
||||
.build();
|
||||
|
||||
return mProvider.query(
|
||||
appUsageLatestTimestampQueryContentUri,
|
||||
/*strings=*/ null,
|
||||
/*s=*/ null,
|
||||
/*strings1=*/ null,
|
||||
/*s1=*/ null);
|
||||
return query(appUsageLatestTimestampQueryContentUri);
|
||||
}
|
||||
|
||||
private Cursor getCursorOfAppUsage(final List<Long> userIds, final long queryTimestamp) {
|
||||
@@ -474,7 +553,43 @@ public final class BatteryUsageContentProviderTest {
|
||||
.appendQueryParameter(DatabaseUtils.QUERY_KEY_USERID, queryUserIdString)
|
||||
.build();
|
||||
|
||||
return query(appUsageEventUri);
|
||||
}
|
||||
|
||||
private Cursor getCursorOfBatteryEvents(
|
||||
final long queryTimestamp, final List<Integer> batteryEventTypes) {
|
||||
final String batteryEventTypesString = batteryEventTypes.stream()
|
||||
.map(type -> String.valueOf(type))
|
||||
.collect(Collectors.joining(","));
|
||||
final Uri batteryEventUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(DatabaseUtils.AUTHORITY)
|
||||
.appendPath(DatabaseUtils.BATTERY_EVENT_TABLE)
|
||||
.appendQueryParameter(
|
||||
DatabaseUtils.QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.appendQueryParameter(
|
||||
DatabaseUtils.QUERY_BATTERY_EVENT_TYPE, batteryEventTypesString)
|
||||
.build();
|
||||
|
||||
return query(batteryEventUri);
|
||||
}
|
||||
|
||||
private Cursor getCursorOfBatteryUsageSlots(final long queryTimestamp) {
|
||||
final Uri batteryUsageSlotUri =
|
||||
new Uri.Builder()
|
||||
.scheme(ContentResolver.SCHEME_CONTENT)
|
||||
.authority(DatabaseUtils.AUTHORITY)
|
||||
.appendPath(DatabaseUtils.BATTERY_USAGE_SLOT_TABLE)
|
||||
.appendQueryParameter(
|
||||
DatabaseUtils.QUERY_KEY_TIMESTAMP, Long.toString(queryTimestamp))
|
||||
.build();
|
||||
|
||||
return query(batteryUsageSlotUri);
|
||||
}
|
||||
|
||||
private Cursor query(Uri uri) {
|
||||
return mProvider.query(
|
||||
appUsageEventUri, /*strings=*/ null, /*s=*/ null, /*strings1=*/ null, /*s1=*/ null);
|
||||
uri, /*strings=*/ null, /*s=*/ null, /*strings1=*/ null, /*s1=*/ null);
|
||||
}
|
||||
}
|
||||
|
@@ -22,6 +22,7 @@ import static org.mockito.ArgumentMatchers.any;
|
||||
import static org.mockito.Mockito.doReturn;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.content.ContentResolver;
|
||||
@@ -31,6 +32,7 @@ import android.content.pm.PackageManager;
|
||||
import android.os.BatteryStatsManager;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.UserManager;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -43,6 +45,7 @@ import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -56,6 +59,8 @@ public final class BatteryUsageDataLoaderTest {
|
||||
@Mock
|
||||
private PackageManager mPackageManager;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
@Mock
|
||||
private BatteryUsageStats mBatteryUsageStats;
|
||||
@Mock
|
||||
private BatteryEntry mMockBatteryEntry;
|
||||
@@ -70,6 +75,7 @@ public final class BatteryUsageDataLoaderTest {
|
||||
doReturn(mBatteryStatsManager).when(mContext).getSystemService(
|
||||
Context.BATTERY_STATS_SERVICE);
|
||||
doReturn(mPackageManager).when(mContext).getPackageManager();
|
||||
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
|
||||
doReturn(mMockContentResolver).when(mContext).getContentResolver();
|
||||
doReturn(new Intent()).when(mContext).registerReceiver(any(), any());
|
||||
}
|
||||
@@ -82,7 +88,7 @@ public final class BatteryUsageDataLoaderTest {
|
||||
.thenReturn(mBatteryUsageStats);
|
||||
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> batteryEntryList;
|
||||
|
||||
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
|
||||
BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
|
||||
|
||||
final int queryFlags = mStatsQueryCaptor.getValue().getFlags();
|
||||
assertThat(queryFlags
|
||||
@@ -97,7 +103,7 @@ public final class BatteryUsageDataLoaderTest {
|
||||
.thenReturn(mBatteryUsageStats);
|
||||
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> null;
|
||||
|
||||
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
|
||||
BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
|
||||
|
||||
verify(mMockContentResolver).insert(any(), any());
|
||||
}
|
||||
@@ -108,8 +114,51 @@ public final class BatteryUsageDataLoaderTest {
|
||||
.thenReturn(mBatteryUsageStats);
|
||||
BatteryUsageDataLoader.sFakeBatteryEntryListSupplier = () -> new ArrayList<>();
|
||||
|
||||
BatteryUsageDataLoader.loadUsageData(mContext, /*isFullChargeStart=*/ false);
|
||||
BatteryUsageDataLoader.loadBatteryStatsData(mContext, /*isFullChargeStart=*/ false);
|
||||
|
||||
verify(mMockContentResolver).insert(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_withData_insertFakeDataIntoProvider() {
|
||||
final List<AppUsageEvent> AppUsageEventList = new ArrayList<>();
|
||||
final AppUsageEvent appUsageEvent = AppUsageEvent.newBuilder().setUid(0).build();
|
||||
AppUsageEventList.add(appUsageEvent);
|
||||
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> AppUsageEventList;
|
||||
|
||||
BatteryUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verify(mMockContentResolver).bulkInsert(any(), any());
|
||||
verify(mMockContentResolver).notifyChange(any(), any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_nullAppUsageEvents_notInsertDataIntoProvider() {
|
||||
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> null;
|
||||
|
||||
BatteryUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_nullUsageEventsList_notInsertDataIntoProvider() {
|
||||
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> null;
|
||||
|
||||
BatteryUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void loadAppUsageData_emptyUsageEventsList_notInsertDataIntoProvider() {
|
||||
BatteryUsageDataLoader.sFakeAppUsageEventsSupplier = () -> new HashMap<>();
|
||||
BatteryUsageDataLoader.sFakeUsageEventsListSupplier = () -> new ArrayList<>();
|
||||
|
||||
BatteryUsageDataLoader.loadAppUsageData(mContext);
|
||||
|
||||
verifyNoMoreInteractions(mMockContentResolver);
|
||||
}
|
||||
}
|
||||
|
@@ -39,6 +39,7 @@ import android.os.UserHandle;
|
||||
|
||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity;
|
||||
import com.android.settings.fuelgauge.batteryusage.db.BatteryUsageSlotEntity;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@@ -48,7 +49,10 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.TimeZone;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
@@ -212,6 +216,22 @@ public final class ConvertUtilsTest {
|
||||
assertThat(values.getAsInteger(BatteryEventEntity.KEY_BATTERY_LEVEL)).isEqualTo(66);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertBatteryUsageSlotToContentValues_normalCase_returnsExpectedContentValues() {
|
||||
final BatteryUsageSlot batteryUsageSlot =
|
||||
BatteryUsageSlot.newBuilder()
|
||||
.setStartTimestamp(10001L)
|
||||
.setEndTimestamp(30003L)
|
||||
.setStartBatteryLevel(88)
|
||||
.setEndBatteryLevel(66)
|
||||
.setScreenOnTime(123L)
|
||||
.build();
|
||||
final ContentValues values =
|
||||
ConvertUtils.convertBatteryUsageSlotToContentValues(batteryUsageSlot);
|
||||
assertThat(values.getAsLong(BatteryUsageSlotEntity.KEY_TIMESTAMP)).isEqualTo(10001L);
|
||||
assertThat(BatteryUsageSlotEntity.KEY_BATTERY_USAGE_SLOT).isNotEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertToBatteryHistEntry_returnsExpectedResult() {
|
||||
final int expectedType = 3;
|
||||
@@ -363,7 +383,7 @@ public final class ConvertUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertToAppUsageEventFromCursor_returnExpectedResult() {
|
||||
public void convertToAppUsageEvent_returnExpectedResult() {
|
||||
final MatrixCursor cursor = new MatrixCursor(
|
||||
new String[]{
|
||||
AppUsageEventEntity.KEY_UID,
|
||||
@@ -384,7 +404,7 @@ public final class ConvertUtilsTest {
|
||||
100001L});
|
||||
cursor.moveToFirst();
|
||||
|
||||
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEventFromCursor(cursor);
|
||||
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(cursor);
|
||||
|
||||
assertThat(appUsageEvent.getUid()).isEqualTo(101L);
|
||||
assertThat(appUsageEvent.getUserId()).isEqualTo(1001L);
|
||||
@@ -396,7 +416,7 @@ public final class ConvertUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertToAppUsageEventFromCursor_emptyInstanceIdAndRootName_returnExpectedResult() {
|
||||
public void convertToAppUsageEvent_emptyInstanceIdAndRootName_returnExpectedResult() {
|
||||
final MatrixCursor cursor = new MatrixCursor(
|
||||
new String[]{
|
||||
AppUsageEventEntity.KEY_UID,
|
||||
@@ -413,7 +433,7 @@ public final class ConvertUtilsTest {
|
||||
AppUsageEventType.DEVICE_SHUTDOWN.getNumber()});
|
||||
cursor.moveToFirst();
|
||||
|
||||
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEventFromCursor(cursor);
|
||||
final AppUsageEvent appUsageEvent = ConvertUtils.convertToAppUsageEvent(cursor);
|
||||
|
||||
assertThat(appUsageEvent.getUid()).isEqualTo(101L);
|
||||
assertThat(appUsageEvent.getUserId()).isEqualTo(1001L);
|
||||
@@ -433,6 +453,42 @@ public final class ConvertUtilsTest {
|
||||
assertThat(batteryEvent.getBatteryLevel()).isEqualTo(88);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertToBatteryEventList_normalCase_returnsExpectedResult() {
|
||||
final BatteryLevelData batteryLevelData = new BatteryLevelData(Map.of(
|
||||
1691589600000L, 98, 1691596800000L, 90, 1691596812345L, 80));
|
||||
|
||||
final List<BatteryEvent> batteryEventList =
|
||||
ConvertUtils.convertToBatteryEventList(batteryLevelData);
|
||||
|
||||
assertThat(batteryEventList).hasSize(2);
|
||||
assertThat(batteryEventList.get(0).getTimestamp()).isEqualTo(1691589600000L);
|
||||
assertThat(batteryEventList.get(0).getType()).isEqualTo(BatteryEventType.EVEN_HOUR);
|
||||
assertThat(batteryEventList.get(0).getBatteryLevel()).isEqualTo(98);
|
||||
assertThat(batteryEventList.get(1).getTimestamp()).isEqualTo(1691596800000L);
|
||||
assertThat(batteryEventList.get(1).getType()).isEqualTo(BatteryEventType.EVEN_HOUR);
|
||||
assertThat(batteryEventList.get(1).getBatteryLevel()).isEqualTo(90);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void convertToBatteryUsageSlotList_normalCase_returnsExpectedResult() {
|
||||
BatteryDiffData batteryDiffData1 = new BatteryDiffData(
|
||||
mContext, 11L, 12L, 13, 14, 15, List.of(), List.of(), Set.of(), Set.of(), false);
|
||||
BatteryDiffData batteryDiffData2 = new BatteryDiffData(
|
||||
mContext, 21L, 22L, 23, 24, 25, List.of(), List.of(), Set.of(), Set.of(), false);
|
||||
BatteryDiffData batteryDiffData3 = new BatteryDiffData(
|
||||
mContext, 31L, 32L, 33, 34, 35, List.of(), List.of(), Set.of(), Set.of(), false);
|
||||
final Map<Long, BatteryDiffData> batteryDiffDataMap = Map.of(
|
||||
11L, batteryDiffData1, 21L, batteryDiffData2, 31L, batteryDiffData3);
|
||||
|
||||
final List<BatteryUsageSlot> batteryUsageSlotList =
|
||||
ConvertUtils.convertToBatteryUsageSlotList(batteryDiffDataMap);
|
||||
|
||||
assertThat(batteryUsageSlotList).hasSize(3);
|
||||
assertThat(batteryUsageSlotList.stream().map((s) -> s.getScreenOnTime()).sorted().toList())
|
||||
.isEqualTo(List.of(15L, 25L, 35L));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLocale_nullContext_returnDefaultLocale() {
|
||||
assertThat(ConvertUtils.getLocale(/*context=*/ null))
|
||||
|
@@ -30,8 +30,12 @@ import android.app.usage.UsageEvents;
|
||||
import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.database.Cursor;
|
||||
import android.database.MatrixCursor;
|
||||
import android.os.BatteryManager;
|
||||
import android.os.BatteryStatsManager;
|
||||
import android.os.BatteryUsageStats;
|
||||
import android.os.BatteryUsageStatsQuery;
|
||||
import android.os.Parcel;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserManager;
|
||||
@@ -39,9 +43,12 @@ import android.text.format.DateUtils;
|
||||
|
||||
import com.android.settings.fuelgauge.batteryusage.db.AppUsageEventEntity;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.ArgumentCaptor;
|
||||
import org.mockito.Captor;
|
||||
import org.mockito.Mock;
|
||||
import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
@@ -52,6 +59,7 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class DataProcessManagerTest {
|
||||
@@ -65,7 +73,13 @@ public final class DataProcessManagerTest {
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
@Mock
|
||||
private BatteryStatsManager mBatteryStatsManager;
|
||||
@Mock
|
||||
private BatteryUsageStats mBatteryUsageStats;
|
||||
@Mock
|
||||
private Intent mIntent;
|
||||
@Captor
|
||||
private ArgumentCaptor<BatteryUsageStatsQuery> mBatteryUsageStatsQueryCaptor;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
@@ -77,22 +91,32 @@ public final class DataProcessManagerTest {
|
||||
doReturn(mUserManager)
|
||||
.when(mContext)
|
||||
.getSystemService(UserManager.class);
|
||||
doReturn(mBatteryStatsManager).when(mContext).getSystemService(
|
||||
Context.BATTERY_STATS_SERVICE);
|
||||
doReturn(mBatteryUsageStats).when(
|
||||
mBatteryStatsManager).getBatteryUsageStats(mBatteryUsageStatsQueryCaptor.capture());
|
||||
doReturn(mIntent).when(mContext).registerReceiver(any(), any());
|
||||
doReturn(100).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_SCALE), anyInt());
|
||||
doReturn(66).when(mIntent).getIntExtra(eq(BatteryManager.EXTRA_LEVEL), anyInt());
|
||||
|
||||
mDataProcessManager = new DataProcessManager(
|
||||
mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 0L,
|
||||
/*callbackFunction=*/ null, /*hourlyBatteryLevelsPerDay=*/ new ArrayList<>(),
|
||||
/*lastFullChargeTimestamp=*/ 0L, /*callbackFunction=*/ null,
|
||||
/*hourlyBatteryLevelsPerDay=*/ new ArrayList<>(),
|
||||
/*batteryHistoryMap=*/ new HashMap<>());
|
||||
}
|
||||
|
||||
@After
|
||||
public void cleanUp() {
|
||||
DatabaseUtils.sFakeSupplier = null;
|
||||
DataProcessManager.sFakeBatteryHistoryMap = null;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void constructor_noLevelData() {
|
||||
final DataProcessManager dataProcessManager =
|
||||
new DataProcessManager(mContext, /*handler=*/ null, /*callbackFunction=*/ null);
|
||||
assertThat(dataProcessManager.getShowScreenOnTime()).isFalse();
|
||||
assertThat(dataProcessManager.getShowBatteryLevel()).isFalse();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -122,16 +146,18 @@ public final class DataProcessManagerTest {
|
||||
final String packageName = "package";
|
||||
// Adds the day 1 data.
|
||||
final List<Long> timestamps1 = List.of(2L, 3L, 4L);
|
||||
final List<Integer> levels1 = List.of(100, 100, 100);
|
||||
final Map<Long, Integer> batteryLevelMap1 =
|
||||
Map.of(timestamps1.get(0), 100, timestamps1.get(1), 100, timestamps1.get(2), 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps1, levels1));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap1, timestamps1));
|
||||
// Adds the day 2 data.
|
||||
hourlyBatteryLevelsPerDay.add(null);
|
||||
// Adds the day 3 data.
|
||||
final List<Long> timestamps2 = List.of(5L, 6L);
|
||||
final List<Integer> levels2 = List.of(100, 100);
|
||||
final Map<Long, Integer> batteryLevelMap2 =
|
||||
Map.of(timestamps2.get(0), 100, timestamps2.get(1), 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps2, levels2));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap2, timestamps2));
|
||||
// Fake current usage data.
|
||||
final UsageEvents.Event event1 =
|
||||
getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1, packageName);
|
||||
@@ -171,10 +197,18 @@ public final class DataProcessManagerTest {
|
||||
cursor.addRow(new Object[] {
|
||||
AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 6, /*userId=*/ 1,
|
||||
/*instanceId=*/ 2, packageName});
|
||||
DatabaseUtils.sFakeSupplier = () -> cursor;
|
||||
DatabaseUtils.sFakeSupplier = new Supplier<>() {
|
||||
private int mTimes = 0;
|
||||
@Override
|
||||
public Cursor get() {
|
||||
mTimes++;
|
||||
return mTimes <= 2 ? null : cursor;
|
||||
}
|
||||
};
|
||||
|
||||
final DataProcessManager dataProcessManager = new DataProcessManager(
|
||||
mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 2L, /*callbackFunction=*/ null,
|
||||
mContext, /*handler=*/ null, /*rawStartTimestamp=*/ 2L,
|
||||
/*lastFullChargeTimestamp=*/ 1L, /*callbackFunction=*/ null,
|
||||
hourlyBatteryLevelsPerDay, /*batteryHistoryMap=*/ new HashMap<>());
|
||||
dataProcessManager.start();
|
||||
|
||||
@@ -254,12 +288,13 @@ public final class DataProcessManagerTest {
|
||||
assertThat(DataProcessManager.getBatteryLevelData(
|
||||
mContext,
|
||||
/*handler=*/ null,
|
||||
/*batteryHistoryMap=*/ null,
|
||||
/*asyncResponseDelegate=*/ null))
|
||||
.isNull();
|
||||
/*isFromPeriodJob=*/ false,
|
||||
/*asyncResponseDelegate=*/ null)).isNull();
|
||||
assertThat(DataProcessManager.getBatteryLevelData(
|
||||
mContext, /*handler=*/ null, new HashMap<>(), /*asyncResponseDelegate=*/ null))
|
||||
.isNull();
|
||||
mContext,
|
||||
/*handler=*/ null,
|
||||
/*isFromPeriodJob=*/ true,
|
||||
/*asyncResponseDelegate=*/ null)).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -270,18 +305,16 @@ public final class DataProcessManagerTest {
|
||||
DateUtils.HOUR_IN_MILLIS * 2 - 200L,
|
||||
DateUtils.HOUR_IN_MILLIS * 2 - 100L};
|
||||
final int[] levels = {100, 99, 98};
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
|
||||
createHistoryMap(timestamps, levels);
|
||||
DataProcessManager.sFakeBatteryHistoryMap = createHistoryMap(timestamps, levels);
|
||||
DataProcessor.sTestCurrentTimeMillis = timestamps[timestamps.length - 1];
|
||||
|
||||
final BatteryLevelData resultData =
|
||||
DataProcessManager.getBatteryLevelData(
|
||||
mContext,
|
||||
/*handler=*/ null,
|
||||
batteryHistoryMap,
|
||||
/*isFromPeriodJob=*/ false,
|
||||
/*asyncResponseDelegate=*/ null);
|
||||
|
||||
|
||||
final List<Long> expectedDailyTimestamps = List.of(
|
||||
DateUtils.HOUR_IN_MILLIS * 2 - 300L,
|
||||
DateUtils.HOUR_IN_MILLIS * 2 - 100L);
|
||||
@@ -301,15 +334,14 @@ public final class DataProcessManagerTest {
|
||||
// Timezone GMT+8: 2022-01-01 00:00:00, 2022-01-01 01:00:00
|
||||
final long[] timestamps = {1640966400000L, 1640970000000L};
|
||||
final int[] levels = {100, 99};
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
|
||||
createHistoryMap(timestamps, levels);
|
||||
DataProcessManager.sFakeBatteryHistoryMap = createHistoryMap(timestamps, levels);
|
||||
DataProcessor.sTestCurrentTimeMillis = timestamps[timestamps.length - 1];
|
||||
|
||||
final BatteryLevelData resultData =
|
||||
DataProcessManager.getBatteryLevelData(
|
||||
mContext,
|
||||
/*handler=*/ null,
|
||||
batteryHistoryMap,
|
||||
/*isFromPeriodJob=*/ false,
|
||||
/*asyncResponseDelegate=*/ null);
|
||||
|
||||
final List<Long> expectedDailyTimestamps = List.of(
|
||||
|
@@ -16,6 +16,9 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage;
|
||||
|
||||
import static com.android.settings.fuelgauge.batteryusage.ConvertUtils.FAKE_PACKAGE_NAME;
|
||||
import static com.android.settingslib.fuelgauge.BatteryStatus.BATTERY_LEVEL_UNKNOWN;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.anyInt;
|
||||
@@ -42,6 +45,7 @@ import android.os.BatteryUsageStats;
|
||||
import android.os.Parcel;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserManager;
|
||||
import android.util.ArrayMap;
|
||||
|
||||
import com.android.settings.fuelgauge.PowerUsageFeatureProvider;
|
||||
import com.android.settings.testutils.FakeFeatureFactory;
|
||||
@@ -188,16 +192,18 @@ public final class DataProcessorTest {
|
||||
final String packageName = "com.android.settings";
|
||||
// Adds the day 1 data.
|
||||
final List<Long> timestamps1 = List.of(14400000L, 18000000L, 21600000L);
|
||||
final List<Integer> levels1 = List.of(100, 100, 100);
|
||||
final Map<Long, Integer> batteryLevelMap1 =
|
||||
Map.of(timestamps1.get(0), 100, timestamps1.get(1), 100, timestamps1.get(2), 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps1, levels1));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap1, timestamps1));
|
||||
// Adds the day 2 data.
|
||||
hourlyBatteryLevelsPerDay.add(null);
|
||||
// Adds the day 3 data.
|
||||
final List<Long> timestamps2 = List.of(45200000L, 48800000L);
|
||||
final List<Integer> levels2 = List.of(100, 100);
|
||||
final Map<Long, Integer> batteryLevelMap2 =
|
||||
Map.of(timestamps2.get(0), 100, timestamps2.get(1), 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps2, levels2));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(batteryLevelMap2, timestamps2));
|
||||
final List<AppUsageEvent> appUsageEventList = new ArrayList<>();
|
||||
// Adds some events before the start timestamp.
|
||||
appUsageEventList.add(buildAppUsageEvent(
|
||||
@@ -285,7 +291,7 @@ public final class DataProcessorTest {
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(new ArrayList<>(), new ArrayList<>()));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(new ArrayMap<>(), new ArrayList<>()));
|
||||
assertThat(DataProcessor.generateAppUsagePeriodMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, new ArrayList<>(), new ArrayList<>()))
|
||||
.isNull();
|
||||
@@ -370,19 +376,6 @@ public final class DataProcessorTest {
|
||||
DataProcessor.CURRENT_TIME_BATTERY_HISTORY_PLACEHOLDER)).isTrue();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLevelDataThroughProcessedHistoryMap_notEnoughData_returnNull() {
|
||||
final long[] timestamps = {100L};
|
||||
final int[] levels = {100};
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap =
|
||||
createHistoryMap(timestamps, levels);
|
||||
DataProcessor.sTestCurrentTimeMillis = timestamps[timestamps.length - 1];
|
||||
|
||||
assertThat(
|
||||
DataProcessor.getLevelDataThroughProcessedHistoryMap(mContext, batteryHistoryMap))
|
||||
.isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLevelDataThroughProcessedHistoryMap_OneDayData_returnExpectedResult() {
|
||||
// Timezone GMT+8
|
||||
@@ -441,7 +434,7 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedDailyLevels = new ArrayList<>();
|
||||
expectedDailyLevels.add(100);
|
||||
expectedDailyLevels.add(null);
|
||||
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedDailyLevels.add(82);
|
||||
final List<List<Long>> expectedHourlyTimestamps = List.of(
|
||||
List.of(
|
||||
@@ -459,13 +452,13 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
|
||||
expectedHourlyLevels1.add(100);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
final List<Integer> expectedHourlyLevels2 = new ArrayList<>();
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(94);
|
||||
expectedHourlyLevels2.add(90);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(82);
|
||||
final List<List<Integer>> expectedHourlyLevels = List.of(
|
||||
expectedHourlyLevels1,
|
||||
@@ -503,8 +496,8 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedDailyLevels = new ArrayList<>();
|
||||
expectedDailyLevels.add(100);
|
||||
expectedDailyLevels.add(null);
|
||||
expectedDailyLevels.add(null);
|
||||
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedDailyLevels.add(88);
|
||||
final List<List<Long>> expectedHourlyTimestamps = List.of(
|
||||
List.of(
|
||||
@@ -542,32 +535,32 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
|
||||
expectedHourlyLevels1.add(100);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
final List<Integer> expectedHourlyLevels2 = new ArrayList<>();
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
final List<Integer> expectedHourlyLevels3 = new ArrayList<>();
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(88);
|
||||
final List<List<Integer>> expectedHourlyLevels = List.of(
|
||||
expectedHourlyLevels1,
|
||||
@@ -606,8 +599,8 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedDailyLevels = new ArrayList<>();
|
||||
expectedDailyLevels.add(100);
|
||||
expectedDailyLevels.add(null);
|
||||
expectedDailyLevels.add(null);
|
||||
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedDailyLevels.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedDailyLevels.add(88);
|
||||
final List<List<Long>> expectedHourlyTimestamps = List.of(
|
||||
List.of(
|
||||
@@ -638,25 +631,25 @@ public final class DataProcessorTest {
|
||||
);
|
||||
final List<Integer> expectedHourlyLevels1 = new ArrayList<>();
|
||||
expectedHourlyLevels1.add(100);
|
||||
expectedHourlyLevels1.add(null);
|
||||
expectedHourlyLevels1.add(BATTERY_LEVEL_UNKNOWN);
|
||||
final List<Integer> expectedHourlyLevels2 = new ArrayList<>();
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(null);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels2.add(BATTERY_LEVEL_UNKNOWN);
|
||||
final List<Integer> expectedHourlyLevels3 = new ArrayList<>();
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(null);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(BATTERY_LEVEL_UNKNOWN);
|
||||
expectedHourlyLevels3.add(88);
|
||||
final List<List<Integer>> expectedHourlyLevels = List.of(
|
||||
expectedHourlyLevels1,
|
||||
@@ -734,141 +727,6 @@ public final class DataProcessorTest {
|
||||
verifyExpectedTimestampSlots(startTimestamp, endTimestamp, expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_notEnoughData_returnEmptyList() {
|
||||
assertThat(DataProcessor.getDailyTimestamps(new ArrayList<>())).isEmpty();
|
||||
assertThat(DataProcessor.getDailyTimestamps(List.of(100L))).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_allDataInOneHour_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640970006000L, // 2022-01-01 01:00:06
|
||||
1640973608000L // 2022-01-01 01:00:08
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640970006000L, // 2022-01-01 01:00:06
|
||||
1640973608000L // 2022-01-01 01:00:08
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_OneHourDataPerDay_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L // 2022-01-02 01:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L // 2022-01-02 01:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_OneDayData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640966400000L, // 2022-01-01 00:00:00
|
||||
1640970000000L, // 2022-01-01 01:00:00
|
||||
1640973600000L, // 2022-01-01 02:00:00
|
||||
1640977200000L, // 2022-01-01 03:00:00
|
||||
1640980800000L // 2022-01-01 04:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640966400000L, // 2022-01-01 00:00:00
|
||||
1640980800000L // 2022-01-01 04:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_MultipleDaysData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641232800000L // 2022-01-04 02:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641232800000L // 2022-01-04 02:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_FirstDayOneHourData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641254400000L // 2022-01-04 08:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641254400000L // 2022-01-04 08:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_LastDayNoData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641225600000L // 2022-01-04 00:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L // 2022-01-04 00:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDailyTimestamps_LastDayOneHourData_returnExpectedList() {
|
||||
// Timezone GMT+8
|
||||
final List<Long> timestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641060000000L, // 2022-01-02 02:00:00
|
||||
1641160800000L, // 2022-01-03 06:00:00
|
||||
1641229200000L // 2022-01-04 01:00:00
|
||||
);
|
||||
|
||||
final List<Long> expectedTimestamps = List.of(
|
||||
1640988000000L, // 2022-01-01 06:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641139200000L, // 2022-01-03 00:00:00
|
||||
1641225600000L, // 2022-01-04 00:00:00
|
||||
1641229200000L // 2022-01-04 01:00:00
|
||||
);
|
||||
assertThat(DataProcessor.getDailyTimestamps(timestamps)).isEqualTo(expectedTimestamps);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void isFromFullCharge_emptyData_returnFalse() {
|
||||
assertThat(DataProcessor.isFromFullCharge(null)).isFalse();
|
||||
@@ -916,20 +774,53 @@ public final class DataProcessorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_emptyHistoryMap_returnNull() {
|
||||
public void getBatteryDiffDataMap_emptyHistoryMap_returnEmpty() {
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(new ArrayList<>(), new ArrayList<>()));
|
||||
new BatteryLevelData.PeriodBatteryLevelData(new ArrayMap<>(), new ArrayList<>()));
|
||||
|
||||
assertThat(DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, new HashMap<>(), /*appUsagePeriodMap=*/ null))
|
||||
.isNull();
|
||||
assertThat(DataProcessor.getBatteryDiffDataMap(mContext, hourlyBatteryLevelsPerDay,
|
||||
new HashMap<>(), /*appUsagePeriodMap=*/ null, Set.of(), Set.of())).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_returnsExpectedResult() {
|
||||
public void getBatteryDiffDataMap_normalFlow_returnExpectedResult() {
|
||||
final int userId = mContext.getUserId();
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
};
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = Map.of(
|
||||
batteryHistoryKeys[0], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
|
||||
FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0, 0, 0,
|
||||
0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)),
|
||||
batteryHistoryKeys[1], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
|
||||
FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 5, 0, 0,
|
||||
0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)),
|
||||
batteryHistoryKeys[2], Map.of(FAKE_PACKAGE_NAME, createBatteryHistEntry(
|
||||
FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 16, 0, 0,
|
||||
0, 0, 0L, userId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, 0L, 0L, false)));
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
|
||||
appUsagePeriodMap = Map.of(0, Map.of(0, Map.of(Long.valueOf(userId), Map.of(
|
||||
FAKE_PACKAGE_NAME, List.of(buildAppUsagePeriod(0, 6))))));
|
||||
|
||||
Map<Long, BatteryDiffData> batteryDiffDataMap = DataProcessor.getBatteryDiffDataMap(
|
||||
mContext, batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
appUsagePeriodMap, Set.of(), Set.of());
|
||||
|
||||
assertThat(batteryDiffDataMap).hasSize(1);
|
||||
assertThat(batteryDiffDataMap).containsKey(batteryHistoryKeys[0]);
|
||||
BatteryDiffData batteryDiffData = batteryDiffDataMap.get(batteryHistoryKeys[0]);
|
||||
assertThat(batteryDiffData.getStartTimestamp()).isEqualTo(batteryHistoryKeys[0]);
|
||||
assertThat(batteryDiffData.getEndTimestamp()).isEqualTo(batteryHistoryKeys[2]);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void generateBatteryUsageMap_returnsExpectedResult() {
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641045600000L, // 2022-01-01 22:00:00
|
||||
1641049200000L, // 2022-01-01 23:00:00
|
||||
@@ -940,7 +831,7 @@ public final class DataProcessorTest {
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
|
||||
final int currentUserId = mContext.getUserId();
|
||||
final BatteryHistEntry fakeEntry = createBatteryHistEntry(
|
||||
ConvertUtils.FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
|
||||
FAKE_PACKAGE_NAME, "fake_label", /*consumePower=*/ 0,
|
||||
/*foregroundUsageConsumePower=*/ 0, /*foregroundServiceUsageConsumePower=*/ 0,
|
||||
/*backgroundUsageConsumePower=*/ 0, /*cachedUsageConsumePower=*/ 0,
|
||||
/*uid=*/ 0L, currentUserId, ConvertUtils.CONSUMER_TYPE_UID_BATTERY,
|
||||
@@ -1030,19 +921,7 @@ public final class DataProcessorTest {
|
||||
entryMap.put(entry.getKey(), entry);
|
||||
entryMap.put(fakeEntry.getKey(), fakeEntry);
|
||||
batteryHistoryMap.put(batteryHistoryKeys[4], entryMap);
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
// Adds the day 1 data.
|
||||
List<Long> timestamps =
|
||||
List.of(batteryHistoryKeys[0], batteryHistoryKeys[2]);
|
||||
final List<Integer> levels = List.of(100, 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
// Adds the day 2 data.
|
||||
timestamps = List.of(batteryHistoryKeys[2], batteryHistoryKeys[4]);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
// Adds app usage data to test screen on time.
|
||||
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
|
||||
appUsagePeriodMap = new HashMap<>();
|
||||
@@ -1066,8 +945,12 @@ public final class DataProcessorTest {
|
||||
appUsagePeriodMap.get(1).put(0, appUsageMap);
|
||||
|
||||
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
|
||||
DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, batteryHistoryMap, appUsagePeriodMap);
|
||||
DataProcessor.generateBatteryUsageMap(
|
||||
mContext,
|
||||
DataProcessor.getBatteryDiffDataMap(mContext,
|
||||
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
appUsagePeriodMap, Set.of(), Set.of()),
|
||||
batteryLevelData);
|
||||
|
||||
BatteryDiffData resultDiffData =
|
||||
resultMap
|
||||
@@ -1128,7 +1011,7 @@ public final class DataProcessorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_multipleUsers_returnsExpectedResult() {
|
||||
public void generateBatteryUsageMap_multipleUsers_returnsExpectedResult() {
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L, // 2022-01-02 01:00:00
|
||||
@@ -1217,17 +1100,15 @@ public final class DataProcessorTest {
|
||||
/*backgroundUsageTimeInMs=*/ 30L, /*isHidden=*/ false);
|
||||
entryMap.put(entry.getKey(), entry);
|
||||
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
List<Long> timestamps = List.of(batteryHistoryKeys[0], batteryHistoryKeys[2]);
|
||||
final List<Integer> levels = List.of(100, 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
|
||||
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
|
||||
DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null);
|
||||
DataProcessor.generateBatteryUsageMap(
|
||||
mContext,
|
||||
DataProcessor.getBatteryDiffDataMap(mContext,
|
||||
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
|
||||
batteryLevelData);
|
||||
|
||||
final BatteryDiffData resultDiffData =
|
||||
resultMap
|
||||
@@ -1247,7 +1128,7 @@ public final class DataProcessorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_usageTimeExceed_returnsExpectedResult() {
|
||||
public void generateBatteryUsageMap_usageTimeExceed_returnsExpectedResult() {
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L, // 2022-01-02 01:00:00
|
||||
@@ -1288,12 +1169,7 @@ public final class DataProcessorTest {
|
||||
/*backgroundUsageTimeInMs=*/ 7200000L, /*isHidden=*/ false);
|
||||
entryMap.put(entry.getKey(), entry);
|
||||
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
List<Long> timestamps = List.of(batteryHistoryKeys[0], batteryHistoryKeys[2]);
|
||||
final List<Integer> levels = List.of(100, 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
|
||||
// Adds app usage data to test screen on time.
|
||||
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
|
||||
@@ -1307,8 +1183,12 @@ public final class DataProcessorTest {
|
||||
appUsagePeriodMap.get(0).put(0, appUsageMap);
|
||||
|
||||
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
|
||||
DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, batteryHistoryMap, appUsagePeriodMap);
|
||||
DataProcessor.generateBatteryUsageMap(
|
||||
mContext,
|
||||
DataProcessor.getBatteryDiffDataMap(mContext,
|
||||
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
appUsagePeriodMap, Set.of(), Set.of()),
|
||||
batteryLevelData);
|
||||
|
||||
final BatteryDiffData resultDiffData =
|
||||
resultMap
|
||||
@@ -1338,7 +1218,7 @@ public final class DataProcessorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_hideApplicationEntries_returnsExpectedResult() {
|
||||
public void generateBatteryUsageMap_hideApplicationEntries_returnsExpectedResult() {
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L, // 2022-01-02 01:00:00
|
||||
@@ -1403,19 +1283,17 @@ public final class DataProcessorTest {
|
||||
/*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
|
||||
entryMap.put(entry.getKey(), entry);
|
||||
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
List<Long> timestamps = List.of(batteryHistoryKeys[0], batteryHistoryKeys[2]);
|
||||
final List<Integer> levels = List.of(100, 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
when(mPowerUsageFeatureProvider.getHideApplicationSet())
|
||||
.thenReturn(Set.of("package1"));
|
||||
|
||||
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
|
||||
DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null);
|
||||
DataProcessor.generateBatteryUsageMap(
|
||||
mContext,
|
||||
DataProcessor.getBatteryDiffDataMap(mContext,
|
||||
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
|
||||
batteryLevelData);
|
||||
|
||||
final BatteryDiffData resultDiffData =
|
||||
resultMap
|
||||
@@ -1431,7 +1309,7 @@ public final class DataProcessorTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryUsageMap_hideBackgroundUsageTime_returnsExpectedResult() {
|
||||
public void generateBatteryUsageMap_hideBackgroundUsageTime_returnsExpectedResult() {
|
||||
final long[] batteryHistoryKeys = new long[]{
|
||||
1641052800000L, // 2022-01-02 00:00:00
|
||||
1641056400000L, // 2022-01-02 01:00:00
|
||||
@@ -1496,19 +1374,17 @@ public final class DataProcessorTest {
|
||||
/*backgroundUsageTimeInMs=*/ 20L, /*isHidden=*/ false);
|
||||
entryMap.put(entry.getKey(), entry);
|
||||
batteryHistoryMap.put(batteryHistoryKeys[2], entryMap);
|
||||
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
|
||||
new ArrayList<>();
|
||||
List<Long> timestamps = List.of(batteryHistoryKeys[0], batteryHistoryKeys[2]);
|
||||
final List<Integer> levels = List.of(100, 100);
|
||||
hourlyBatteryLevelsPerDay.add(
|
||||
new BatteryLevelData.PeriodBatteryLevelData(timestamps, levels));
|
||||
final BatteryLevelData batteryLevelData = generateBatteryLevelData(batteryHistoryKeys);
|
||||
when(mPowerUsageFeatureProvider.getHideBackgroundUsageTimeSet())
|
||||
.thenReturn(new HashSet(Arrays.asList((CharSequence) "package2")));
|
||||
|
||||
final Map<Integer, Map<Integer, BatteryDiffData>> resultMap =
|
||||
DataProcessor.getBatteryUsageMap(
|
||||
mContext, hourlyBatteryLevelsPerDay, batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null);
|
||||
DataProcessor.generateBatteryUsageMap(
|
||||
mContext,
|
||||
DataProcessor.getBatteryDiffDataMap(mContext,
|
||||
batteryLevelData.getHourlyBatteryLevelsPerDay(), batteryHistoryMap,
|
||||
/*appUsagePeriodMap=*/ null, Set.of(), Set.of()),
|
||||
batteryLevelData);
|
||||
|
||||
final BatteryDiffData resultDiffData =
|
||||
resultMap
|
||||
@@ -1523,7 +1399,10 @@ public final class DataProcessorTest {
|
||||
@Test
|
||||
public void generateBatteryDiffData_emptyBatteryEntryList_returnNull() {
|
||||
assertThat(DataProcessor.generateBatteryDiffData(mContext,
|
||||
DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats))).isNull();
|
||||
System.currentTimeMillis(),
|
||||
DataProcessor.convertToBatteryHistEntry(null, mBatteryUsageStats),
|
||||
/* systemAppsPackageNames= */ Set.of(),
|
||||
/* systemAppsUids= */ Set.of())).isNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -1574,7 +1453,10 @@ public final class DataProcessorTest {
|
||||
.when(mMockBatteryEntry4).getPowerComponentId();
|
||||
|
||||
final BatteryDiffData batteryDiffData = DataProcessor.generateBatteryDiffData(mContext,
|
||||
DataProcessor.convertToBatteryHistEntry(batteryEntryList, mBatteryUsageStats));
|
||||
System.currentTimeMillis(),
|
||||
DataProcessor.convertToBatteryHistEntry(batteryEntryList, mBatteryUsageStats),
|
||||
/* systemAppsPackageNames= */ Set.of(),
|
||||
/* systemAppsUids= */ Set.of());
|
||||
|
||||
assertBatteryDiffEntry(
|
||||
batteryDiffData.getAppDiffEntryList().get(0), 0, /*uid=*/ 2L,
|
||||
@@ -2041,9 +1923,9 @@ public final class DataProcessorTest {
|
||||
final double backgroundUsageConsumePower, final double cachedUsageConsumePower,
|
||||
final long foregroundUsageTimeInMs, final long backgroundUsageTimeInMs,
|
||||
final long screenOnTimeInMs) {
|
||||
assertThat(entry.mBatteryHistEntry.mUserId).isEqualTo(userId);
|
||||
assertThat(entry.mBatteryHistEntry.mUid).isEqualTo(uid);
|
||||
assertThat(entry.mBatteryHistEntry.mConsumerType).isEqualTo(consumerType);
|
||||
assertThat(entry.mUserId).isEqualTo(userId);
|
||||
assertThat(entry.mUid).isEqualTo(uid);
|
||||
assertThat(entry.mConsumerType).isEqualTo(consumerType);
|
||||
assertThat(entry.getPercentage()).isEqualTo(consumePercentage);
|
||||
assertThat(entry.mForegroundUsageConsumePower).isEqualTo(foregroundUsageConsumePower);
|
||||
assertThat(entry.mForegroundServiceUsageConsumePower)
|
||||
@@ -2054,4 +1936,12 @@ public final class DataProcessorTest {
|
||||
assertThat(entry.mBackgroundUsageTimeInMs).isEqualTo(backgroundUsageTimeInMs);
|
||||
assertThat(entry.mScreenOnTimeInMs).isEqualTo(screenOnTimeInMs);
|
||||
}
|
||||
|
||||
private BatteryLevelData generateBatteryLevelData(long[] timestamps) {
|
||||
Map<Long, Integer> batteryLevelMap = new ArrayMap<>();
|
||||
for (long timestamp : timestamps) {
|
||||
batteryLevelMap.put(timestamp, 100);
|
||||
}
|
||||
return new BatteryLevelData(batteryLevelMap);
|
||||
}
|
||||
}
|
||||
|
@@ -173,8 +173,8 @@ public final class DatabaseUtilsTest {
|
||||
doReturn(null).when(mContext).registerReceiver(any(), any());
|
||||
assertThat(
|
||||
DatabaseUtils.sendBatteryEntryData(
|
||||
mContext, /*batteryEntryList=*/ null, mBatteryUsageStats,
|
||||
/*isFullChargeStart=*/ false))
|
||||
mContext, System.currentTimeMillis(), /*batteryEntryList=*/ null,
|
||||
mBatteryUsageStats, /*isFullChargeStart=*/ false))
|
||||
.isNull();
|
||||
}
|
||||
|
||||
@@ -193,7 +193,10 @@ public final class DatabaseUtilsTest {
|
||||
|
||||
final List<ContentValues> valuesList =
|
||||
DatabaseUtils.sendBatteryEntryData(
|
||||
mContext, batteryEntryList, mBatteryUsageStats,
|
||||
mContext,
|
||||
System.currentTimeMillis(),
|
||||
batteryEntryList,
|
||||
mBatteryUsageStats,
|
||||
/*isFullChargeStart=*/ false);
|
||||
|
||||
assertThat(valuesList).hasSize(2);
|
||||
@@ -216,6 +219,7 @@ public final class DatabaseUtilsTest {
|
||||
final List<ContentValues> valuesList =
|
||||
DatabaseUtils.sendBatteryEntryData(
|
||||
mContext,
|
||||
System.currentTimeMillis(),
|
||||
new ArrayList<>(),
|
||||
mBatteryUsageStats,
|
||||
/*isFullChargeStart=*/ false);
|
||||
@@ -235,6 +239,7 @@ public final class DatabaseUtilsTest {
|
||||
final List<ContentValues> valuesList =
|
||||
DatabaseUtils.sendBatteryEntryData(
|
||||
mContext,
|
||||
System.currentTimeMillis(),
|
||||
/*batteryEntryList=*/ null,
|
||||
mBatteryUsageStats,
|
||||
/*isFullChargeStart=*/ false);
|
||||
@@ -254,6 +259,7 @@ public final class DatabaseUtilsTest {
|
||||
final List<ContentValues> valuesList =
|
||||
DatabaseUtils.sendBatteryEntryData(
|
||||
mContext,
|
||||
System.currentTimeMillis(),
|
||||
/*batteryEntryList=*/ null,
|
||||
/*batteryUsageStats=*/ null,
|
||||
/*isFullChargeStart=*/ false);
|
||||
@@ -359,7 +365,7 @@ public final class DatabaseUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHistoryMapSinceLastFullCharge_emptyCursorContent_returnEmptyMap() {
|
||||
public void getHistoryMap_emptyCursorContent_returnEmptyMap() {
|
||||
final MatrixCursor cursor = new MatrixCursor(
|
||||
new String[] {
|
||||
BatteryHistEntry.KEY_UID,
|
||||
@@ -367,36 +373,33 @@ public final class DatabaseUtilsTest {
|
||||
BatteryHistEntry.KEY_TIMESTAMP});
|
||||
DatabaseUtils.sFakeSupplier = () -> cursor;
|
||||
|
||||
assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge(
|
||||
mContext, /*calendar=*/ null)).isEmpty();
|
||||
assertThat(DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0)).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHistoryMapSinceLastFullCharge_nullCursor_returnEmptyMap() {
|
||||
public void getHistoryMap_nullCursor_returnEmptyMap() {
|
||||
DatabaseUtils.sFakeSupplier = () -> null;
|
||||
assertThat(DatabaseUtils.getHistoryMapSinceLastFullCharge(
|
||||
mContext, /*calendar=*/ null)).isEmpty();
|
||||
assertThat(DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0)).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHistoryMapSinceLastFullCharge_returnExpectedMap() {
|
||||
public void getHistoryMap_returnExpectedMap() {
|
||||
final Long timestamp1 = Long.valueOf(1001L);
|
||||
final Long timestamp2 = Long.valueOf(1002L);
|
||||
final MatrixCursor cursor = getMatrixCursor();
|
||||
// Adds fake data into the cursor.
|
||||
cursor.addRow(new Object[] {
|
||||
"app name1", timestamp1, 1, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
|
||||
"app name1", timestamp1, 1, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, true});
|
||||
cursor.addRow(new Object[] {
|
||||
"app name2", timestamp2, 2, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
|
||||
"app name2", timestamp2, 2, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
|
||||
cursor.addRow(new Object[] {
|
||||
"app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
|
||||
"app name3", timestamp2, 3, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
|
||||
cursor.addRow(new Object[] {
|
||||
"app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY});
|
||||
"app name4", timestamp2, 4, ConvertUtils.CONSUMER_TYPE_UID_BATTERY, false});
|
||||
DatabaseUtils.sFakeSupplier = () -> cursor;
|
||||
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
|
||||
DatabaseUtils.getHistoryMapSinceLastFullCharge(
|
||||
mContext, /*calendar=*/ null);
|
||||
DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, timestamp1);
|
||||
|
||||
assertThat(batteryHistMap).hasSize(2);
|
||||
// Verifies the BatteryHistEntry data for timestamp1.
|
||||
@@ -412,7 +415,7 @@ public final class DatabaseUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getHistoryMapSinceLastFullCharge_withWorkProfile_returnExpectedMap()
|
||||
public void getHistoryMap_withWorkProfile_returnExpectedMap()
|
||||
throws PackageManager.NameNotFoundException {
|
||||
doReturn("com.fake.package").when(mContext).getPackageName();
|
||||
doReturn(mMockContext).when(mContext).createPackageContextAsUser(
|
||||
@@ -425,8 +428,7 @@ public final class DatabaseUtilsTest {
|
||||
DatabaseUtils.sFakeSupplier = () -> getMatrixCursor();
|
||||
|
||||
final Map<Long, Map<String, BatteryHistEntry>> batteryHistMap =
|
||||
DatabaseUtils.getHistoryMapSinceLastFullCharge(
|
||||
mContext, /*calendar=*/ null);
|
||||
DatabaseUtils.getHistoryMapSinceQueryTimestamp(mContext, 0);
|
||||
|
||||
assertThat(batteryHistMap).isEmpty();
|
||||
}
|
||||
@@ -571,6 +573,7 @@ public final class DatabaseUtilsTest {
|
||||
BatteryHistEntry.KEY_PACKAGE_NAME,
|
||||
BatteryHistEntry.KEY_TIMESTAMP,
|
||||
BatteryHistEntry.KEY_UID,
|
||||
BatteryHistEntry.KEY_CONSUMER_TYPE});
|
||||
BatteryHistEntry.KEY_CONSUMER_TYPE,
|
||||
BatteryHistEntry.KEY_IS_FULL_CHARGE_CYCLE_START});
|
||||
}
|
||||
}
|
||||
|
@@ -134,11 +134,6 @@ public class PowerUsageBaseTest {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean isBatteryHistoryNeeded() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void refreshUi(int refreshType) {
|
||||
// Do nothing
|
||||
|
@@ -16,6 +16,10 @@
|
||||
|
||||
package com.android.settings.fuelgauge.batteryusage.db;
|
||||
|
||||
import static com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity.KEY_BATTERY_EVENT_TYPE;
|
||||
import static com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity.KEY_BATTERY_LEVEL;
|
||||
import static com.android.settings.fuelgauge.batteryusage.db.BatteryEventEntity.KEY_TIMESTAMP;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
@@ -31,9 +35,14 @@ import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** Tests for {@link BatteryEventDao}. */
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class BatteryEventDaoTest {
|
||||
private static final long TIMESTAMP1 = System.currentTimeMillis();
|
||||
private static final long TIMESTAMP2 = TIMESTAMP1 + 2;
|
||||
|
||||
private Context mContext;
|
||||
private BatteryStateDatabase mDatabase;
|
||||
private BatteryEventDao mBatteryEventDao;
|
||||
@@ -51,8 +60,44 @@ public final class BatteryEventDaoTest {
|
||||
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void getAllAfter_returnExpectedResult() {
|
||||
public void getLastFullChargeTimestamp_normalFlow_expectedBehavior() throws Exception {
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(TIMESTAMP1)
|
||||
.setBatteryEventType(3)
|
||||
.setBatteryLevel(100)
|
||||
.build());
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(TIMESTAMP2)
|
||||
.setBatteryEventType(4)
|
||||
.setBatteryLevel(96)
|
||||
.build());
|
||||
|
||||
final Cursor cursor = mBatteryEventDao.getLastFullChargeTimestamp();
|
||||
assertThat(cursor.getCount()).isEqualTo(1);
|
||||
cursor.moveToFirst();
|
||||
assertThat(cursor.getLong(0)).isEqualTo(TIMESTAMP1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLastFullChargeTimestamp_noLastFullChargeTime_returns0() throws Exception {
|
||||
mBatteryEventDao.clearAll();
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(TIMESTAMP2)
|
||||
.setBatteryEventType(4)
|
||||
.setBatteryLevel(96)
|
||||
.build());
|
||||
|
||||
final Cursor cursor = mBatteryEventDao.getLastFullChargeTimestamp();
|
||||
|
||||
assertThat(cursor.getCount()).isEqualTo(1);
|
||||
cursor.moveToFirst();
|
||||
assertThat(cursor.getLong(0)).isEqualTo(0L);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAllAfter_normalFlow_returnExpectedResult() {
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(100L)
|
||||
.setBatteryEventType(1)
|
||||
@@ -64,17 +109,44 @@ public final class BatteryEventDaoTest {
|
||||
.setBatteryLevel(88)
|
||||
.build());
|
||||
|
||||
final Cursor cursor = mBatteryEventDao.getAllAfter(160L);
|
||||
final Cursor cursor = mBatteryEventDao.getAllAfter(160L, List.of(1, 2));
|
||||
assertThat(cursor.getCount()).isEqualTo(1);
|
||||
cursor.moveToFirst();
|
||||
assertThat(cursor.getLong(cursor.getColumnIndex(BatteryEventEntity.KEY_TIMESTAMP)))
|
||||
assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP)))
|
||||
.isEqualTo(200L);
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_EVENT_TYPE)))
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE)))
|
||||
.isEqualTo(2);
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(BatteryEventEntity.KEY_BATTERY_LEVEL)))
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL)))
|
||||
.isEqualTo(88);
|
||||
|
||||
mBatteryEventDao.clearAll();
|
||||
assertThat(mBatteryEventDao.getAll()).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAllAfter_filterBatteryTypes_returnExpectedResult() {
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(100L)
|
||||
.setBatteryEventType(1)
|
||||
.setBatteryLevel(66)
|
||||
.build());
|
||||
mBatteryEventDao.insert(BatteryEventEntity.newBuilder()
|
||||
.setTimestamp(200L)
|
||||
.setBatteryEventType(2)
|
||||
.setBatteryLevel(88)
|
||||
.build());
|
||||
|
||||
final Cursor cursor = mBatteryEventDao.getAllAfter(0L, List.of(1));
|
||||
assertThat(cursor.getCount()).isEqualTo(1);
|
||||
cursor.moveToFirst();
|
||||
assertThat(cursor.getLong(cursor.getColumnIndex(KEY_TIMESTAMP)))
|
||||
.isEqualTo(100L);
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_EVENT_TYPE)))
|
||||
.isEqualTo(1);
|
||||
assertThat(cursor.getInt(cursor.getColumnIndex(KEY_BATTERY_LEVEL)))
|
||||
.isEqualTo(66);
|
||||
|
||||
mBatteryEventDao.clearAll();
|
||||
assertThat(mBatteryEventDao.getAll()).isEmpty();
|
||||
}
|
||||
}
|
||||
|
@@ -37,9 +37,10 @@ import java.util.List;
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class BatteryStateDaoTest {
|
||||
private static final int CURSOR_COLUMN_SIZE = 9;
|
||||
private static final long TIMESTAMP1 = System.currentTimeMillis();
|
||||
private static final long TIMESTAMP2 = System.currentTimeMillis() + 2;
|
||||
private static final long TIMESTAMP3 = System.currentTimeMillis() + 4;
|
||||
private static final long CURRENT = System.currentTimeMillis();
|
||||
private static final long TIMESTAMP1 = CURRENT;
|
||||
private static final long TIMESTAMP2 = CURRENT + 2;
|
||||
private static final long TIMESTAMP3 = CURRENT + 4;
|
||||
private static final String PACKAGE_NAME1 = "com.android.apps.settings";
|
||||
private static final String PACKAGE_NAME2 = "com.android.apps.calendar";
|
||||
private static final String PACKAGE_NAME3 = "com.android.apps.gmail";
|
||||
@@ -67,7 +68,7 @@ public final class BatteryStateDaoTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batteryStateDao_insertAll() throws Exception {
|
||||
public void insertAll_normalFlow_expectedBehavior() throws Exception {
|
||||
final List<BatteryState> states = mBatteryStateDao.getAllAfter(TIMESTAMP1);
|
||||
assertThat(states).hasSize(2);
|
||||
// Verifies the queried battery states.
|
||||
@@ -76,8 +77,26 @@ public final class BatteryStateDaoTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batteryStateDao_getCursorSinceLastFullCharge() throws Exception {
|
||||
final Cursor cursor1 = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP1);
|
||||
public void getLatestTimestamp_normalFlow_expectedBehavior() throws Exception {
|
||||
final Cursor cursor1 = mBatteryStateDao.getLatestTimestampBefore(TIMESTAMP1 - 1);
|
||||
assertThat(cursor1.getCount()).isEqualTo(1);
|
||||
cursor1.moveToFirst();
|
||||
assertThat(cursor1.getLong(0)).isEqualTo(0L);
|
||||
|
||||
final Cursor cursor2 = mBatteryStateDao.getLatestTimestampBefore(TIMESTAMP2);
|
||||
assertThat(cursor2.getCount()).isEqualTo(1);
|
||||
cursor2.moveToFirst();
|
||||
assertThat(cursor2.getLong(0)).isEqualTo(TIMESTAMP2);
|
||||
|
||||
final Cursor cursor3 = mBatteryStateDao.getLatestTimestampBefore(TIMESTAMP3 + 1);
|
||||
assertThat(cursor3.getCount()).isEqualTo(1);
|
||||
cursor3.moveToFirst();
|
||||
assertThat(cursor3.getLong(0)).isEqualTo(TIMESTAMP3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getBatteryStatesAfter_normalFlow_expectedBehavior() throws Exception {
|
||||
final Cursor cursor1 = mBatteryStateDao.getBatteryStatesAfter(TIMESTAMP1);
|
||||
assertThat(cursor1.getCount()).isEqualTo(3);
|
||||
assertThat(cursor1.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
|
||||
// Verifies the queried first battery state.
|
||||
@@ -90,7 +109,7 @@ public final class BatteryStateDaoTest {
|
||||
cursor1.moveToNext();
|
||||
assertThat(cursor1.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
|
||||
|
||||
final Cursor cursor2 = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP3);
|
||||
final Cursor cursor2 = mBatteryStateDao.getBatteryStatesAfter(TIMESTAMP3);
|
||||
assertThat(cursor2.getCount()).isEqualTo(1);
|
||||
assertThat(cursor2.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
|
||||
// Verifies the queried first battery state.
|
||||
@@ -99,25 +118,7 @@ public final class BatteryStateDaoTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batteryStateDao_getCursorSinceLastFullCharge_noFullChargeData_returnSevenDaysData()
|
||||
throws Exception {
|
||||
mBatteryStateDao.clearAll();
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP3, PACKAGE_NAME3);
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP2, PACKAGE_NAME2);
|
||||
BatteryTestUtils.insertDataToBatteryStateTable(mContext, TIMESTAMP1, PACKAGE_NAME1);
|
||||
final Cursor cursor = mBatteryStateDao.getCursorSinceLastFullCharge(TIMESTAMP2);
|
||||
assertThat(cursor.getCount()).isEqualTo(2);
|
||||
assertThat(cursor.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
|
||||
// Verifies the queried first battery state.
|
||||
cursor.moveToFirst();
|
||||
assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME2);
|
||||
// Verifies the queried third battery state.
|
||||
cursor.moveToNext();
|
||||
assertThat(cursor.getString(3 /*packageName*/)).isEqualTo(PACKAGE_NAME3);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batteryStateDao_clearAllBefore() throws Exception {
|
||||
public void clearAllBefore_normalFlow_expectedBehavior() throws Exception {
|
||||
mBatteryStateDao.clearAllBefore(TIMESTAMP2);
|
||||
|
||||
final List<BatteryState> states = mBatteryStateDao.getAllAfter(0);
|
||||
@@ -127,20 +128,20 @@ public final class BatteryStateDaoTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void batteryStateDao_clearAll() throws Exception {
|
||||
public void clearAll_normalFlow_expectedBehavior() throws Exception {
|
||||
assertThat(mBatteryStateDao.getAllAfter(0)).hasSize(3);
|
||||
mBatteryStateDao.clearAll();
|
||||
assertThat(mBatteryStateDao.getAllAfter(0)).isEmpty();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getInstance_createNewInstance() throws Exception {
|
||||
public void getInstance_createNewInstance_returnsExpectedResult() throws Exception {
|
||||
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
|
||||
assertThat(BatteryStateDatabase.getInstance(mContext)).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDistinctTimestampCount_returnsExpectedResult() {
|
||||
public void getDistinctTimestampCount_normalFlow_returnsExpectedResult() {
|
||||
assertThat(mBatteryStateDao.getDistinctTimestampCount(/*timestamp=*/ 0))
|
||||
.isEqualTo(3);
|
||||
assertThat(mBatteryStateDao.getDistinctTimestampCount(TIMESTAMP1))
|
||||
@@ -148,7 +149,7 @@ public final class BatteryStateDaoTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDistinctTimestamps_returnsExpectedResult() {
|
||||
public void getDistinctTimestamps_normalFlow_returnsExpectedResult() {
|
||||
final List<Long> timestamps =
|
||||
mBatteryStateDao.getDistinctTimestamps(/*timestamp=*/ 0);
|
||||
|
||||
|
@@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright (C) 2022 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.db;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
|
||||
import androidx.test.core.app.ApplicationProvider;
|
||||
|
||||
import com.android.settings.testutils.BatteryTestUtils;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/** Tests for {@link BatteryUsageSlotDao}. */
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class BatteryUsageSlotDaoTest {
|
||||
private static final int CURSOR_COLUMN_SIZE = 3;
|
||||
private static final long CURRENT = System.currentTimeMillis();
|
||||
private static final long TIMESTAMP1 = CURRENT;
|
||||
private static final long TIMESTAMP2 = CURRENT + 2;
|
||||
private static final String BATTERY_USAGE_SLOT_STRING1 = "BATTERY_USAGE_SLOT_STRING1";
|
||||
private static final String BATTERY_USAGE_SLOT_STRING2 = "BATTERY_USAGE_SLOT_STRING2";
|
||||
|
||||
private Context mContext;
|
||||
private BatteryStateDatabase mDatabase;
|
||||
private BatteryUsageSlotDao mBatteryUsageSlotDao;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
mContext = ApplicationProvider.getApplicationContext();
|
||||
mDatabase = BatteryTestUtils.setUpBatteryStateDatabase(mContext);
|
||||
mBatteryUsageSlotDao = mDatabase.batteryUsageSlotDao();
|
||||
mBatteryUsageSlotDao.insert(
|
||||
new BatteryUsageSlotEntity(TIMESTAMP1, BATTERY_USAGE_SLOT_STRING1));
|
||||
mBatteryUsageSlotDao.insert(
|
||||
new BatteryUsageSlotEntity(TIMESTAMP2, BATTERY_USAGE_SLOT_STRING2));
|
||||
}
|
||||
|
||||
@After
|
||||
public void closeDb() {
|
||||
mDatabase.close();
|
||||
BatteryStateDatabase.setBatteryStateDatabase(/*database=*/ null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAll_normalFlow_expectedBehavior() throws Exception {
|
||||
final List<BatteryUsageSlotEntity> entities = mBatteryUsageSlotDao.getAll();
|
||||
assertThat(entities).hasSize(2);
|
||||
assertThat(entities.get(0).timestamp).isEqualTo(TIMESTAMP1);
|
||||
assertThat(entities.get(0).batteryUsageSlot).isEqualTo(BATTERY_USAGE_SLOT_STRING1);
|
||||
assertThat(entities.get(1).timestamp).isEqualTo(TIMESTAMP2);
|
||||
assertThat(entities.get(1).batteryUsageSlot).isEqualTo(BATTERY_USAGE_SLOT_STRING2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getAllAfter_normalFlow_expectedBehavior() throws Exception {
|
||||
final Cursor cursor1 = mBatteryUsageSlotDao.getAllAfter(TIMESTAMP1);
|
||||
assertThat(cursor1.getCount()).isEqualTo(2);
|
||||
assertThat(cursor1.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
|
||||
cursor1.moveToFirst();
|
||||
assertThat(cursor1.getLong(1 /*timestamp*/)).isEqualTo(TIMESTAMP1);
|
||||
cursor1.moveToNext();
|
||||
assertThat(cursor1.getLong(1 /*timestamp*/)).isEqualTo(TIMESTAMP2);
|
||||
|
||||
final Cursor cursor2 = mBatteryUsageSlotDao.getAllAfter(TIMESTAMP1 + 1);
|
||||
assertThat(cursor2.getCount()).isEqualTo(1);
|
||||
assertThat(cursor2.getColumnCount()).isEqualTo(CURSOR_COLUMN_SIZE);
|
||||
cursor2.moveToFirst();
|
||||
assertThat(cursor2.getLong(1 /*timestamp*/)).isEqualTo(TIMESTAMP2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clearAllBefore_normalFlow_expectedBehavior() throws Exception {
|
||||
mBatteryUsageSlotDao.clearAllBefore(TIMESTAMP1);
|
||||
|
||||
final List<BatteryUsageSlotEntity> entities = mBatteryUsageSlotDao.getAll();
|
||||
assertThat(entities).hasSize(1);
|
||||
assertThat(entities.get(0).timestamp).isEqualTo(TIMESTAMP2);
|
||||
assertThat(entities.get(0).batteryUsageSlot).isEqualTo(BATTERY_USAGE_SLOT_STRING2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void clearAll_normalFlow_expectedBehavior() throws Exception {
|
||||
mBatteryUsageSlotDao.clearAll();
|
||||
|
||||
assertThat(mBatteryUsageSlotDao.getAll()).isEmpty();
|
||||
}
|
||||
}
|
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* 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.db;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
|
||||
/** Tests for {@link BatteryUsageSlotEntity}. */
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public final class BatteryUsageSlotEntityTest {
|
||||
|
||||
@Test
|
||||
public void testBuilder_returnsExpectedResult() {
|
||||
final long timestamp = 10001L;
|
||||
final String batteryUsageSlotString = "batteryUsageSlotString";
|
||||
|
||||
BatteryUsageSlotEntity entity = BatteryUsageSlotEntity
|
||||
.newBuilder()
|
||||
.setTimestamp(timestamp)
|
||||
.setBatteryUsageSlot(batteryUsageSlotString)
|
||||
.build();
|
||||
|
||||
// Verifies the app relative information.
|
||||
assertThat(entity.timestamp).isEqualTo(timestamp);
|
||||
assertThat(entity.batteryUsageSlot).isEqualTo(batteryUsageSlotString);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user