/** * Returns aggregated UsageStats added by calling {@link #addUsageStats}. * * The real implementation creates these aggregated objects from individual {@link Event}. This * aggregation logic is nontrivial, so the shadow implementation just returns the aggregate data * added using {@link #addUsageStats}. */ @Implementation protected List<UsageStats> queryUsageStats(int intervalType, long beginTime, long endTime) { List<UsageStats> results = new ArrayList<>(); Range<Long> queryRange = Range.closed(beginTime, endTime); for (UsageStats stats : usageStatsByIntervalType.get(intervalType)) { Range<Long> statsRange = Range.closed(stats.getFirstTimeStamp(), stats.getLastTimeStamp()); if (queryRange.isConnected(statsRange)) { results.add(stats); } } return results; }
@Test public void usageStatsBuilder_noFieldsSet() { UsageStats usage = UsageStatsBuilder.newBuilder() // Don't set any fields; the object should still build. .build(); assertThat(usage.getPackageName()).isNull(); assertThat(usage.getFirstTimeStamp()).isEqualTo(0); assertThat(usage.getLastTimeStamp()).isEqualTo(0); assertThat(usage.getLastTimeUsed()).isEqualTo(0); assertThat(usage.getTotalTimeInForeground()).isEqualTo(0); }
/** * Returns aggregated UsageStats added by calling {@link #addUsageStats}. * * The real implementation creates these aggregated objects from individual {@link Event}. This * aggregation logic is nontrivial, so the shadow implementation just returns the aggregate data * added using {@link #addUsageStats}. */ @Implementation protected List<UsageStats> queryUsageStats(int intervalType, long beginTime, long endTime) { List<UsageStats> results = new ArrayList<>(); Range<Long> queryRange = Range.closed(beginTime, endTime); for (UsageStats stats : usageStatsByIntervalType.get(intervalType)) { Range<Long> statsRange = Range.closed(stats.getFirstTimeStamp(), stats.getLastTimeStamp()); if (queryRange.isConnected(statsRange)) { results.add(stats); } } return results; }