Merge "Move AppStandbyController synchronous event reporting logic"
This commit is contained in:
committed by
Android (Google) Code Review
commit
d1a06552f7
@@ -438,12 +438,9 @@ public class AppStandbyController implements AppStandbyInternal {
|
||||
}
|
||||
if (!packageName.equals(providerPkgName)) {
|
||||
synchronized (mAppIdleLock) {
|
||||
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
|
||||
STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER,
|
||||
0,
|
||||
elapsedRealtime + mSyncAdapterTimeoutMillis);
|
||||
maybeInformListeners(packageName, userId, elapsedRealtime,
|
||||
appUsage.currentBucket, appUsage.bucketingReason, false);
|
||||
reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_ACTIVE,
|
||||
REASON_SUB_USAGE_SYNC_ADAPTER, elapsedRealtime,
|
||||
mSyncAdapterTimeoutMillis);
|
||||
}
|
||||
}
|
||||
} catch (PackageManager.NameNotFoundException e) {
|
||||
@@ -474,12 +471,8 @@ public class AppStandbyController implements AppStandbyInternal {
|
||||
final long elapsedRealtime = mInjector.elapsedRealtime();
|
||||
|
||||
synchronized (mAppIdleLock) {
|
||||
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
|
||||
bucketToPromote, usageReason,
|
||||
0,
|
||||
elapsedRealtime + durationMillis);
|
||||
maybeInformListeners(packageName, userId, elapsedRealtime,
|
||||
appUsage.currentBucket, appUsage.bucketingReason, false);
|
||||
reportNoninteractiveUsageLocked(packageName, userId, bucketToPromote,
|
||||
usageReason, elapsedRealtime, durationMillis);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -492,12 +485,9 @@ public class AppStandbyController implements AppStandbyInternal {
|
||||
mAppIdleHistory.getAppStandbyBucket(packageName, userId, elapsedRealtime);
|
||||
if (currentBucket == STANDBY_BUCKET_NEVER) {
|
||||
// Bring the app out of the never bucket
|
||||
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
|
||||
STANDBY_BUCKET_WORKING_SET, REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED,
|
||||
0,
|
||||
elapsedRealtime + mUnexemptedSyncScheduledTimeoutMillis);
|
||||
maybeInformListeners(packageName, userId, elapsedRealtime,
|
||||
appUsage.currentBucket, appUsage.bucketingReason, false);
|
||||
reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_WORKING_SET,
|
||||
REASON_SUB_USAGE_UNEXEMPTED_SYNC_SCHEDULED, elapsedRealtime,
|
||||
mUnexemptedSyncScheduledTimeoutMillis);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -508,15 +498,23 @@ public class AppStandbyController implements AppStandbyInternal {
|
||||
final long elapsedRealtime = mInjector.elapsedRealtime();
|
||||
|
||||
synchronized (mAppIdleLock) {
|
||||
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
|
||||
STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_EXEMPTED_SYNC_START,
|
||||
0,
|
||||
elapsedRealtime + mExemptedSyncStartTimeoutMillis);
|
||||
maybeInformListeners(packageName, userId, elapsedRealtime,
|
||||
appUsage.currentBucket, appUsage.bucketingReason, false);
|
||||
reportNoninteractiveUsageLocked(packageName, userId, STANDBY_BUCKET_ACTIVE,
|
||||
REASON_SUB_USAGE_EXEMPTED_SYNC_START, elapsedRealtime,
|
||||
mExemptedSyncStartTimeoutMillis);
|
||||
}
|
||||
}
|
||||
|
||||
private void reportNoninteractiveUsageLocked(String packageName, int userId, int bucket,
|
||||
int subReason, long elapsedRealtime, long nextCheckDelay) {
|
||||
final AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId, bucket,
|
||||
subReason, 0, elapsedRealtime + nextCheckDelay);
|
||||
mHandler.sendMessageDelayed(
|
||||
mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, packageName),
|
||||
nextCheckDelay);
|
||||
maybeInformListeners(packageName, userId, elapsedRealtime, appUsage.currentBucket,
|
||||
appUsage.bucketingReason, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void postCheckIdleStates(int userId) {
|
||||
mHandler.sendMessage(mHandler.obtainMessage(MSG_CHECK_IDLE_STATES, userId, 0));
|
||||
@@ -741,73 +739,75 @@ public class AppStandbyController implements AppStandbyInternal {
|
||||
@Override
|
||||
public void reportEvent(UsageEvents.Event event, long elapsedRealtime, int userId) {
|
||||
if (!mAppIdleEnabled) return;
|
||||
synchronized (mAppIdleLock) {
|
||||
final String pkg = event.getPackageName();
|
||||
final int eventType = event.getEventType();
|
||||
// TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
|
||||
// about apps that are on some kind of whitelist anyway.
|
||||
final boolean previouslyIdle = mAppIdleHistory.isIdle(
|
||||
pkg, userId, elapsedRealtime);
|
||||
// Inform listeners if necessary
|
||||
if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED
|
||||
|| eventType == UsageEvents.Event.ACTIVITY_PAUSED
|
||||
|| eventType == UsageEvents.Event.SYSTEM_INTERACTION
|
||||
|| eventType == UsageEvents.Event.USER_INTERACTION
|
||||
|| eventType == UsageEvents.Event.NOTIFICATION_SEEN
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED_PRIV
|
||||
|| eventType == UsageEvents.Event.FOREGROUND_SERVICE_START)) {
|
||||
|
||||
final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
|
||||
pkg, userId, elapsedRealtime);
|
||||
final int prevBucket = appHistory.currentBucket;
|
||||
final int prevBucketReason = appHistory.bucketingReason;
|
||||
final long nextCheckTime;
|
||||
final int subReason = usageEventToSubReason(eventType);
|
||||
final int reason = REASON_MAIN_USAGE | subReason;
|
||||
if (eventType == UsageEvents.Event.NOTIFICATION_SEEN
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED) {
|
||||
// Mild usage elevates to WORKING_SET but doesn't change usage time.
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_WORKING_SET, subReason,
|
||||
0, elapsedRealtime + mNotificationSeenTimeoutMillis);
|
||||
nextCheckTime = mNotificationSeenTimeoutMillis;
|
||||
} else if (eventType == UsageEvents.Event.SYSTEM_INTERACTION) {
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
0, elapsedRealtime + mSystemInteractionTimeoutMillis);
|
||||
nextCheckTime = mSystemInteractionTimeoutMillis;
|
||||
} else if (eventType == UsageEvents.Event.FOREGROUND_SERVICE_START) {
|
||||
// Only elevate bucket if this is the first usage of the app
|
||||
if (prevBucket != STANDBY_BUCKET_NEVER) return;
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
0, elapsedRealtime + mInitialForegroundServiceStartTimeoutMillis);
|
||||
nextCheckTime = mInitialForegroundServiceStartTimeoutMillis;
|
||||
} else {
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
|
||||
nextCheckTime = mStrongUsageTimeoutMillis;
|
||||
}
|
||||
if (appHistory.currentBucket != prevBucket) {
|
||||
mHandler.sendMessageDelayed(
|
||||
mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, pkg),
|
||||
nextCheckTime);
|
||||
final boolean userStartedInteracting =
|
||||
appHistory.currentBucket == STANDBY_BUCKET_ACTIVE
|
||||
&& (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
|
||||
maybeInformListeners(pkg, userId, elapsedRealtime,
|
||||
appHistory.currentBucket, reason, userStartedInteracting);
|
||||
}
|
||||
|
||||
if (previouslyIdle) {
|
||||
notifyBatteryStats(pkg, userId, false);
|
||||
}
|
||||
final int eventType = event.getEventType();
|
||||
if ((eventType == UsageEvents.Event.ACTIVITY_RESUMED
|
||||
|| eventType == UsageEvents.Event.ACTIVITY_PAUSED
|
||||
|| eventType == UsageEvents.Event.SYSTEM_INTERACTION
|
||||
|| eventType == UsageEvents.Event.USER_INTERACTION
|
||||
|| eventType == UsageEvents.Event.NOTIFICATION_SEEN
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED_PRIV
|
||||
|| eventType == UsageEvents.Event.FOREGROUND_SERVICE_START)) {
|
||||
synchronized (mAppIdleLock) {
|
||||
reportEventLocked(event.getPackageName(), eventType, elapsedRealtime, userId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void reportEventLocked(String pkg, int eventType, long elapsedRealtime, int userId) {
|
||||
// TODO: Ideally this should call isAppIdleFiltered() to avoid calling back
|
||||
// about apps that are on some kind of whitelist anyway.
|
||||
final boolean previouslyIdle = mAppIdleHistory.isIdle(
|
||||
pkg, userId, elapsedRealtime);
|
||||
|
||||
final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
|
||||
pkg, userId, elapsedRealtime);
|
||||
final int prevBucket = appHistory.currentBucket;
|
||||
final int prevBucketReason = appHistory.bucketingReason;
|
||||
final long nextCheckDelay;
|
||||
final int subReason = usageEventToSubReason(eventType);
|
||||
final int reason = REASON_MAIN_USAGE | subReason;
|
||||
if (eventType == UsageEvents.Event.NOTIFICATION_SEEN
|
||||
|| eventType == UsageEvents.Event.SLICE_PINNED) {
|
||||
// Mild usage elevates to WORKING_SET but doesn't change usage time.
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_WORKING_SET, subReason,
|
||||
0, elapsedRealtime + mNotificationSeenTimeoutMillis);
|
||||
nextCheckDelay = mNotificationSeenTimeoutMillis;
|
||||
} else if (eventType == UsageEvents.Event.SYSTEM_INTERACTION) {
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
0, elapsedRealtime + mSystemInteractionTimeoutMillis);
|
||||
nextCheckDelay = mSystemInteractionTimeoutMillis;
|
||||
} else if (eventType == UsageEvents.Event.FOREGROUND_SERVICE_START) {
|
||||
// Only elevate bucket if this is the first usage of the app
|
||||
if (prevBucket != STANDBY_BUCKET_NEVER) return;
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
0, elapsedRealtime + mInitialForegroundServiceStartTimeoutMillis);
|
||||
nextCheckDelay = mInitialForegroundServiceStartTimeoutMillis;
|
||||
} else {
|
||||
mAppIdleHistory.reportUsage(appHistory, pkg,
|
||||
STANDBY_BUCKET_ACTIVE, subReason,
|
||||
elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
|
||||
nextCheckDelay = mStrongUsageTimeoutMillis;
|
||||
}
|
||||
if (appHistory.currentBucket != prevBucket) {
|
||||
mHandler.sendMessageDelayed(
|
||||
mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, pkg),
|
||||
nextCheckDelay);
|
||||
final boolean userStartedInteracting =
|
||||
appHistory.currentBucket == STANDBY_BUCKET_ACTIVE
|
||||
&& (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
|
||||
maybeInformListeners(pkg, userId, elapsedRealtime,
|
||||
appHistory.currentBucket, reason, userStartedInteracting);
|
||||
}
|
||||
|
||||
if (previouslyIdle) {
|
||||
notifyBatteryStats(pkg, userId, false);
|
||||
}
|
||||
}
|
||||
|
||||
private int usageEventToSubReason(int eventType) {
|
||||
switch (eventType) {
|
||||
case UsageEvents.Event.ACTIVITY_RESUMED: return REASON_SUB_USAGE_MOVE_TO_FOREGROUND;
|
||||
|
||||
Reference in New Issue
Block a user