That fuck shit the fascists are using
at master 98 lines 3.1 kB view raw
1package org.tm.archive.util; 2 3import android.app.usage.UsageEvents; 4import android.app.usage.UsageStatsManager; 5 6import androidx.annotation.NonNull; 7import androidx.annotation.RequiresApi; 8 9import java.util.Date; 10 11import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED; 12 13@RequiresApi(28) 14public final class BucketInfo { 15 16 /** 17 * UsageStatsManager.STANDBY_BUCKET_EXEMPTED: is a Hidden API 18 */ 19 public static final int STANDBY_BUCKET_EXEMPTED = 5; 20 21 private final int currentBucket; 22 private final int worstBucket; 23 private final int bestBucket; 24 private final CharSequence history; 25 26 private BucketInfo(int currentBucket, int worstBucket, int bestBucket, CharSequence history) { 27 this.currentBucket = currentBucket; 28 this.worstBucket = worstBucket; 29 this.bestBucket = bestBucket; 30 this.history = history; 31 } 32 33 public static @NonNull BucketInfo getInfo(@NonNull UsageStatsManager usageStatsManager, long overLastDurationMs) { 34 StringBuilder stringBuilder = new StringBuilder(); 35 36 int currentBucket = usageStatsManager.getAppStandbyBucket(); 37 int worseBucket = currentBucket; 38 int bestBucket = currentBucket; 39 40 long now = System.currentTimeMillis(); 41 UsageEvents.Event event = new UsageEvents.Event(); 42 UsageEvents usageEvents = usageStatsManager.queryEventsForSelf(now - overLastDurationMs, now); 43 44 while (usageEvents.hasNextEvent()) { 45 usageEvents.getNextEvent(event); 46 47 if (event.getEventType() == UsageEvents.Event.STANDBY_BUCKET_CHANGED) { 48 int appStandbyBucket = event.getAppStandbyBucket(); 49 50 stringBuilder.append(new Date(event.getTimeStamp())) 51 .append(": ") 52 .append("Bucket Change: ") 53 .append(bucketToString(appStandbyBucket)) 54 .append("\n"); 55 56 if (appStandbyBucket > worseBucket) { 57 worseBucket = appStandbyBucket; 58 } 59 if (appStandbyBucket < bestBucket) { 60 bestBucket = appStandbyBucket; 61 } 62 } 63 } 64 65 return new BucketInfo(currentBucket, worseBucket, bestBucket, stringBuilder); 66 } 67 68 /** 69 * Not localized, for logs and debug only. 70 */ 71 public static String bucketToString(int bucket) { 72 switch (bucket) { 73 case UsageStatsManager.STANDBY_BUCKET_ACTIVE: return "Active"; 74 case UsageStatsManager.STANDBY_BUCKET_FREQUENT: return "Frequent"; 75 case UsageStatsManager.STANDBY_BUCKET_WORKING_SET: return "Working Set"; 76 case UsageStatsManager.STANDBY_BUCKET_RARE: return "Rare"; 77 case STANDBY_BUCKET_EXEMPTED: return "Exempted"; 78 case STANDBY_BUCKET_RESTRICTED: return "Restricted"; 79 default: return "Unknown " + bucket; 80 } 81 } 82 83 public int getBestBucket() { 84 return bestBucket; 85 } 86 87 public int getWorstBucket() { 88 return worstBucket; 89 } 90 91 public int getCurrentBucket() { 92 return currentBucket; 93 } 94 95 public CharSequence getHistory() { 96 return history; 97 } 98}