Generate intermediate app usage data after all usage data has been

loaded for further use.

Test: make RunSettingsRoboTests + manually
Bug: 260964903
Change-Id: I52d96151cab112adca68573f3b47a53b7152f2c0
This commit is contained in:
Kuan Wang
2022-12-21 15:17:44 +08:00
parent 23a91ff7d9
commit 120c68881c
5 changed files with 662 additions and 29 deletions

View File

@@ -48,6 +48,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -110,15 +111,31 @@ public final class DataProcessManagerTest {
assertThat(mDataProcessManager.getIsCurrentBatteryHistoryLoaded()).isTrue();
assertThat(mDataProcessManager.getShowScreenOnTime()).isTrue();
assertThat(mDataProcessManager.getAppUsageEventList()).isEmpty();
assertThat(mDataProcessManager.getAppUsagePeriodMap()).isNull();
}
@Test
public void start_loadExpectedAppUsageData() throws RemoteException {
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
new ArrayList<>();
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);
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(timestamps1, levels1));
// 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);
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(timestamps2, levels2));
// Fake current usage data.
final UsageEvents.Event event1 =
getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1);
getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1, packageName);
final UsageEvents.Event event2 =
getUsageEvent(UsageEvents.Event.ACTIVITY_STOPPED, /*timestamp=*/ 2);
getUsageEvent(UsageEvents.Event.ACTIVITY_STOPPED, /*timestamp=*/ 2, packageName);
final List<UsageEvents.Event> events = new ArrayList<>();
events.add(event1);
events.add(event2);
@@ -126,30 +143,46 @@ public final class DataProcessManagerTest {
.when(mUsageStatsManager)
.queryEventsForUser(anyLong(), anyLong(), anyInt(), any());
doReturn(true).when(mUserManager).isUserUnlocked(anyInt());
// Assign current user id.
doReturn(1).when(mContext).getUserId();
// No work profile.
doReturn(new ArrayList<>()).when(mUserManager).getUserProfiles();
// Fake database usage data.
final MatrixCursor cursor = new MatrixCursor(
new String[]{
AppUsageEventEntity.KEY_APP_USAGE_EVENT_TYPE,
AppUsageEventEntity.KEY_TIMESTAMP});
AppUsageEventEntity.KEY_TIMESTAMP,
AppUsageEventEntity.KEY_USER_ID,
AppUsageEventEntity.KEY_INSTANCE_ID,
AppUsageEventEntity.KEY_PACKAGE_NAME
});
// Adds fake data into the cursor.
cursor.addRow(new Object[] {
AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 3});
AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 3, /*userId=*/ 1,
/*instanceId=*/ 2, packageName});
cursor.addRow(new Object[] {
AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 4});
AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 4, /*userId=*/ 1,
/*instanceId=*/ 2, packageName});
cursor.addRow(new Object[] {
AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 5});
AppUsageEventType.ACTIVITY_RESUMED.getNumber(), /*timestamp=*/ 5, /*userId=*/ 1,
/*instanceId=*/ 2, packageName});
cursor.addRow(new Object[] {
AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 6});
AppUsageEventType.ACTIVITY_STOPPED.getNumber(), /*timestamp=*/ 6, /*userId=*/ 1,
/*instanceId=*/ 2, packageName});
DatabaseUtils.sFakeAppUsageEventSupplier = () -> cursor;
mDataProcessManager.start();
final DataProcessManager dataProcessManager = new DataProcessManager(
mContext, /*handler=*/ null, /*callbackFunction=*/ null,
hourlyBatteryLevelsPerDay, /*batteryHistoryMap=*/ null);
dataProcessManager.start();
assertThat(mDataProcessManager.getIsCurrentAppUsageLoaded()).isTrue();
assertThat(mDataProcessManager.getIsDatabaseAppUsageLoaded()).isTrue();
assertThat(mDataProcessManager.getIsCurrentBatteryHistoryLoaded()).isTrue();
assertThat(mDataProcessManager.getShowScreenOnTime()).isTrue();
final List<AppUsageEvent> appUsageEventList = mDataProcessManager.getAppUsageEventList();
assertThat(dataProcessManager.getIsCurrentAppUsageLoaded()).isTrue();
assertThat(dataProcessManager.getIsDatabaseAppUsageLoaded()).isTrue();
assertThat(dataProcessManager.getIsCurrentBatteryHistoryLoaded()).isTrue();
assertThat(dataProcessManager.getShowScreenOnTime()).isTrue();
final List<AppUsageEvent> appUsageEventList = dataProcessManager.getAppUsageEventList();
Collections.sort(appUsageEventList, DataProcessor.TIMESTAMP_COMPARATOR);
assertThat(appUsageEventList.size()).isEqualTo(6);
assertAppUsageEvent(
appUsageEventList.get(0), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1);
@@ -158,17 +191,41 @@ public final class DataProcessManagerTest {
assertAppUsageEvent(
appUsageEventList.get(2), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3);
assertAppUsageEvent(
appUsageEventList.get(3), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 4);
appUsageEventList.get(3), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4);
assertAppUsageEvent(
appUsageEventList.get(4), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 5);
appUsageEventList.get(4), AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 5);
assertAppUsageEvent(
appUsageEventList.get(5), AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 6);
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>>
appUsagePeriodMap = dataProcessManager.getAppUsagePeriodMap();
assertThat(appUsagePeriodMap.size()).isEqualTo(3);
// Day 1
assertThat(appUsagePeriodMap.get(0).size()).isEqualTo(2);
Map<Long, Map<String, List<AppUsagePeriod>>> hourlyMap = appUsagePeriodMap.get(0).get(0);
assertThat(hourlyMap).isNull();
hourlyMap = appUsagePeriodMap.get(0).get(1);
assertThat(hourlyMap.size()).isEqualTo(1);
Map<String, List<AppUsagePeriod>> userMap = hourlyMap.get(1L);
assertThat(userMap.size()).isEqualTo(1);
assertThat(userMap.get(packageName).size()).isEqualTo(1);
assertAppUsagePeriod(userMap.get(packageName).get(0), 3, 4);
// Day 2
assertThat(appUsagePeriodMap.get(1).size()).isEqualTo(0);
// Day 3
assertThat(appUsagePeriodMap.get(2).size()).isEqualTo(1);
hourlyMap = appUsagePeriodMap.get(2).get(0);
assertThat(hourlyMap.size()).isEqualTo(1);
userMap = hourlyMap.get(1L);
assertThat(userMap.size()).isEqualTo(1);
assertThat(userMap.get(packageName).size()).isEqualTo(1);
assertAppUsagePeriod(userMap.get(packageName).get(0), 5, 6);
}
@Test
public void start_currentUserLocked_emptyAppUsageList() throws RemoteException {
final UsageEvents.Event event =
getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1);
getUsageEvent(UsageEvents.Event.ACTIVITY_RESUMED, /*timestamp=*/ 1, "package");
final List<UsageEvents.Event> events = new ArrayList<>();
events.add(event);
doReturn(getUsageEvents(events))
@@ -187,6 +244,7 @@ public final class DataProcessManagerTest {
mDataProcessManager.start();
assertThat(mDataProcessManager.getAppUsageEventList()).isEmpty();
assertThat(mDataProcessManager.getAppUsagePeriodMap()).isNull();
assertThat(mDataProcessManager.getShowScreenOnTime()).isFalse();
}
@@ -296,10 +354,10 @@ public final class DataProcessManagerTest {
}
private UsageEvents.Event getUsageEvent(
final int eventType, final long timestamp) {
final int eventType, final long timestamp, final String packageName) {
final UsageEvents.Event event = new UsageEvents.Event();
event.mEventType = eventType;
event.mPackage = "package";
event.mPackage = packageName;
event.mTimeStamp = timestamp;
return event;
}
@@ -340,6 +398,12 @@ public final class DataProcessManagerTest {
assertThat(event.getTimestamp()).isEqualTo(timestamp);
}
private void assertAppUsagePeriod(
final AppUsagePeriod period, final long startTime, final long endTime) {
assertThat(period.getStartTime()).isEqualTo(startTime);
assertThat(period.getEndTime()).isEqualTo(endTime);
}
private static void verifyExpectedBatteryLevelData(
final BatteryLevelData resultData,
final List<Long> expectedDailyTimestamps,

View File

@@ -175,7 +175,108 @@ public final class DataProcessorTest {
assertThat(DataProcessor.getAppUsageEventsForUser(mContext, userId, 0)).isNull();
}
@Test public void generateAppUsageEventListFromUsageEvents_returnExpectedResult() {
@Test
public void generateAppUsagePeriodMap_returnExpectedResult() {
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
new ArrayList<>();
final String packageName = "com.android.settings";
// Adds the day 1 data.
final List<Long> timestamps1 = List.of(10000L, 20000L, 30000L);
final List<Integer> levels1 = List.of(100, 100, 100);
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(timestamps1, levels1));
// Adds the day 2 data.
hourlyBatteryLevelsPerDay.add(null);
// Adds the day 3 data.
final List<Long> timestamps2 = List.of(40000L, 50000L);
final List<Integer> levels2 = List.of(100, 100);
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(timestamps2, levels2));
final long startTimestampOfLevelData = 10000L;
final List<AppUsageEvent> appUsageEventList = new ArrayList<>();
// Adds some events before the start timestamp.
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
// Adds the valid app usage events.
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 10000L, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 15000L, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 12000L, /*userId=*/ 2,
/*instanceId=*/ 3, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 18000L, /*userId=*/ 2,
/*instanceId=*/ 3, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 35000L, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 45000L, /*userId=*/ 1,
/*instanceId=*/ 2, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 42000L, /*userId=*/ 1,
/*instanceId=*/ 4, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 52000L, /*userId=*/ 1,
/*instanceId=*/ 4, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 55000L, /*userId=*/ 1,
/*instanceId=*/ 4, packageName));
appUsageEventList.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 58000L, /*userId=*/ 1,
/*instanceId=*/ 4, packageName));
final Map<Integer, Map<Integer, Map<Long, Map<String, List<AppUsagePeriod>>>>> periodMap =
DataProcessor.generateAppUsagePeriodMap(
hourlyBatteryLevelsPerDay, appUsageEventList, startTimestampOfLevelData);
assertThat(periodMap.size()).isEqualTo(3);
// Day 1
assertThat(periodMap.get(0).size()).isEqualTo(2);
Map<Long, Map<String, List<AppUsagePeriod>>> hourlyMap = periodMap.get(0).get(0);
assertThat(hourlyMap.size()).isEqualTo(2);
Map<String, List<AppUsagePeriod>> userMap = hourlyMap.get(1L);
assertThat(userMap.size()).isEqualTo(1);
assertThat(userMap.get(packageName).size()).isEqualTo(1);
assertAppUsagePeriod(userMap.get(packageName).get(0), 10000, 15000);
userMap = hourlyMap.get(2L);
assertThat(userMap.size()).isEqualTo(1);
assertThat(userMap.get(packageName).size()).isEqualTo(1);
assertAppUsagePeriod(userMap.get(packageName).get(0), 12000, 18000);
hourlyMap = periodMap.get(0).get(1);
assertThat(hourlyMap).isNull();
// Day 2
assertThat(periodMap.get(1).size()).isEqualTo(0);
// Day 3
assertThat(periodMap.get(2).size()).isEqualTo(1);
hourlyMap = periodMap.get(2).get(0);
assertThat(hourlyMap.size()).isEqualTo(1);
userMap = hourlyMap.get(1L);
assertThat(userMap.size()).isEqualTo(1);
assertThat(userMap.get(packageName).size()).isEqualTo(2);
assertAppUsagePeriod(userMap.get(packageName).get(0), 40000, 45000);
assertAppUsagePeriod(userMap.get(packageName).get(1), 42000, 50000);
}
@Test
public void generateAppUsagePeriodMap_emptyEventList_returnNull() {
final List<BatteryLevelData.PeriodBatteryLevelData> hourlyBatteryLevelsPerDay =
new ArrayList<>();
hourlyBatteryLevelsPerDay.add(
new BatteryLevelData.PeriodBatteryLevelData(new ArrayList<>(), new ArrayList<>()));
assertThat(DataProcessor.generateAppUsagePeriodMap(
hourlyBatteryLevelsPerDay, new ArrayList<>(), 0)).isNull();
}
@Test
public void generateAppUsageEventListFromUsageEvents_returnExpectedResult() {
Event event1 = getUsageEvent(Event.NOTIFICATION_INTERRUPTION, /*timestamp=*/ 1);
Event event2 = getUsageEvent(Event.ACTIVITY_RESUMED, /*timestamp=*/ 2);
Event event3 = getUsageEvent(Event.ACTIVITY_STOPPED, /*timestamp=*/ 3);
@@ -1214,6 +1315,150 @@ public final class DataProcessorTest {
/*foregroundUsageTimeInMs=*/ 10, /*backgroundUsageTimeInMs=*/ 10);
}
@Test
public void buildAppUsagePeriodList_returnExpectedResult() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
final String packageName1 = "com.android.settings1";
final String packageName2 = "com.android.settings2";
// Fake multiple instances in one package.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 1,
/*instanceId=*/ 2, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 1,
/*instanceId=*/ 2, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3, /*userId=*/ 1,
/*instanceId=*/ 2, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
/*instanceId=*/ 2, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2, /*userId=*/ 1,
/*instanceId=*/ 3, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
/*instanceId=*/ 3, packageName1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 2, /*userId=*/ 1,
/*instanceId=*/ 5, packageName2));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 1,
/*instanceId=*/ 5, packageName2));
// Fake one instance in one package.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1, /*userId=*/ 2,
/*instanceId=*/ 4, packageName2));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 2, /*userId=*/ 2,
/*instanceId=*/ 4, packageName2));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 3, /*userId=*/ 2,
/*instanceId=*/ 4, packageName2));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 4, /*userId=*/ 2,
/*instanceId=*/ 4, packageName2));
final Map<Long, Map<String, List<AppUsagePeriod>>> appUsagePeriodMap =
DataProcessor.buildAppUsagePeriodList(appUsageEvents, 0, 5);
assertThat(appUsagePeriodMap.size()).isEqualTo(2);
final Map<String, List<AppUsagePeriod>> userMap1 = appUsagePeriodMap.get(1L);
assertThat(userMap1.size()).isEqualTo(2);
List<AppUsagePeriod> appUsagePeriodList = userMap1.get(packageName1);
assertThat(appUsagePeriodList.size()).isEqualTo(3);
assertAppUsagePeriod(appUsagePeriodList.get(0), 1, 2);
assertAppUsagePeriod(appUsagePeriodList.get(1), 2, 4);
assertAppUsagePeriod(appUsagePeriodList.get(2), 3, 4);
appUsagePeriodList = userMap1.get(packageName2);
assertThat(appUsagePeriodList.size()).isEqualTo(1);
assertAppUsagePeriod(appUsagePeriodList.get(0), 2, 4);
final Map<String, List<AppUsagePeriod>> userMap2 = appUsagePeriodMap.get(2L);
assertThat(userMap2.size()).isEqualTo(1);
appUsagePeriodList = userMap2.get(packageName2);
assertThat(appUsagePeriodList.size()).isEqualTo(2);
assertAppUsagePeriod(appUsagePeriodList.get(0), 1, 2);
assertAppUsagePeriod(appUsagePeriodList.get(1), 3, 4);
}
@Test
public void buildAppUsagePeriodList_emptyEventList_returnNull() {
assertThat(DataProcessor.buildAppUsagePeriodList(
new ArrayList<>(), 0, 1)).isNull();
}
@Test
public void buildAppUsagePeriodList_emptyActivityList_returnNull() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 1));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 2));
assertThat(DataProcessor.buildAppUsagePeriodList(
appUsageEvents, 0, 3)).isNull();
}
@Test
public void buildAppUsagePeriodListPerInstance_returnExpectedResult() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
// Fake normal data.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 100000));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 200000));
// Fake two adjacent resume events.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 300000));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 400000));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 500000));
// Fake no start event when stop event happens.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 600000));
// There exists start event when device shutdown event happens. Shutdown is later than
// default complete time.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 700000));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 800000));
// There exists start event when device shutdown event happens. Shutdown is earlier than
// default complete time.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 900000));
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.DEVICE_SHUTDOWN, /*timestamp=*/ 910000));
// There exists start event when the period ends.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_RESUMED, /*timestamp=*/ 1000000));
final List<AppUsagePeriod> appUsagePeriodList =
DataProcessor.buildAppUsagePeriodListPerInstance(appUsageEvents, 0, 1100000);
assertThat(appUsagePeriodList.size()).isEqualTo(6);
assertAppUsagePeriod(appUsagePeriodList.get(0), 100000, 200000);
assertAppUsagePeriod(appUsagePeriodList.get(1), 300000, 500000);
assertAppUsagePeriod(appUsagePeriodList.get(2), 570000, 600000);
assertAppUsagePeriod(appUsagePeriodList.get(3), 700000, 730000);
assertAppUsagePeriod(appUsagePeriodList.get(4), 900000, 910000);
assertAppUsagePeriod(appUsagePeriodList.get(5), 1000000, 1100000);
}
@Test
public void buildAppUsagePeriodListPerInstance_notMetStart_returnExpectedResult() {
final List<AppUsageEvent> appUsageEvents = new ArrayList<>();
// Start with stop event.
appUsageEvents.add(buildAppUsageEvent(
AppUsageEventType.ACTIVITY_STOPPED, /*timestamp=*/ 100000));
final List<AppUsagePeriod> appUsagePeriodList =
DataProcessor.buildAppUsagePeriodListPerInstance(appUsageEvents, 0, 200000);
assertThat(appUsageEvents.size()).isEqualTo(1);
assertAppUsagePeriod(appUsagePeriodList.get(0), 0, 100000);
}
private static Map<Long, Map<String, BatteryHistEntry>> createHistoryMap(
final long[] timestamps, final int[] levels) {
final Map<Long, Map<String, BatteryHistEntry>> batteryHistoryMap = new HashMap<>();
@@ -1292,12 +1537,39 @@ public final class DataProcessorTest {
return event;
}
private AppUsageEvent buildAppUsageEvent(final AppUsageEventType type, final long timestamp) {
return buildAppUsageEvent(
type, timestamp, /*userId=*/ 1, /*instanceId=*/ 2,
"com.android.settings");
}
private AppUsageEvent buildAppUsageEvent(
final AppUsageEventType type,
final long timestamp,
final long userId,
final int instanceId,
final String packageName) {
return AppUsageEvent.newBuilder()
.setType(type)
.setTimestamp(timestamp)
.setUserId(userId)
.setPackageName(packageName)
.setInstanceId(instanceId)
.build();
}
private void assertAppUsageEvent(
final AppUsageEvent event, final AppUsageEventType eventType, final long timestamp) {
assertThat(event.getType()).isEqualTo(eventType);
assertThat(event.getTimestamp()).isEqualTo(timestamp);
}
private void assertAppUsagePeriod(
final AppUsagePeriod period, final long startTime, final long endTime) {
assertThat(period.getStartTime()).isEqualTo(startTime);
assertThat(period.getEndTime()).isEqualTo(endTime);
}
private static void verifyExpectedBatteryLevelData(
final BatteryLevelData resultData,
final List<Long> expectedDailyTimestamps,