That fuck shit the fascists are using
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}