/** Sets the current app's standby bucket */ public void setCurrentAppStandbyBucket(@StandbyBuckets int bucket) { currentAppStandbyBucket = bucket; }
static class RecentUseComparator implements Comparator<UsageStats> { @Override public int compare(UsageStats lhs, UsageStats rhs) { return (lhs.getLastTimeUsed() > rhs.getLastTimeUsed()) ? -1 : (lhs.getLastTimeUsed() == rhs.getLastTimeUsed()) ? 0 : 1; } }
/** * Adds an event to be returned by {@link UsageStatsManager#queryEvents}. * * This method won't affect the results of {@link #queryUsageStats} method. * * The {@link Event} can be built by {@link EventBuilder}. */ public void addEvent(Event event) { eventsByTimeStamp.put(event.getTimeStamp(), event); }
.build()); UsageEvents events = usageStatsManager.queryEvents(1000L, 2000L); Event event = new Event(); assertThat(events.hasNextEvent()).isTrue(); assertThat(events.getNextEvent(event)).isTrue(); assertThat(event.getPackageName()).isEqualTo(TEST_PACKAGE_NAME1); assertThat(event.getTimeStamp()).isEqualTo(1000L); assertThat(event.getEventType()).isEqualTo(Event.MOVE_TO_BACKGROUND); assertThat(events.hasNextEvent()).isTrue(); assertThat(events.getNextEvent(event)).isTrue(); assertThat(event.getPackageName()).isEqualTo(TEST_PACKAGE_NAME2); assertThat(event.getTimeStamp()).isEqualTo(1500L); assertThat(event.getEventType()).isEqualTo(Event.MOVE_TO_FOREGROUND); assertThat(event.getClassName()).isEqualTo(TEST_ACTIVITY_NAME); assertThat(events.hasNextEvent()).isFalse(); assertThat(events.getNextEvent(event)).isFalse();
@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); }
String topPackageName ; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats"); long time = System.currentTimeMillis(); // We get usage stats for the last 10 seconds List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time); // Sort the stats by the last time used if(stats != null) { SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>(); for (UsageStats usageStats : stats) { mySortedMap.put(usageStats.getLastTimeUsed(),usageStats); } if(!mySortedMap.isEmpty()) { topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); } } }
long milliSecs = 60 * 1000; Date date = new Date(); List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, date.getTime() - milliSecs, date.getTime()); if (queryUsageStats.size() > 0) { Log.i("LPU", "queryUsageStats size: " + queryUsageStats.size()); for (int i = 0; i < queryUsageStats.size(); i++) { UsageStats stats = queryUsageStats.get(i); if (i == 0 && !"org.pervacio.pvadiag".equals(stats.getPackageName())) { Log.i("LPU", "PackageName: " + stats.getPackageName() + " " + stats.getLastTimeStamp()); if (stats.getLastTimeStamp() > recentTime) { recentTime = stats.getLastTimeStamp(); recentPkg = stats.getPackageName();
String getTopPackage(){ long ts = System.currentTimeMillis(); UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats"); List<UsageStats> usageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, ts-1000, ts); if (usageStats == null || usageStats.size() == 0) { return NONE_PKG; } Collections.sort(usageStats, mRecentComp); return usageStats.get(0).getPackageName(); }
@Test public void testQueryEvents_emptyEvents() throws Exception { UsageEvents events = usageStatsManager.queryEvents(1000L, 2000L); Event event = new Event(); assertThat(events.hasNextEvent()).isFalse(); assertThat(events.getNextEvent(event)).isFalse(); }
/** * 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 @Config(minSdk = Build.VERSION_CODES.P) public void testRegisterAppUsageObserver_duplicateObserverIds_shouldOverrideExistingObserver() { PendingIntent pendingIntent1 = PendingIntent.getBroadcast(context, 0, new Intent("ACTION1"), 0); usageStatsManager.registerAppUsageObserver( 12, new String[] {"com.package1", "com.package2"}, 123L, TimeUnit.MINUTES, pendingIntent1); PendingIntent pendingIntent2 = PendingIntent.getBroadcast(context, 0, new Intent("ACTION2"), 0); usageStatsManager.registerAppUsageObserver( 12, new String[] {"com.package3"}, 456L, TimeUnit.SECONDS, pendingIntent2); assertThat(shadowOf(usageStatsManager).getRegisteredAppUsageObservers()) .containsExactly( new AppUsageObserver( 12, ImmutableList.of("com.package3"), 456L, TimeUnit.SECONDS, pendingIntent2)); }
shadowOf(usageStatsManager).simulateTimeChange(10000L); UsageEvents events = usageStatsManager.queryEvents(11000L, 12000L); Event event = new Event(); assertThat(events.hasNextEvent()).isTrue(); assertThat(events.getNextEvent(event)).isTrue(); assertThat(event.getPackageName()).isEqualTo(TEST_PACKAGE_NAME1); assertThat(event.getTimeStamp()).isEqualTo(11000L); assertThat(event.getEventType()).isEqualTo(Event.MOVE_TO_BACKGROUND); assertThat(events.hasNextEvent()).isTrue(); assertThat(events.getNextEvent(event)).isTrue(); assertThat(event.getPackageName()).isEqualTo(TEST_PACKAGE_NAME2); assertThat(event.getTimeStamp()).isEqualTo(11500L); assertThat(event.getEventType()).isEqualTo(Event.MOVE_TO_FOREGROUND); assertThat(event.getClassName()).isEqualTo(TEST_ACTIVITY_NAME); assertThat(events.hasNextEvent()).isFalse(); assertThat(events.getNextEvent(event)).isFalse();
public void getTopActivtyFromLolipopOnwards(){ String topPackageName ; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE); long time = System.currentTimeMillis(); // We get usage stats for the last 10 seconds List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000*10, time); // Sort the stats by the last time used if(stats != null) { SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>(); for (UsageStats usageStats : stats) { mySortedMap.put(usageStats.getLastTimeUsed(),usageStats); } if(mySortedMap != null && !mySortedMap.isEmpty()) { topPackageName = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); Log.e("TopPackage Name",topPackageName); } } } }
@Test public void queryUsageStats_noStatsAdded() { List<UsageStats> results = usageStatsManager.queryUsageStats(INTERVAL_WEEKLY, 0, 3000); assertThat(results).isEmpty(); }
/** * Simulates the operations done by the framework when there is a time change. If the time is * changed, the timestamps of all existing usage events will be shifted by the same offset as the * time change, in order to make sure they remain stable relative to the new time. * * This method won't affect the results of {@link #queryUsageStats} method. * * @param offsetToAddInMillis the offset to be applied to all events. For example, if {@code * offsetInMillis} is 60,000, then all {@link Event}s will be shifted forward by 1 minute * (into the future). Likewise, if {@code offsetInMillis} is -60,000, then all {@link Event}s * will be shifted backward by 1 minute (into the past). */ public void simulateTimeChange(long offsetToAddInMillis) { ImmutableMap.Builder<Long, Event> eventMapBuilder = ImmutableMap.builder(); for (Event event : eventsByTimeStamp.values()) { long newTimestamp = event.getTimeStamp() + offsetToAddInMillis; eventMapBuilder.put( newTimestamp, EventBuilder.fromEvent(event).setTimeStamp(newTimestamp).build()); } eventsByTimeStamp.putAll(eventMapBuilder.build()); }
/** * Returns the current app's standby bucket that is set by {@code setCurrentAppStandbyBucket}. If * the standby bucket value has never been set, return {@link * UsageStatsManager.STANDBY_BUCKET_ACTIVE}. */ @Implementation(minSdk = Build.VERSION_CODES.P) @StandbyBuckets protected int getAppStandbyBucket() { return currentAppStandbyBucket; }
@Test public void queryUsageStats_multipleIntervalTypes() { // Weekly data. UsageStats usageStats1 = newUsageStats(TEST_PACKAGE_NAME1, 1000, 2000); UsageStats usageStats2 = newUsageStats(TEST_PACKAGE_NAME1, 2001, 3000); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats1); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats2); // Daily data. UsageStats usageStats3 = newUsageStats(TEST_PACKAGE_NAME1, 2001, 3000); shadowOf(usageStatsManager).addUsageStats(INTERVAL_DAILY, usageStats3); List<UsageStats> results = usageStatsManager.queryUsageStats(INTERVAL_WEEKLY, 0, 3000); assertThat(results).containsExactly(usageStats1, usageStats2); results = usageStatsManager.queryUsageStats(INTERVAL_DAILY, 0, 3000); assertThat(results).containsExactly(usageStats3); }
/** Sets the standby bucket of the specified app. */ @Implementation(minSdk = Build.VERSION_CODES.P) @HiddenApi public void setAppStandbyBucket(String packageName, @StandbyBuckets int bucket) { appStandbyBuckets.put(packageName, bucket); }
@Test public void queryUsageStats() { UsageStats usageStats1 = newUsageStats(TEST_PACKAGE_NAME1, 0, 1000); UsageStats usageStats2 = newUsageStats(TEST_PACKAGE_NAME1, 1001, 2000); UsageStats usageStats3 = newUsageStats(TEST_PACKAGE_NAME1, 2001, 3000); UsageStats usageStats4 = newUsageStats(TEST_PACKAGE_NAME1, 3001, 4000); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats1); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats2); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats3); shadowOf(usageStatsManager).addUsageStats(INTERVAL_WEEKLY, usageStats4); // Query fully covers usageStats 2 and 3, and partially overlaps with 4. List<UsageStats> results = usageStatsManager.queryUsageStats(INTERVAL_WEEKLY, 1001, 3500); assertThat(results).containsExactly(usageStats2, usageStats3, usageStats4); }
/** * Returns the current standby bucket of the specified app that is set by {@code * setAppStandbyBucket}. If the standby bucket value has never been set, return {@link * UsageStatsManager.STANDBY_BUCKET_ACTIVE}. */ @Implementation(minSdk = Build.VERSION_CODES.P) @HiddenApi public @StandbyBuckets int getAppStandbyBucket(String packageName) { Integer bucket = appStandbyBuckets.get(packageName); return (bucket == null) ? UsageStatsManager.STANDBY_BUCKET_ACTIVE : bucket; }