AppIdleHistory: Only write screen on durations during regular sync

Stop writing to disk every time the display goes off. Only write to
disk periodically.

Consequences

Previously, if the device rebooted after the screen duration was written
to disk, apps would appear more stale than they actually were.

Now apps will always look fresher, which is a better scenario.

Bug:30807864
Change-Id: Ia69a2e51fc9e397789215b449fae56fa3e29c74a
This commit is contained in:
Adam Lesinski
2016-08-17 15:21:16 -07:00
parent ee4ff424ea
commit f2d87eba75
3 changed files with 7 additions and 8 deletions

View File

@@ -67,7 +67,7 @@ public class AppIdleHistoryTests extends AndroidTestCase {
// Screen on time should not keep progressing with screen is off
assertEquals(aih.getScreenOnTimeLocked(7000), 3000);
assertEquals(aih.getScreenOnTimeLocked(8000), 3000);
aih.writeElapsedTimeLocked();
aih.writeAppIdleDurationsLocked();
// Check if the screen on time is persisted across instantiations
AppIdleHistory aih2 = new AppIdleHistory(mStorageDir, 0);

View File

@@ -118,7 +118,6 @@ public class AppIdleHistory {
} else {
mScreenOnDuration += elapsedRealtime - mScreenOnSnapshot;
mElapsedDuration += elapsedRealtime - mElapsedSnapshot;
writeScreenOnTimeLocked();
mElapsedSnapshot = elapsedRealtime;
}
}
@@ -167,7 +166,7 @@ public class AppIdleHistory {
/**
* To be called periodically to keep track of elapsed time when app idle times are written
*/
public void writeElapsedTimeLocked() {
public void writeAppIdleDurationsLocked() {
final long elapsedRealtime = SystemClock.elapsedRealtime();
// Only bump up and snapshot the elapsed time. Don't change screen on duration.
mElapsedDuration += elapsedRealtime - mElapsedSnapshot;

View File

@@ -304,9 +304,9 @@ public class UsageStatsService extends SystemService implements
@Override public void onDisplayChanged(int displayId) {
if (displayId == Display.DEFAULT_DISPLAY) {
final boolean displayOn = isDisplayOn();
synchronized (UsageStatsService.this.mLock) {
mAppIdleHistory.updateDisplayLocked(isDisplayOn(),
SystemClock.elapsedRealtime());
mAppIdleHistory.updateDisplayLocked(displayOn, SystemClock.elapsedRealtime());
}
}
}
@@ -1005,9 +1005,9 @@ public class UsageStatsService extends SystemService implements
service.persistActiveStats();
mAppIdleHistory.writeAppIdleTimesLocked(mUserState.keyAt(i));
}
// Persist elapsed time periodically, in case screen doesn't get toggled
// until the next boot
mAppIdleHistory.writeElapsedTimeLocked();
// Persist elapsed and screen on time. If this fails for whatever reason, the apps will be
// considered not-idle, which is the safest outcome in such an event.
mAppIdleHistory.writeAppIdleDurationsLocked();
mHandler.removeMessages(MSG_FLUSH_TO_DISK);
}