Loading services/usage/java/com/android/server/usage/IntervalStats.java +5 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,11 @@ class IntervalStats { usageStats.mBeginIdleTime = timeStamp; } void updateLastUsedTime(String packageName, long lastUsedTime) { UsageStats usageStats = getOrCreateUsageStats(packageName); usageStats.mLastTimeUsed = lastUsedTime; } void updateConfigurationStats(Configuration config, long timeStamp) { if (activeConfiguration != null) { ConfigurationStats activeStats = configurations.get(activeConfiguration); Loading services/usage/java/com/android/server/usage/UsageStatsService.java +36 −21 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ public class UsageStatsService extends SystemService implements private static final long TIME_CHANGE_THRESHOLD_MILLIS = 2 * 1000; // Two seconds. static final long DEFAULT_APP_IDLE_THRESHOLD_MILLIS = DEBUG ? ONE_MINUTE * 4 : 1L * 24 * 60 * ONE_MINUTE; // 1 day : 12 * 60 * ONE_MINUTE; // 12 hours of screen-on time sans dream-time static final long DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS = DEBUG ? ONE_MINUTE * 8 : 2L * 24 * 60 * ONE_MINUTE; // 2 days static final long DEFAULT_CHECK_IDLE_INTERVAL = DEBUG ? ONE_MINUTE : 8 * 60 * ONE_MINUTE; // 8 hours static final long DEFAULT_PAROLE_INTERVAL = DEBUG ? ONE_MINUTE * 10 Loading Loading @@ -356,7 +358,7 @@ public class UsageStatsService extends SystemService implements final int packageCount = packages.size(); for (int p = 0; p < packageCount; p++) { final String packageName = packages.get(p).packageName; final boolean isIdle = isAppIdleFiltered(packageName, userId); final boolean isIdle = isAppIdleFiltered(packageName, userId, timeNow); mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId, isIdle ? 1 : 0, packageName)); mAppIdleHistory.addEntry(packageName, userId, isIdle, timeNow); Loading Loading @@ -386,7 +388,8 @@ public class UsageStatsService extends SystemService implements void updateDisplayLocked() { boolean screenOn = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() != Display.STATE_OFF; == Display.STATE_ON; if (screenOn == mScreenOn) return; mScreenOn = screenOn; Loading Loading @@ -533,14 +536,16 @@ public class UsageStatsService extends SystemService implements void reportEvent(UsageEvents.Event event, int userId) { synchronized (mLock) { final long timeNow = checkAndGetTimeLocked(); final long screenOnTime = getScreenOnTimeLocked(timeNow); convertToSystemTimeLocked(event); final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); final long lastUsed = service.getBeginIdleTime(event.mPackage); final long screenOnTime = getScreenOnTimeLocked(timeNow); final boolean previouslyIdle = hasPassedIdleTimeout(lastUsed, screenOnTime); service.reportEvent(event, screenOnTime); final long beginIdleTime = service.getBeginIdleTime(event.mPackage); final long lastUsedTime = service.getLastUsedTime(event.mPackage); final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); service.reportEvent(event, getScreenOnTimeLocked(timeNow)); // Inform listeners if necessary if ((event.mEventType == Event.MOVE_TO_FOREGROUND || event.mEventType == Event.MOVE_TO_BACKGROUND Loading @@ -556,8 +561,9 @@ public class UsageStatsService extends SystemService implements } /** * Forces the app's beginIdleTime to reflect idle or active. If idle, then it rolls back the * beginIdleTime to a point in time thats behind the threshold for idle. * Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle, * then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind * the threshold for idle. */ void forceIdleState(String packageName, int userId, boolean idle) { synchronized (mLock) { Loading @@ -567,10 +573,13 @@ public class UsageStatsService extends SystemService implements final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); final long lastUsed = service.getBeginIdleTime(packageName); final boolean previouslyIdle = hasPassedIdleTimeout(lastUsed, getScreenOnTimeLocked(timeNow)); final long beginIdleTime = service.getBeginIdleTime(packageName); final long lastUsedTime = service.getLastUsedTime(packageName); final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); service.setBeginIdleTime(packageName, deviceUsageTime); service.setLastUsedTime(packageName, timeNow - (idle ? DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS : 0) - 5000); // Inform listeners if necessary if (previouslyIdle != idle) { // Slog.d(TAG, "Informing listeners of out-of-idle " + event.mPackage); Loading Loading @@ -650,13 +659,14 @@ public class UsageStatsService extends SystemService implements } } private boolean isAppIdleUnfiltered(String packageName, int userId) { private boolean isAppIdleUnfiltered(String packageName, int userId, long timeNow) { synchronized (mLock) { final long timeNow = checkAndGetTimeLocked(); final long screenOnTime = getScreenOnTimeLocked(timeNow); final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); long beginIdleTime = service.getBeginIdleTime(packageName); return hasPassedIdleTimeout(beginIdleTime, getScreenOnTimeLocked(timeNow)); long lastUsedTime = service.getLastUsedTime(packageName); return hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); } } Loading @@ -665,8 +675,10 @@ public class UsageStatsService extends SystemService implements * @param currentTime current time in device usage timebase * @return whether it's been used far enough in the past to be considered inactive */ boolean hasPassedIdleTimeout(long timestamp, long currentTime) { return timestamp <= currentTime - mAppIdleDurationMillis; boolean hasPassedIdleTimeoutLocked(long beginIdleTime, long lastUsedTime, long screenOnTime, long currentTime) { return (beginIdleTime <= screenOnTime - mAppIdleDurationMillis) && (lastUsedTime <= currentTime - DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS); } void addListener(AppIdleStateChangeListener listener) { Loading @@ -689,9 +701,12 @@ public class UsageStatsService extends SystemService implements * This happens if the device is plugged in or temporarily allowed to make exceptions. * Called by interface impls. */ boolean isAppIdleFiltered(String packageName, int userId) { boolean isAppIdleFiltered(String packageName, int userId, long timeNow) { if (packageName == null) return false; synchronized (mLock) { if (timeNow == -1) { timeNow = checkAndGetTimeLocked(); } // Temporary exemption, probably due to device charging or occasional allowance to // be allowed to sync, etc. if (mAppIdleParoled) { Loading @@ -715,7 +730,7 @@ public class UsageStatsService extends SystemService implements return false; } return isAppIdleUnfiltered(packageName, userId); return isAppIdleUnfiltered(packageName, userId, timeNow); } void setAppIdle(String packageName, boolean idle, int userId) { Loading Loading @@ -948,7 +963,7 @@ public class UsageStatsService extends SystemService implements } final long token = Binder.clearCallingIdentity(); try { return UsageStatsService.this.isAppIdleFiltered(packageName, userId); return UsageStatsService.this.isAppIdleFiltered(packageName, userId, -1); } finally { Binder.restoreCallingIdentity(token); } Loading Loading @@ -1053,7 +1068,7 @@ public class UsageStatsService extends SystemService implements @Override public boolean isAppIdle(String packageName, int userId) { return UsageStatsService.this.isAppIdleFiltered(packageName, userId); return UsageStatsService.this.isAppIdleFiltered(packageName, userId, -1); } @Override Loading services/usage/java/com/android/server/usage/UserUsageStatsService.java +21 −4 Original line number Diff line number Diff line Loading @@ -216,12 +216,19 @@ class UserUsageStatsService { } /** * Sets the last timestamp for each of the intervals. * @param lastTimestamp * Sets the beginIdleTime for each of the intervals. * @param beginIdleTime */ void setBeginIdleTime(String packageName, long deviceUsageTime) { void setBeginIdleTime(String packageName, long beginIdleTime) { for (IntervalStats stats : mCurrentStats) { stats.updateBeginIdleTime(packageName, deviceUsageTime); stats.updateBeginIdleTime(packageName, beginIdleTime); } notifyStatsChanged(); } void setLastUsedTime(String packageName, long lastUsedTime) { for (IntervalStats stats : mCurrentStats) { stats.updateLastUsedTime(packageName, lastUsedTime); } notifyStatsChanged(); } Loading Loading @@ -390,6 +397,16 @@ class UserUsageStatsService { } } long getLastUsedTime(String packageName) { final IntervalStats yearly = mCurrentStats[UsageStatsManager.INTERVAL_YEARLY]; UsageStats packageUsage; if ((packageUsage = yearly.packageStats.get(packageName)) == null) { return -1; } else { return packageUsage.getLastTimeUsed(); } } void persistActiveStats() { if (mStatsChanged) { Slog.i(TAG, mLogPrefix + "Flushing usage stats to disk"); Loading Loading
services/usage/java/com/android/server/usage/IntervalStats.java +5 −0 Original line number Diff line number Diff line Loading @@ -131,6 +131,11 @@ class IntervalStats { usageStats.mBeginIdleTime = timeStamp; } void updateLastUsedTime(String packageName, long lastUsedTime) { UsageStats usageStats = getOrCreateUsageStats(packageName); usageStats.mLastTimeUsed = lastUsedTime; } void updateConfigurationStats(Configuration config, long timeStamp) { if (activeConfiguration != null) { ConfigurationStats activeStats = configurations.get(activeConfiguration); Loading
services/usage/java/com/android/server/usage/UsageStatsService.java +36 −21 Original line number Diff line number Diff line Loading @@ -99,7 +99,9 @@ public class UsageStatsService extends SystemService implements private static final long TIME_CHANGE_THRESHOLD_MILLIS = 2 * 1000; // Two seconds. static final long DEFAULT_APP_IDLE_THRESHOLD_MILLIS = DEBUG ? ONE_MINUTE * 4 : 1L * 24 * 60 * ONE_MINUTE; // 1 day : 12 * 60 * ONE_MINUTE; // 12 hours of screen-on time sans dream-time static final long DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS = DEBUG ? ONE_MINUTE * 8 : 2L * 24 * 60 * ONE_MINUTE; // 2 days static final long DEFAULT_CHECK_IDLE_INTERVAL = DEBUG ? ONE_MINUTE : 8 * 60 * ONE_MINUTE; // 8 hours static final long DEFAULT_PAROLE_INTERVAL = DEBUG ? ONE_MINUTE * 10 Loading Loading @@ -356,7 +358,7 @@ public class UsageStatsService extends SystemService implements final int packageCount = packages.size(); for (int p = 0; p < packageCount; p++) { final String packageName = packages.get(p).packageName; final boolean isIdle = isAppIdleFiltered(packageName, userId); final boolean isIdle = isAppIdleFiltered(packageName, userId, timeNow); mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId, isIdle ? 1 : 0, packageName)); mAppIdleHistory.addEntry(packageName, userId, isIdle, timeNow); Loading Loading @@ -386,7 +388,8 @@ public class UsageStatsService extends SystemService implements void updateDisplayLocked() { boolean screenOn = mDisplayManager.getDisplay(Display.DEFAULT_DISPLAY).getState() != Display.STATE_OFF; == Display.STATE_ON; if (screenOn == mScreenOn) return; mScreenOn = screenOn; Loading Loading @@ -533,14 +536,16 @@ public class UsageStatsService extends SystemService implements void reportEvent(UsageEvents.Event event, int userId) { synchronized (mLock) { final long timeNow = checkAndGetTimeLocked(); final long screenOnTime = getScreenOnTimeLocked(timeNow); convertToSystemTimeLocked(event); final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); final long lastUsed = service.getBeginIdleTime(event.mPackage); final long screenOnTime = getScreenOnTimeLocked(timeNow); final boolean previouslyIdle = hasPassedIdleTimeout(lastUsed, screenOnTime); service.reportEvent(event, screenOnTime); final long beginIdleTime = service.getBeginIdleTime(event.mPackage); final long lastUsedTime = service.getLastUsedTime(event.mPackage); final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); service.reportEvent(event, getScreenOnTimeLocked(timeNow)); // Inform listeners if necessary if ((event.mEventType == Event.MOVE_TO_FOREGROUND || event.mEventType == Event.MOVE_TO_BACKGROUND Loading @@ -556,8 +561,9 @@ public class UsageStatsService extends SystemService implements } /** * Forces the app's beginIdleTime to reflect idle or active. If idle, then it rolls back the * beginIdleTime to a point in time thats behind the threshold for idle. * Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle, * then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind * the threshold for idle. */ void forceIdleState(String packageName, int userId, boolean idle) { synchronized (mLock) { Loading @@ -567,10 +573,13 @@ public class UsageStatsService extends SystemService implements final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); final long lastUsed = service.getBeginIdleTime(packageName); final boolean previouslyIdle = hasPassedIdleTimeout(lastUsed, getScreenOnTimeLocked(timeNow)); final long beginIdleTime = service.getBeginIdleTime(packageName); final long lastUsedTime = service.getLastUsedTime(packageName); final boolean previouslyIdle = hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); service.setBeginIdleTime(packageName, deviceUsageTime); service.setLastUsedTime(packageName, timeNow - (idle ? DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS : 0) - 5000); // Inform listeners if necessary if (previouslyIdle != idle) { // Slog.d(TAG, "Informing listeners of out-of-idle " + event.mPackage); Loading Loading @@ -650,13 +659,14 @@ public class UsageStatsService extends SystemService implements } } private boolean isAppIdleUnfiltered(String packageName, int userId) { private boolean isAppIdleUnfiltered(String packageName, int userId, long timeNow) { synchronized (mLock) { final long timeNow = checkAndGetTimeLocked(); final long screenOnTime = getScreenOnTimeLocked(timeNow); final UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId, timeNow); long beginIdleTime = service.getBeginIdleTime(packageName); return hasPassedIdleTimeout(beginIdleTime, getScreenOnTimeLocked(timeNow)); long lastUsedTime = service.getLastUsedTime(packageName); return hasPassedIdleTimeoutLocked(beginIdleTime, lastUsedTime, screenOnTime, timeNow); } } Loading @@ -665,8 +675,10 @@ public class UsageStatsService extends SystemService implements * @param currentTime current time in device usage timebase * @return whether it's been used far enough in the past to be considered inactive */ boolean hasPassedIdleTimeout(long timestamp, long currentTime) { return timestamp <= currentTime - mAppIdleDurationMillis; boolean hasPassedIdleTimeoutLocked(long beginIdleTime, long lastUsedTime, long screenOnTime, long currentTime) { return (beginIdleTime <= screenOnTime - mAppIdleDurationMillis) && (lastUsedTime <= currentTime - DEFAULT_WALLCLOCK_APP_IDLE_THRESHOLD_MILLIS); } void addListener(AppIdleStateChangeListener listener) { Loading @@ -689,9 +701,12 @@ public class UsageStatsService extends SystemService implements * This happens if the device is plugged in or temporarily allowed to make exceptions. * Called by interface impls. */ boolean isAppIdleFiltered(String packageName, int userId) { boolean isAppIdleFiltered(String packageName, int userId, long timeNow) { if (packageName == null) return false; synchronized (mLock) { if (timeNow == -1) { timeNow = checkAndGetTimeLocked(); } // Temporary exemption, probably due to device charging or occasional allowance to // be allowed to sync, etc. if (mAppIdleParoled) { Loading @@ -715,7 +730,7 @@ public class UsageStatsService extends SystemService implements return false; } return isAppIdleUnfiltered(packageName, userId); return isAppIdleUnfiltered(packageName, userId, timeNow); } void setAppIdle(String packageName, boolean idle, int userId) { Loading Loading @@ -948,7 +963,7 @@ public class UsageStatsService extends SystemService implements } final long token = Binder.clearCallingIdentity(); try { return UsageStatsService.this.isAppIdleFiltered(packageName, userId); return UsageStatsService.this.isAppIdleFiltered(packageName, userId, -1); } finally { Binder.restoreCallingIdentity(token); } Loading Loading @@ -1053,7 +1068,7 @@ public class UsageStatsService extends SystemService implements @Override public boolean isAppIdle(String packageName, int userId) { return UsageStatsService.this.isAppIdleFiltered(packageName, userId); return UsageStatsService.this.isAppIdleFiltered(packageName, userId, -1); } @Override Loading
services/usage/java/com/android/server/usage/UserUsageStatsService.java +21 −4 Original line number Diff line number Diff line Loading @@ -216,12 +216,19 @@ class UserUsageStatsService { } /** * Sets the last timestamp for each of the intervals. * @param lastTimestamp * Sets the beginIdleTime for each of the intervals. * @param beginIdleTime */ void setBeginIdleTime(String packageName, long deviceUsageTime) { void setBeginIdleTime(String packageName, long beginIdleTime) { for (IntervalStats stats : mCurrentStats) { stats.updateBeginIdleTime(packageName, deviceUsageTime); stats.updateBeginIdleTime(packageName, beginIdleTime); } notifyStatsChanged(); } void setLastUsedTime(String packageName, long lastUsedTime) { for (IntervalStats stats : mCurrentStats) { stats.updateLastUsedTime(packageName, lastUsedTime); } notifyStatsChanged(); } Loading Loading @@ -390,6 +397,16 @@ class UserUsageStatsService { } } long getLastUsedTime(String packageName) { final IntervalStats yearly = mCurrentStats[UsageStatsManager.INTERVAL_YEARLY]; UsageStats packageUsage; if ((packageUsage = yearly.packageStats.get(packageName)) == null) { return -1; } else { return packageUsage.getLastTimeUsed(); } } void persistActiveStats() { if (mStatsChanged) { Slog.i(TAG, mLogPrefix + "Flushing usage stats to disk"); Loading