Merge "DO NOT MERGE ANYWHERE: Don't change screen on time on time changes" into mnc-dr-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
3e439db8c8
@@ -165,14 +165,18 @@ public final class UsageStats implements Parcelable {
|
|||||||
mPackageName + "' with UsageStats for package '" + right.mPackageName + "'.");
|
mPackageName + "' with UsageStats for package '" + right.mPackageName + "'.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (right.mEndTimeStamp > mEndTimeStamp) {
|
if (right.mBeginTimeStamp > mBeginTimeStamp) {
|
||||||
|
// The incoming UsageStat begins after this one, so use its last time used fields
|
||||||
|
// as the source of truth.
|
||||||
|
// We use the mBeginTimeStamp due to a bug where UsageStats files can overlap with
|
||||||
|
// regards to their mEndTimeStamp.
|
||||||
mLastEvent = right.mLastEvent;
|
mLastEvent = right.mLastEvent;
|
||||||
mEndTimeStamp = right.mEndTimeStamp;
|
|
||||||
mLastTimeUsed = right.mLastTimeUsed;
|
mLastTimeUsed = right.mLastTimeUsed;
|
||||||
mBeginIdleTime = right.mBeginIdleTime;
|
mBeginIdleTime = right.mBeginIdleTime;
|
||||||
mLastTimeSystemUsed = right.mLastTimeSystemUsed;
|
mLastTimeSystemUsed = right.mLastTimeSystemUsed;
|
||||||
}
|
}
|
||||||
mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
|
mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp);
|
||||||
|
mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp);
|
||||||
mTotalTimeInForeground += right.mTotalTimeInForeground;
|
mTotalTimeInForeground += right.mTotalTimeInForeground;
|
||||||
mLaunchCount += right.mLaunchCount;
|
mLaunchCount += right.mLaunchCount;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,6 +123,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
static final int MSG_PAROLE_END_TIMEOUT = 7;
|
static final int MSG_PAROLE_END_TIMEOUT = 7;
|
||||||
static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8;
|
static final int MSG_REPORT_CONTENT_PROVIDER_USAGE = 8;
|
||||||
static final int MSG_PAROLE_STATE_CHANGED = 9;
|
static final int MSG_PAROLE_STATE_CHANGED = 9;
|
||||||
|
static final int MSG_ONE_TIME_CHECK_IDLE_STATES = 10;
|
||||||
|
|
||||||
private final Object mLock = new Object();
|
private final Object mLock = new Object();
|
||||||
Handler mHandler;
|
Handler mHandler;
|
||||||
@@ -145,7 +146,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
private long mLastAppIdleParoledTime;
|
private long mLastAppIdleParoledTime;
|
||||||
|
|
||||||
long mScreenOnTime;
|
long mScreenOnTime;
|
||||||
long mScreenOnSystemTimeSnapshot;
|
long mLastScreenOnEventRealtime;
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
@GuardedBy("mLock")
|
||||||
private AppIdleHistory mAppIdleHistory = new AppIdleHistory();
|
private AppIdleHistory mAppIdleHistory = new AppIdleHistory();
|
||||||
@@ -188,6 +189,8 @@ public class UsageStatsService extends SystemService implements
|
|||||||
|
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
cleanUpRemovedUsersLocked();
|
cleanUpRemovedUsersLocked();
|
||||||
|
mLastScreenOnEventRealtime = SystemClock.elapsedRealtime();
|
||||||
|
mScreenOnTime = readScreenOnTimeLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
mRealTimeSnapshot = SystemClock.elapsedRealtime();
|
mRealTimeSnapshot = SystemClock.elapsedRealtime();
|
||||||
@@ -214,10 +217,6 @@ public class UsageStatsService extends SystemService implements
|
|||||||
Context.DISPLAY_SERVICE);
|
Context.DISPLAY_SERVICE);
|
||||||
mPowerManager = getContext().getSystemService(PowerManager.class);
|
mPowerManager = getContext().getSystemService(PowerManager.class);
|
||||||
|
|
||||||
mScreenOnSystemTimeSnapshot = System.currentTimeMillis();
|
|
||||||
synchronized (this) {
|
|
||||||
mScreenOnTime = readScreenOnTimeLocked();
|
|
||||||
}
|
|
||||||
mDisplayManager.registerDisplayListener(mDisplayListener, null);
|
mDisplayManager.registerDisplayListener(mDisplayListener, null);
|
||||||
synchronized (this) {
|
synchronized (this) {
|
||||||
updateDisplayLocked();
|
updateDisplayLocked();
|
||||||
@@ -280,6 +279,11 @@ public class UsageStatsService extends SystemService implements
|
|||||||
mHandler.sendEmptyMessageDelayed(MSG_FLUSH_TO_DISK, FLUSH_INTERVAL);
|
mHandler.sendEmptyMessageDelayed(MSG_FLUSH_TO_DISK, FLUSH_INTERVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStatsReloaded() {
|
||||||
|
postOneTimeCheckIdleStates();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public long getAppIdleRollingWindowDurationMillis() {
|
public long getAppIdleRollingWindowDurationMillis() {
|
||||||
return mAppIdleWallclockThresholdMillis * 2;
|
return mAppIdleWallclockThresholdMillis * 2;
|
||||||
@@ -359,6 +363,14 @@ public class UsageStatsService extends SystemService implements
|
|||||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0));
|
mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We send a different message to check idle states once, otherwise we would end up
|
||||||
|
* scheduling a series of repeating checkIdleStates each time we fired off one.
|
||||||
|
*/
|
||||||
|
void postOneTimeCheckIdleStates() {
|
||||||
|
mHandler.sendEmptyMessage(MSG_ONE_TIME_CHECK_IDLE_STATES);
|
||||||
|
}
|
||||||
|
|
||||||
/** Check all running users' or specified user's apps to see if they enter an idle state. */
|
/** Check all running users' or specified user's apps to see if they enter an idle state. */
|
||||||
void checkIdleStates(int checkUserId) {
|
void checkIdleStates(int checkUserId) {
|
||||||
if (!mAppIdleEnabled) {
|
if (!mAppIdleEnabled) {
|
||||||
@@ -385,7 +397,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
userId);
|
userId);
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
final long timeNow = checkAndGetTimeLocked();
|
final long timeNow = checkAndGetTimeLocked();
|
||||||
final long screenOnTime = getScreenOnTimeLocked(timeNow);
|
final long screenOnTime = getScreenOnTimeLocked();
|
||||||
UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId,
|
UserUsageStatsService service = getUserDataAndInitializeIfNeededLocked(userId,
|
||||||
timeNow);
|
timeNow);
|
||||||
final int packageCount = packages.size();
|
final int packageCount = packages.size();
|
||||||
@@ -401,8 +413,6 @@ public class UsageStatsService extends SystemService implements
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mHandler.sendMessageDelayed(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, checkUserId, 0),
|
|
||||||
mCheckIdleIntervalMillis);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Check if it's been a while since last parole and let idle apps do some work */
|
/** Check if it's been a while since last parole and let idle apps do some work */
|
||||||
@@ -442,21 +452,21 @@ public class UsageStatsService extends SystemService implements
|
|||||||
if (screenOn == mScreenOn) return;
|
if (screenOn == mScreenOn) return;
|
||||||
|
|
||||||
mScreenOn = screenOn;
|
mScreenOn = screenOn;
|
||||||
long now = System.currentTimeMillis();
|
long now = SystemClock.elapsedRealtime();
|
||||||
if (mScreenOn) {
|
if (mScreenOn) {
|
||||||
mScreenOnSystemTimeSnapshot = now;
|
mLastScreenOnEventRealtime = now;
|
||||||
} else {
|
} else {
|
||||||
mScreenOnTime += now - mScreenOnSystemTimeSnapshot;
|
mScreenOnTime += now - mLastScreenOnEventRealtime;
|
||||||
writeScreenOnTimeLocked(mScreenOnTime);
|
writeScreenOnTimeLocked(mScreenOnTime);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private long getScreenOnTimeLocked(long now) {
|
long getScreenOnTimeLocked() {
|
||||||
|
long screenOnTime = mScreenOnTime;
|
||||||
if (mScreenOn) {
|
if (mScreenOn) {
|
||||||
return now - mScreenOnSystemTimeSnapshot + mScreenOnTime;
|
screenOnTime += SystemClock.elapsedRealtime() - mLastScreenOnEventRealtime;
|
||||||
} else {
|
|
||||||
return mScreenOnTime;
|
|
||||||
}
|
}
|
||||||
|
return screenOnTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
private File getScreenOnTimeFile() {
|
private File getScreenOnTimeFile() {
|
||||||
@@ -526,7 +536,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
if (service == null) {
|
if (service == null) {
|
||||||
service = new UserUsageStatsService(getContext(), userId,
|
service = new UserUsageStatsService(getContext(), userId,
|
||||||
new File(mUsageStatsDir, Integer.toString(userId)), this);
|
new File(mUsageStatsDir, Integer.toString(userId)), this);
|
||||||
service.init(currentTimeMillis, getScreenOnTimeLocked(currentTimeMillis));
|
service.init(currentTimeMillis, getScreenOnTimeLocked());
|
||||||
mUserState.put(userId, service);
|
mUserState.put(userId, service);
|
||||||
}
|
}
|
||||||
return service;
|
return service;
|
||||||
@@ -539,25 +549,18 @@ public class UsageStatsService extends SystemService implements
|
|||||||
final long actualSystemTime = System.currentTimeMillis();
|
final long actualSystemTime = System.currentTimeMillis();
|
||||||
final long actualRealtime = SystemClock.elapsedRealtime();
|
final long actualRealtime = SystemClock.elapsedRealtime();
|
||||||
final long expectedSystemTime = (actualRealtime - mRealTimeSnapshot) + mSystemTimeSnapshot;
|
final long expectedSystemTime = (actualRealtime - mRealTimeSnapshot) + mSystemTimeSnapshot;
|
||||||
boolean resetBeginIdleTime = false;
|
final long diffSystemTime = actualSystemTime - expectedSystemTime;
|
||||||
if (Math.abs(actualSystemTime - expectedSystemTime) > TIME_CHANGE_THRESHOLD_MILLIS) {
|
if (Math.abs(diffSystemTime) > TIME_CHANGE_THRESHOLD_MILLIS) {
|
||||||
// The time has changed.
|
// The time has changed.
|
||||||
|
Slog.i(TAG, "Time changed in UsageStats by " + (diffSystemTime / 1000) + " seconds");
|
||||||
// Check if it's severe enough a change to reset screenOnTime
|
|
||||||
if (Math.abs(actualSystemTime - expectedSystemTime) > mAppIdleDurationMillis) {
|
|
||||||
mScreenOnSystemTimeSnapshot = actualSystemTime;
|
|
||||||
mScreenOnTime = 0;
|
|
||||||
resetBeginIdleTime = true;
|
|
||||||
}
|
|
||||||
final int userCount = mUserState.size();
|
final int userCount = mUserState.size();
|
||||||
for (int i = 0; i < userCount; i++) {
|
for (int i = 0; i < userCount; i++) {
|
||||||
final UserUsageStatsService service = mUserState.valueAt(i);
|
final UserUsageStatsService service = mUserState.valueAt(i);
|
||||||
service.onTimeChanged(expectedSystemTime, actualSystemTime, mScreenOnTime,
|
service.onTimeChanged(expectedSystemTime, actualSystemTime, getScreenOnTimeLocked(),
|
||||||
resetBeginIdleTime);
|
false);
|
||||||
}
|
}
|
||||||
mRealTimeSnapshot = actualRealtime;
|
mRealTimeSnapshot = actualRealtime;
|
||||||
mSystemTimeSnapshot = actualSystemTime;
|
mSystemTimeSnapshot = actualSystemTime;
|
||||||
postCheckIdleStates(UserHandle.USER_ALL);
|
|
||||||
}
|
}
|
||||||
return actualSystemTime;
|
return actualSystemTime;
|
||||||
}
|
}
|
||||||
@@ -586,7 +589,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
void reportEvent(UsageEvents.Event event, int userId) {
|
void reportEvent(UsageEvents.Event event, int userId) {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
final long timeNow = checkAndGetTimeLocked();
|
final long timeNow = checkAndGetTimeLocked();
|
||||||
final long screenOnTime = getScreenOnTimeLocked(timeNow);
|
final long screenOnTime = getScreenOnTimeLocked();
|
||||||
convertToSystemTimeLocked(event);
|
convertToSystemTimeLocked(event);
|
||||||
|
|
||||||
final UserUsageStatsService service =
|
final UserUsageStatsService service =
|
||||||
@@ -602,7 +605,6 @@ public class UsageStatsService extends SystemService implements
|
|||||||
|| event.mEventType == Event.SYSTEM_INTERACTION
|
|| event.mEventType == Event.SYSTEM_INTERACTION
|
||||||
|| event.mEventType == Event.USER_INTERACTION)) {
|
|| event.mEventType == Event.USER_INTERACTION)) {
|
||||||
if (previouslyIdle) {
|
if (previouslyIdle) {
|
||||||
//Slog.d(TAG, "Informing listeners of out-of-idle " + event.mPackage);
|
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
|
mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
|
||||||
/* idle = */ 0, event.mPackage));
|
/* idle = */ 0, event.mPackage));
|
||||||
notifyBatteryStats(event.mPackage, userId, false);
|
notifyBatteryStats(event.mPackage, userId, false);
|
||||||
@@ -643,7 +645,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
void forceIdleState(String packageName, int userId, boolean idle) {
|
void forceIdleState(String packageName, int userId, boolean idle) {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
final long timeNow = checkAndGetTimeLocked();
|
final long timeNow = checkAndGetTimeLocked();
|
||||||
final long screenOnTime = getScreenOnTimeLocked(timeNow);
|
final long screenOnTime = getScreenOnTimeLocked();
|
||||||
final long deviceUsageTime = screenOnTime - (idle ? mAppIdleDurationMillis : 0) - 5000;
|
final long deviceUsageTime = screenOnTime - (idle ? mAppIdleDurationMillis : 0) - 5000;
|
||||||
|
|
||||||
final UserUsageStatsService service =
|
final UserUsageStatsService service =
|
||||||
@@ -657,7 +659,6 @@ public class UsageStatsService extends SystemService implements
|
|||||||
timeNow - (idle ? mAppIdleWallclockThresholdMillis : 0) - 5000);
|
timeNow - (idle ? mAppIdleWallclockThresholdMillis : 0) - 5000);
|
||||||
// Inform listeners if necessary
|
// Inform listeners if necessary
|
||||||
if (previouslyIdle != idle) {
|
if (previouslyIdle != idle) {
|
||||||
// Slog.d(TAG, "Informing listeners of out-of-idle " + packageName);
|
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
|
mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, userId,
|
||||||
/* idle = */ idle ? 1 : 0, packageName));
|
/* idle = */ idle ? 1 : 0, packageName));
|
||||||
if (!idle) {
|
if (!idle) {
|
||||||
@@ -796,7 +797,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
timeNow = checkAndGetTimeLocked();
|
timeNow = checkAndGetTimeLocked();
|
||||||
}
|
}
|
||||||
userService = getUserDataAndInitializeIfNeededLocked(userId, timeNow);
|
userService = getUserDataAndInitializeIfNeededLocked(userId, timeNow);
|
||||||
screenOnTime = getScreenOnTimeLocked(timeNow);
|
screenOnTime = getScreenOnTimeLocked();
|
||||||
}
|
}
|
||||||
return isAppIdleFiltered(packageName, UserHandle.getAppId(uidForAppId), userId,
|
return isAppIdleFiltered(packageName, UserHandle.getAppId(uidForAppId), userId,
|
||||||
userService, timeNow, screenOnTime);
|
userService, timeNow, screenOnTime);
|
||||||
@@ -865,7 +866,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
timeNow = checkAndGetTimeLocked();
|
timeNow = checkAndGetTimeLocked();
|
||||||
userService = getUserDataAndInitializeIfNeededLocked(userId, timeNow);
|
userService = getUserDataAndInitializeIfNeededLocked(userId, timeNow);
|
||||||
screenOnTime = getScreenOnTimeLocked(timeNow);
|
screenOnTime = getScreenOnTimeLocked();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<ApplicationInfo> apps;
|
List<ApplicationInfo> apps;
|
||||||
@@ -987,7 +988,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
*/
|
*/
|
||||||
void dump(String[] args, PrintWriter pw) {
|
void dump(String[] args, PrintWriter pw) {
|
||||||
synchronized (mLock) {
|
synchronized (mLock) {
|
||||||
final long screenOnTime = getScreenOnTimeLocked(checkAndGetTimeLocked());
|
final long screenOnTime = getScreenOnTimeLocked();
|
||||||
IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
|
IndentingPrintWriter idpw = new IndentingPrintWriter(pw, " ");
|
||||||
ArraySet<String> argSet = new ArraySet<>();
|
ArraySet<String> argSet = new ArraySet<>();
|
||||||
argSet.addAll(Arrays.asList(args));
|
argSet.addAll(Arrays.asList(args));
|
||||||
@@ -1008,7 +1009,11 @@ public class UsageStatsService extends SystemService implements
|
|||||||
}
|
}
|
||||||
idpw.decreaseIndent();
|
idpw.decreaseIndent();
|
||||||
}
|
}
|
||||||
pw.println("Screen On Timebase:" + mScreenOnTime);
|
pw.print("Screen On Timebase: ");
|
||||||
|
pw.print(screenOnTime);
|
||||||
|
pw.print(" (");
|
||||||
|
TimeUtils.formatDuration(screenOnTime, pw);
|
||||||
|
pw.println(")");
|
||||||
|
|
||||||
pw.println();
|
pw.println();
|
||||||
pw.println("Settings:");
|
pw.println("Settings:");
|
||||||
@@ -1042,8 +1047,8 @@ public class UsageStatsService extends SystemService implements
|
|||||||
pw.println();
|
pw.println();
|
||||||
pw.print("mScreenOnTime="); TimeUtils.formatDuration(mScreenOnTime, pw);
|
pw.print("mScreenOnTime="); TimeUtils.formatDuration(mScreenOnTime, pw);
|
||||||
pw.println();
|
pw.println();
|
||||||
pw.print("mScreenOnSystemTimeSnapshot=");
|
pw.print("mLastScreenOnEventRealtime=");
|
||||||
TimeUtils.formatDuration(mScreenOnSystemTimeSnapshot, pw);
|
TimeUtils.formatDuration(mLastScreenOnEventRealtime, pw);
|
||||||
pw.println();
|
pw.println();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1078,6 +1083,14 @@ public class UsageStatsService extends SystemService implements
|
|||||||
|
|
||||||
case MSG_CHECK_IDLE_STATES:
|
case MSG_CHECK_IDLE_STATES:
|
||||||
checkIdleStates(msg.arg1);
|
checkIdleStates(msg.arg1);
|
||||||
|
mHandler.sendMessageDelayed(mHandler.obtainMessage(
|
||||||
|
MSG_CHECK_IDLE_STATES, msg.arg1, 0),
|
||||||
|
mCheckIdleIntervalMillis);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case MSG_ONE_TIME_CHECK_IDLE_STATES:
|
||||||
|
mHandler.removeMessages(MSG_ONE_TIME_CHECK_IDLE_STATES);
|
||||||
|
checkIdleStates(UserHandle.USER_ALL);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MSG_CHECK_PAROLE_TIMEOUT:
|
case MSG_CHECK_PAROLE_TIMEOUT:
|
||||||
@@ -1138,7 +1151,7 @@ public class UsageStatsService extends SystemService implements
|
|||||||
@Override
|
@Override
|
||||||
public void onChange(boolean selfChange) {
|
public void onChange(boolean selfChange) {
|
||||||
updateSettings();
|
updateSettings();
|
||||||
postCheckIdleStates(UserHandle.USER_ALL);
|
postOneTimeCheckIdleStates();
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateSettings() {
|
void updateSettings() {
|
||||||
|
|||||||
@@ -68,6 +68,7 @@ class UserUsageStatsService {
|
|||||||
|
|
||||||
interface StatsUpdatedListener {
|
interface StatsUpdatedListener {
|
||||||
void onStatsUpdated();
|
void onStatsUpdated();
|
||||||
|
void onStatsReloaded();
|
||||||
long getAppIdleRollingWindowDurationMillis();
|
long getAppIdleRollingWindowDurationMillis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -545,6 +546,9 @@ class UserUsageStatsService {
|
|||||||
Slog.i(TAG, mLogPrefix + "Rollover scheduled @ " +
|
Slog.i(TAG, mLogPrefix + "Rollover scheduled @ " +
|
||||||
sDateFormat.format(mDailyExpiryDate.getTimeInMillis()) + "(" +
|
sDateFormat.format(mDailyExpiryDate.getTimeInMillis()) + "(" +
|
||||||
tempCal.getTimeInMillis() + ")");
|
tempCal.getTimeInMillis() + ")");
|
||||||
|
|
||||||
|
// Tell the listener that the stats reloaded, which may have changed idle states.
|
||||||
|
mListener.onStatsReloaded();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void mergePackageStats(IntervalStats dst, IntervalStats src,
|
private static void mergePackageStats(IntervalStats dst, IntervalStats src,
|
||||||
|
|||||||
Reference in New Issue
Block a user