Skip to content

Commit c8e7919

Browse files
committed
refactor: simplify time interval handling in app usage
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
1 parent a58a2f2 commit c8e7919

11 files changed

Lines changed: 279 additions & 78 deletions

File tree

app/src/main/java/io/github/muntashirakon/AppManager/db/utils/AppDb.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import io.github.muntashirakon.AppManager.uri.UriManager;
4646
import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager;
4747
import io.github.muntashirakon.AppManager.usage.PackageUsageInfo;
48+
import io.github.muntashirakon.AppManager.usage.TimeInterval;
4849
import io.github.muntashirakon.AppManager.usage.UsageUtils;
4950
import io.github.muntashirakon.AppManager.users.Users;
5051
import io.github.muntashirakon.AppManager.utils.BroadcastUtils;
@@ -361,8 +362,9 @@ private static void updateVariableData(@NonNull Context context, @NonNull List<A
361362
// Interrupt thread on request
362363
if (ThreadUtils.isInterrupted()) return;
363364
if (hasUsageAccess) {
364-
List<PackageUsageInfo> usageInfoList = ExUtils.exceptionAsNull(() -> AppUsageStatsManager.getInstance()
365-
.getUsageStats(UsageUtils.USAGE_WEEKLY, userId));
365+
TimeInterval interval = UsageUtils.getLastWeek();
366+
List<PackageUsageInfo> usageInfoList = ExUtils.exceptionAsNull(() ->
367+
AppUsageStatsManager.getInstance().getUsageStats(interval, userId));
366368
if (usageInfoList != null) {
367369
packageUsageInfoList.addAll(usageInfoList);
368370
}

app/src/main/java/io/github/muntashirakon/AppManager/details/info/AppInfoViewModel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import io.github.muntashirakon.AppManager.types.PackageSizeInfo;
7171
import io.github.muntashirakon.AppManager.uri.UriManager;
7272
import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager;
73+
import io.github.muntashirakon.AppManager.usage.TimeInterval;
7374
import io.github.muntashirakon.AppManager.usage.UsageUtils;
7475
import io.github.muntashirakon.AppManager.utils.ArrayUtils;
7576
import io.github.muntashirakon.AppManager.utils.ExUtils;
@@ -366,8 +367,8 @@ private void loadAppInfoInternal(@NonNull PackageInfo packageInfo, boolean isExt
366367
if (hasUsageAccess) {
367368
// Net statistics
368369
AppUsageStatsManager.DataUsage dataUsage;
369-
dataUsage = AppUsageStatsManager.getDataUsageForPackage(applicationInfo.uid,
370-
UsageUtils.USAGE_LAST_BOOT);
370+
TimeInterval interval = UsageUtils.getLastWeek();
371+
dataUsage = AppUsageStatsManager.getDataUsageForPackage(applicationInfo.uid, interval);
371372
if (dataUsage.getTotal() == 0 && !ArrayUtils.contains(
372373
packageInfo.requestedPermissions, Manifest.permission.INTERNET)) {
373374
appInfo.dataUsage = null;

app/src/main/java/io/github/muntashirakon/AppManager/filters/FilteringUtils.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import io.github.muntashirakon.AppManager.settings.FeatureController;
2525
import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager;
2626
import io.github.muntashirakon.AppManager.usage.PackageUsageInfo;
27+
import io.github.muntashirakon.AppManager.usage.TimeInterval;
2728
import io.github.muntashirakon.AppManager.usage.UsageUtils;
2829
import io.github.muntashirakon.AppManager.utils.ExUtils;
2930
import io.github.muntashirakon.AppManager.utils.ThreadUtils;
@@ -54,8 +55,9 @@ public static List<FilterableAppInfo> loadFilterableAppInfo(@NonNull int[] userI
5455
// List usages
5556
Map<String, PackageUsageInfo> packageUsageInfoList = new HashMap<>();
5657
if (hasUsageAccess) {
57-
List<PackageUsageInfo> usageInfoList = ExUtils.exceptionAsNull(() -> AppUsageStatsManager.getInstance()
58-
.getUsageStats(UsageUtils.USAGE_WEEKLY, userId));
58+
TimeInterval interval = UsageUtils.getLastWeek();
59+
List<PackageUsageInfo> usageInfoList = ExUtils.exceptionAsNull(() ->
60+
AppUsageStatsManager.getInstance().getUsageStats(interval, userId));
5961
if (usageInfoList != null) {
6062
for (PackageUsageInfo info : usageInfoList) {
6163
if (ThreadUtils.isInterrupted()) return Collections.emptyList();

app/src/main/java/io/github/muntashirakon/AppManager/main/MainViewModel.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
import io.github.muntashirakon.AppManager.types.UserPackagePair;
6969
import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager;
7070
import io.github.muntashirakon.AppManager.usage.PackageUsageInfo;
71+
import io.github.muntashirakon.AppManager.usage.TimeInterval;
7172
import io.github.muntashirakon.AppManager.usage.UsageUtils;
7273
import io.github.muntashirakon.AppManager.users.Users;
7374
import io.github.muntashirakon.AppManager.utils.ArrayUtils;
@@ -462,9 +463,11 @@ private void filterItemsByFlags() {
462463
if (filterItem.getTimesUsageInfoUsed() > 0) {
463464
boolean hasUsageAccess = FeatureController.isUsageAccessEnabled() && SelfPermissions.checkUsageStatsPermission();
464465
if (hasUsageAccess) {
466+
TimeInterval interval = UsageUtils.getLastWeek();
465467
for (int userId : Users.getUsersIds()) {
466-
List<PackageUsageInfo> usageInfoList = ExUtils.exceptionAsNull(() -> AppUsageStatsManager.getInstance()
467-
.getUsageStats(UsageUtils.USAGE_WEEKLY, userId));
468+
List<PackageUsageInfo> usageInfoList;
469+
usageInfoList = ExUtils.exceptionAsNull(() -> AppUsageStatsManager
470+
.getInstance().getUsageStats(interval, userId));
468471
if (usageInfoList != null) {
469472
for (PackageUsageInfo info : usageInfoList) {
470473
if (ThreadUtils.isInterrupted()) return;

app/src/main/java/io/github/muntashirakon/AppManager/oneclickops/BackupTasksDialogFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import io.github.muntashirakon.AppManager.self.SelfPermissions;
3232
import io.github.muntashirakon.AppManager.settings.FeatureController;
3333
import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager;
34-
import io.github.muntashirakon.AppManager.usage.UsageUtils;
34+
import io.github.muntashirakon.AppManager.usage.TimeInterval;
3535
import io.github.muntashirakon.AppManager.utils.CpuUtils;
3636
import io.github.muntashirakon.AppManager.utils.LangUtils;
3737
import io.github.muntashirakon.AppManager.utils.PackageUtils;
@@ -214,7 +214,7 @@ public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
214214
if (needSourceUpdate
215215
// 3. Last activity date
216216
|| (hasUsageAccess && AppUsageStatsManager.getLastActivityTime(item.packageName,
217-
new UsageUtils.TimeInterval(backup.backupTime, System.currentTimeMillis())) > backup.backupTime)
217+
new TimeInterval(backup.backupTime, System.currentTimeMillis())) > backup.backupTime)
218218
// 4. Check directory change
219219
|| isDataDirectoryChanged(backup, ignoredDirs)
220220
// 5. Check integrity

app/src/main/java/io/github/muntashirakon/AppManager/usage/AppUsageStatsManager.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,21 +175,21 @@ private AppUsageStatsManager() {
175175
* called whenever an app goes to background and <code>Activity#onResume</code> is called
176176
* whenever an app appears in foreground.
177177
*
178-
* @param usageInterval Usage interval
178+
* @param interval Usage interval
179179
* @return A list of package usage
180180
* @throws SecurityException If usage stats permission is not available for the user
181181
* @throws RemoteException If usage stats cannot be retrieved due to transaction error
182182
*/
183183
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
184184
@NonNull
185-
public List<PackageUsageInfo> getUsageStats(@UsageUtils.IntervalType int usageInterval, @UserIdInt int userId)
185+
public List<PackageUsageInfo> getUsageStats(@NonNull TimeInterval interval, @UserIdInt int userId)
186186
throws RemoteException, SecurityException {
187187
List<PackageUsageInfo> packageUsageInfoList = new ArrayList<>();
188188
int _try = 5; // try to get usage stats at most 5 times
189189
Throwable re;
190190
do {
191191
try {
192-
packageUsageInfoList.addAll(getUsageStatsInternal(usageInterval, userId));
192+
packageUsageInfoList.addAll(getUsageStatsInternal(interval, userId));
193193
re = null;
194194
} catch (Throwable e) {
195195
re = e;
@@ -204,10 +204,9 @@ public List<PackageUsageInfo> getUsageStats(@UsageUtils.IntervalType int usageIn
204204
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
205205
@NonNull
206206
public PackageUsageInfo getUsageStatsForPackage(@NonNull String packageName,
207-
@UsageUtils.IntervalType int usageInterval,
207+
@NonNull TimeInterval range,
208208
@UserIdInt int userId)
209209
throws RemoteException, PackageManager.NameNotFoundException {
210-
UsageUtils.TimeInterval range = UsageUtils.getTimeInterval(usageInterval);
211210
ApplicationInfo applicationInfo = PackageManagerCompat.getApplicationInfo(packageName, MATCH_UNINSTALLED_PACKAGES
212211
| PackageManagerCompat.MATCH_STATIC_SHARED_AND_SDK_LIBRARIES, userId);
213212
PackageUsageInfo packageUsageInfo = new PackageUsageInfo(mContext, packageName, userId, applicationInfo);
@@ -306,16 +305,15 @@ public void setLastEndTime(long endTime) {
306305
* called whenever an app goes to background and <code>Activity#onResume</code> is called
307306
* whenever an app appears in foreground.
308307
*
309-
* @param usageInterval Usage interval
308+
* @param interval Usage interval
310309
* @return A list of package usage
311310
*/
312311
@NonNull
313-
private List<PackageUsageInfo> getUsageStatsInternal(@UsageUtils.IntervalType int usageInterval,
312+
private List<PackageUsageInfo> getUsageStatsInternal(@NonNull TimeInterval interval,
314313
@UserIdInt int userId) {
315314
List<PackageUsageInfo> screenTimeList = new ArrayList<>();
316315
Map<String, PerPackageUsageInternal> perPackageUsageMap = new HashMap<>();
317316
// Get events
318-
UsageUtils.TimeInterval interval = UsageUtils.getTimeInterval(usageInterval);
319317
List<UsageEvents.Event> events = UsageStatsManagerCompat.queryEventsSorted(interval.getStartTime(), interval.getEndTime(), userId, USUAL_ACTIVITY_EVENTS);
320318
long lastShutdownTime = 0L;
321319
for (UsageEvents.Event event : events) {
@@ -385,7 +383,7 @@ private static boolean isActivityOpened(int eventType) {
385383
}
386384

387385
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
388-
public static long getLastActivityTime(String packageName, @NonNull UsageUtils.TimeInterval interval) {
386+
public static long getLastActivityTime(String packageName, @NonNull TimeInterval interval) {
389387
UsageEvents events = UsageStatsManagerCompat.queryEvents(interval.getStartTime(), interval.getEndTime(),
390388
UserHandleHidden.myUserId());
391389
if (events == null) return 0L;
@@ -402,21 +400,21 @@ public static long getLastActivityTime(String packageName, @NonNull UsageUtils.T
402400

403401
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
404402
@NonNull
405-
public static SparseArrayCompat<DataUsage> getMobileData(@NonNull UsageUtils.TimeInterval interval) {
403+
public static SparseArrayCompat<DataUsage> getMobileData(@NonNull TimeInterval interval) {
406404
return getDataUsageForNetwork(TRANSPORT_CELLULAR, interval);
407405
}
408406

409407

410408
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
411409
@NonNull
412-
public static SparseArrayCompat<DataUsage> getWifiData(@NonNull UsageUtils.TimeInterval interval) {
410+
public static SparseArrayCompat<DataUsage> getWifiData(@NonNull TimeInterval interval) {
413411
return getDataUsageForNetwork(TRANSPORT_WIFI, interval);
414412
}
415413

416414
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
417415
@NonNull
418416
public static SparseArrayCompat<DataUsage> getDataUsageForNetwork(@Transport int networkType,
419-
@NonNull UsageUtils.TimeInterval interval) {
417+
@NonNull TimeInterval interval) {
420418
SparseArrayCompat<DataUsage> dataUsageSparseArray = new SparseArrayCompat<>();
421419
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
422420
@SuppressWarnings("deprecation")
@@ -453,13 +451,12 @@ public static SparseArrayCompat<DataUsage> getDataUsageForNetwork(@Transport int
453451

454452
@RequiresPermission("android.permission.PACKAGE_USAGE_STATS")
455453
@NonNull
456-
public static DataUsage getDataUsageForPackage(int uid, @UsageUtils.IntervalType int intervalType) {
454+
public static DataUsage getDataUsageForPackage(int uid, @NonNull TimeInterval range) {
457455
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
458456
@SuppressWarnings("deprecation")
459457
ProcUidNetStat netStat = ProcFs.getInstance().getUidNetStat(uid);
460458
return netStat != null ? new DataUsage(netStat.txBytes, netStat.rxBytes) : DataUsage.EMPTY;
461459
}
462-
UsageUtils.TimeInterval range = UsageUtils.getTimeInterval(intervalType);
463460
List<String> subscriberIds;
464461
long totalTx = 0;
465462
long totalRx = 0;

app/src/main/java/io/github/muntashirakon/AppManager/usage/AppUsageViewModel.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,9 @@ public boolean hasMultipleUsers() {
7575

7676
public void loadPackageUsageInfo(PackageUsageInfo usageInfo) {
7777
ThreadUtils.postOnBackgroundThread(() -> ExUtils.exceptionAsIgnored(() -> {
78-
PackageUsageInfo packageUsageInfo = AppUsageStatsManager.getInstance().getUsageStatsForPackage(
79-
usageInfo.packageName, mCurrentInterval, usageInfo.userId);
78+
TimeInterval interval = UsageUtils.getTimeInterval(mCurrentInterval);
79+
PackageUsageInfo packageUsageInfo = AppUsageStatsManager.getInstance()
80+
.getUsageStatsForPackage(usageInfo.packageName, interval, usageInfo.userId);
8081
packageUsageInfo.copyOthers(usageInfo);
8182
mPackageUsageInfoLiveData.postValue(packageUsageInfo);
8283
}));
@@ -87,10 +88,11 @@ public void loadPackageUsageInfoList() {
8788
ThreadUtils.postOnBackgroundThread(() -> {
8889
int[] userIds = Users.getUsersIds();
8990
AppUsageStatsManager usageStatsManager = AppUsageStatsManager.getInstance();
91+
TimeInterval interval = UsageUtils.getTimeInterval(mCurrentInterval);
9092
mPackageUsageInfoList.clear();
9193
for (int userId : userIds) {
9294
ExUtils.exceptionAsIgnored(() -> mPackageUsageInfoList.addAll(usageStatsManager
93-
.getUsageStats(mCurrentInterval, userId)));
95+
.getUsageStats(interval, userId)));
9496
}
9597
mTotalScreenTime = 0;
9698
Set<Integer> users = new HashSet<>(3);

app/src/main/java/io/github/muntashirakon/AppManager/usage/DataUsageAppWidget.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
3333
// Fetch colors
3434
context = AppearanceUtils.getThemedWidgetContext(context, false);
3535
// Fetch data
36-
UsageUtils.TimeInterval interval = UsageUtils.getTimeInterval(UsageUtils.USAGE_TODAY);
36+
TimeInterval interval = UsageUtils.getToday();
3737
SparseArrayCompat<AppUsageStatsManager.DataUsage> mobileData = AppUsageStatsManager.getMobileData(interval);
3838
SparseArrayCompat<AppUsageStatsManager.DataUsage> wifiData = AppUsageStatsManager.getWifiData(interval);
3939
long mobileTx = 0;

app/src/main/java/io/github/muntashirakon/AppManager/usage/ScreenTimeAppWidget.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,10 @@ static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
4545
int[] userIds = Users.getUsersIds();
4646
List<PackageUsageInfo> packageUsageInfoList = new ArrayList<>();
4747
AppUsageStatsManager usageStatsManager = AppUsageStatsManager.getInstance();
48+
TimeInterval interval = UsageUtils.getToday();
4849
for (int userId : userIds) {
4950
ExUtils.exceptionAsIgnored(() -> packageUsageInfoList.addAll(usageStatsManager
50-
.getUsageStats(UsageUtils.USAGE_TODAY, userId)));
51+
.getUsageStats(interval, userId)));
5152
}
5253
Collections.sort(packageUsageInfoList, (o1, o2) -> -Long.compare(o1.screenTime, o2.screenTime));
5354
long totalScreenTime = 0;
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// SPDX-License-Identifier: GPL-3.0-or-later
2+
3+
package io.github.muntashirakon.AppManager.usage;
4+
5+
import androidx.annotation.NonNull;
6+
import androidx.core.util.Pair;
7+
8+
public class TimeInterval extends Pair<Long, Long> {
9+
private final int mIntervalType;
10+
11+
public TimeInterval(int intervalType, long begin, long end) {
12+
super(begin, end);
13+
mIntervalType = intervalType;
14+
}
15+
16+
public TimeInterval(long begin, long end) {
17+
super(begin, end);
18+
mIntervalType = UsageUtils.USAGE_TODAY;
19+
}
20+
21+
public int getIntervalType() {
22+
return mIntervalType;
23+
}
24+
25+
public long getStartTime() {
26+
return first;
27+
}
28+
29+
public long getEndTime() {
30+
return second;
31+
}
32+
33+
public long getDuration() {
34+
return second - first + 1;
35+
}
36+
37+
@NonNull
38+
@Override
39+
public String toString() {
40+
return "TimeInterval{" +
41+
"startTime=" + first +
42+
", endTime=" + second +
43+
'}';
44+
}
45+
}

0 commit comments

Comments
 (0)