Initialize lastUsedElapsedTime to Integer.MIN_VALUE.

Since 'lastUsedElapsedTime' indicates the timestamp at which
the app was last used by the user and this isn't necessarily
the reason why we create AppUsageHistory objects, we shouldn't
be initializing the 'lastUsedElapsedTime' to the timestamp at
which the object is being created.

Also, update 'lastPredictedTime' to Integer.MIN_VALUE as
getElapsedTime() time doesn't return predictable values for
timestamps in the past and passing getElapsedTime(0) isn't
accurate as it basically indicates the timestamp at boot.

Bug: 206518483
Test: atest tests/tests/app.usage/src/android/app/usage/cts/UsageStatsTest.java
Change-Id: Ib90b435b1efc34144f0461aaaf339fc6037ecdc2
This commit is contained in:
Sudheer Shanka 2022-03-15 13:58:49 -07:00
parent 8fb55d4172
commit 7cc9d2d11e
2 changed files with 30 additions and 12 deletions

View File

@ -384,14 +384,16 @@ public class AppIdleHistory {
return userHistory;
}
// TODO (206518483): Remove unused parameter 'elapsedRealtime'.
private AppUsageHistory getPackageHistory(ArrayMap<String, AppUsageHistory> userHistory,
String packageName, long elapsedRealtime, boolean create) {
AppUsageHistory appUsageHistory = userHistory.get(packageName);
if (appUsageHistory == null && create) {
appUsageHistory = new AppUsageHistory();
appUsageHistory.lastUsedElapsedTime = getElapsedTime(elapsedRealtime);
appUsageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime);
appUsageHistory.lastPredictedTime = getElapsedTime(0);
appUsageHistory.lastUsedByUserElapsedTime = Integer.MIN_VALUE;
appUsageHistory.lastUsedElapsedTime = Integer.MIN_VALUE;
appUsageHistory.lastUsedScreenTime = Integer.MIN_VALUE;
appUsageHistory.lastPredictedTime = Integer.MIN_VALUE;
appUsageHistory.currentBucket = STANDBY_BUCKET_NEVER;
appUsageHistory.bucketingReason = REASON_MAIN_DEFAULT;
appUsageHistory.lastInformedBucket = -1;
@ -544,7 +546,7 @@ public class AppIdleHistory {
AppUsageHistory appUsageHistory =
getPackageHistory(userHistory, packageName, elapsedRealtime, false);
if (appUsageHistory == null || appUsageHistory.lastUsedByUserElapsedTime == Long.MIN_VALUE
|| appUsageHistory.lastUsedByUserElapsedTime == 0) {
|| appUsageHistory.lastUsedByUserElapsedTime <= 0) {
return Long.MAX_VALUE;
}
return getElapsedTime(elapsedRealtime) - appUsageHistory.lastUsedByUserElapsedTime;
@ -631,8 +633,12 @@ public class AppIdleHistory {
// If we don't have any state for the app, assume never used
if (appUsageHistory == null) return screenTimeThresholds.length - 1;
long screenOnDelta = getScreenOnTime(elapsedRealtime) - appUsageHistory.lastUsedScreenTime;
long elapsedDelta = getElapsedTime(elapsedRealtime) - appUsageHistory.lastUsedElapsedTime;
long screenOnDelta = appUsageHistory.lastUsedScreenTime >= 0
? getScreenOnTime(elapsedRealtime) - appUsageHistory.lastUsedScreenTime
: Long.MAX_VALUE;
long elapsedDelta = appUsageHistory.lastUsedElapsedTime >= 0
? getElapsedTime(elapsedRealtime) - appUsageHistory.lastUsedElapsedTime
: Long.MAX_VALUE;
if (DEBUG) Slog.d(TAG, packageName
+ " lastUsedScreen=" + appUsageHistory.lastUsedScreenTime
@ -951,14 +957,14 @@ public class AppIdleHistory {
+ " reason="
+ UsageStatsManager.reasonToString(appUsageHistory.bucketingReason));
idpw.print(" used=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastUsedElapsedTime, idpw);
printLastActionElapsedTime(idpw, totalElapsedTime, appUsageHistory.lastUsedElapsedTime);
idpw.print(" usedByUser=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastUsedByUserElapsedTime,
idpw);
printLastActionElapsedTime(idpw, totalElapsedTime,
appUsageHistory.lastUsedByUserElapsedTime);
idpw.print(" usedScr=");
TimeUtils.formatDuration(screenOnTime - appUsageHistory.lastUsedScreenTime, idpw);
printLastActionElapsedTime(idpw, totalElapsedTime, appUsageHistory.lastUsedScreenTime);
idpw.print(" lastPred=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastPredictedTime, idpw);
printLastActionElapsedTime(idpw, totalElapsedTime, appUsageHistory.lastPredictedTime);
dumpBucketExpiryTimes(idpw, appUsageHistory, totalElapsedTime);
idpw.print(" lastJob=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastJobRunTime, idpw);
@ -986,6 +992,15 @@ public class AppIdleHistory {
idpw.decreaseIndent();
}
private void printLastActionElapsedTime(IndentingPrintWriter idpw, long totalElapsedTimeMS,
long lastActionTimeMs) {
if (lastActionTimeMs < 0) {
idpw.print("<uninitialized>");
} else {
TimeUtils.formatDuration(totalElapsedTimeMS - lastActionTimeMs, idpw);
}
}
private void dumpBucketExpiryTimes(IndentingPrintWriter idpw, AppUsageHistory appUsageHistory,
long totalElapsedTimeMs) {
idpw.print(" expiryTimes=");

View File

@ -887,8 +887,11 @@ public class AppStandbyController
}
}
final long elapsedLastUsedByUserTimeDelta = app.lastUsedByUserElapsedTime >= 0
? elapsedTimeAdjusted - app.lastUsedByUserElapsedTime
: Long.MAX_VALUE;
if (app.lastRestrictAttemptElapsedTime > app.lastUsedByUserElapsedTime
&& elapsedTimeAdjusted - app.lastUsedByUserElapsedTime
&& elapsedLastUsedByUserTimeDelta
>= mInjector.getAutoRestrictedBucketDelayMs()) {
newBucket = STANDBY_BUCKET_RESTRICTED;
reason = app.lastRestrictReason;