diff options
author | Addison Nuding <addison@google.com> | 2016-03-01 18:58:57 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2016-03-01 18:58:58 +0000 |
commit | e2e9e9f15fe3fbffa0d1ee600c63c154f4f7e544 (patch) | |
tree | 0acd4fe9c4b3eb1faf82d81c7189e1147e889608 | |
parent | 834ea63173c1132b4af0faa57d0441f2786c556b (diff) | |
parent | d01567fcb5b61e1e018dbdc9c6de86a960fdb5c0 (diff) | |
download | base-e2e9e9f15fe3fbffa0d1ee600c63c154f4f7e544.tar.gz |
Merge "DO NOT MERGE ANYWHERE: UsageStats: Fix issue where initializing data for first time would cause crash" into mnc-dr-ryu-dev
-rw-r--r-- | services/usage/java/com/android/server/usage/UsageStatsService.java | 3 | ||||
-rw-r--r-- | services/usage/java/com/android/server/usage/UserUsageStatsService.java | 73 |
2 files changed, 41 insertions, 35 deletions
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java index 37448c56fb07..b042d7bb1b69 100644 --- a/services/usage/java/com/android/server/usage/UsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UsageStatsService.java @@ -547,7 +547,8 @@ public class UsageStatsService extends SystemService implements final int userCount = mUserState.size(); for (int i = 0; i < userCount; i++) { final UserUsageStatsService service = mUserState.valueAt(i); - service.onTimeChanged(expectedSystemTime, actualSystemTime, resetBeginIdleTime); + service.onTimeChanged(expectedSystemTime, actualSystemTime, mScreenOnTime, + resetBeginIdleTime); } mRealTimeSnapshot = actualRealtime; mSystemTimeSnapshot = actualSystemTime; diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java index d8f26edaf85e..addb1a1737d4 100644 --- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java +++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java @@ -135,12 +135,12 @@ class UserUsageStatsService { stat.updateConfigurationStats(null, stat.lastTimeSaved); } + refreshAppIdleRollingWindow(currentTimeMillis, deviceUsageTime); + if (mDatabase.isNewUpdate()) { initializeDefaultsForApps(currentTimeMillis, deviceUsageTime, mDatabase.isFirstUpdate()); } - - refreshAppIdleRollingWindow(currentTimeMillis); } /** @@ -162,19 +162,23 @@ class UserUsageStatsService { for (IntervalStats stats : mCurrentStats) { stats.update(packageName, currentTimeMillis, Event.SYSTEM_INTERACTION); stats.updateBeginIdleTime(packageName, deviceUsageTime); - mStatsChanged = true; } + mAppIdleRollingWindow.update(packageName, currentTimeMillis, + Event.SYSTEM_INTERACTION); + mAppIdleRollingWindow.updateBeginIdleTime(packageName, deviceUsageTime); + mStatsChanged = true; } } // Persist the new OTA-related access stats. persistActiveStats(); } - void onTimeChanged(long oldTime, long newTime, boolean resetBeginIdleTime) { + void onTimeChanged(long oldTime, long newTime, long deviceUsageTime, + boolean resetBeginIdleTime) { persistActiveStats(); mDatabase.onTimeChanged(newTime - oldTime); loadActiveStats(newTime, /* force= */ true, resetBeginIdleTime); - refreshAppIdleRollingWindow(newTime); + refreshAppIdleRollingWindow(newTime, deviceUsageTime); } void reportEvent(UsageEvents.Event event, long deviceUsageTime) { @@ -186,7 +190,7 @@ class UserUsageStatsService { if (event.mTimeStamp >= mDailyExpiryDate.getTimeInMillis()) { // Need to rollover - rolloverStats(event.mTimeStamp); + rolloverStats(event.mTimeStamp, deviceUsageTime); } final IntervalStats currentDailyStats = mCurrentStats[UsageStatsManager.INTERVAL_DAILY]; @@ -430,7 +434,7 @@ class UserUsageStatsService { } } - private void rolloverStats(final long currentTimeMillis) { + private void rolloverStats(final long currentTimeMillis, final long deviceUsageTime) { final long startTime = SystemClock.elapsedRealtime(); Slog.i(TAG, mLogPrefix + "Rolling over usage stats"); @@ -471,7 +475,7 @@ class UserUsageStatsService { } persistActiveStats(); - refreshAppIdleRollingWindow(currentTimeMillis); + refreshAppIdleRollingWindow(currentTimeMillis, deviceUsageTime); final long totalTime = SystemClock.elapsedRealtime() - startTime; Slog.i(TAG, mLogPrefix + "Rolling over usage stats complete. Took " + totalTime @@ -542,42 +546,28 @@ class UserUsageStatsService { tempCal.getTimeInMillis() + ")"); } - private static void mergePackageStats(IntervalStats dst, IntervalStats src) { + private static void mergePackageStats(IntervalStats dst, IntervalStats src, + final long deviceUsageTime) { dst.endTime = Math.max(dst.endTime, src.endTime); final int srcPackageCount = src.packageStats.size(); for (int i = 0; i < srcPackageCount; i++) { final String packageName = src.packageStats.keyAt(i); final UsageStats srcStats = src.packageStats.valueAt(i); - final UsageStats dstStats = dst.packageStats.get(packageName); + UsageStats dstStats = dst.packageStats.get(packageName); if (dstStats == null) { - dst.packageStats.put(packageName, new UsageStats(srcStats)); + dstStats = new UsageStats(srcStats); + dst.packageStats.put(packageName, dstStats); } else { dstStats.add(src.packageStats.valueAt(i)); } - } - } - /** - * Merges all the stats into the first element of the resulting list. - */ - private static final StatCombiner<IntervalStats> sPackageStatsMerger = - new StatCombiner<IntervalStats>() { - @Override - public void combine(IntervalStats stats, boolean mutable, - List<IntervalStats> accumulatedResult) { - IntervalStats accum; - if (accumulatedResult.isEmpty()) { - accum = new IntervalStats(); - accum.beginTime = stats.beginTime; - accumulatedResult.add(accum); - } else { - accum = accumulatedResult.get(0); + // App idle times can not begin in the future. This happens if we had a time change. + if (dstStats.mBeginIdleTime > deviceUsageTime) { + dstStats.mBeginIdleTime = deviceUsageTime; } - - mergePackageStats(accum, stats); } - }; + } /** * App idle operates on a rolling window of time. When we roll over time, we end up with a @@ -589,16 +579,31 @@ class UserUsageStatsService { * * @param currentTimeMillis */ - void refreshAppIdleRollingWindow(long currentTimeMillis) { + void refreshAppIdleRollingWindow(final long currentTimeMillis, final long deviceUsageTime) { // Start the rolling window for AppIdle requests. List<IntervalStats> stats = mDatabase.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, currentTimeMillis - (1000 * 60 * 60 * 24 * 2), currentTimeMillis, - sPackageStatsMerger); + new StatCombiner<IntervalStats>() { + @Override + public void combine(IntervalStats stats, boolean mutable, + List<IntervalStats> accumulatedResult) { + IntervalStats accum; + if (accumulatedResult.isEmpty()) { + accum = new IntervalStats(); + accum.beginTime = stats.beginTime; + accumulatedResult.add(accum); + } else { + accum = accumulatedResult.get(0); + } + + mergePackageStats(accum, stats, deviceUsageTime); + } + }); if (stats == null || stats.isEmpty()) { mAppIdleRollingWindow = new IntervalStats(); mergePackageStats(mAppIdleRollingWindow, - mCurrentStats[UsageStatsManager.INTERVAL_YEARLY]); + mCurrentStats[UsageStatsManager.INTERVAL_YEARLY], deviceUsageTime); } else { mAppIdleRollingWindow = stats.get(0); } |