Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d1a06552 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move AppStandbyController synchronous event reporting logic"

parents dbf99edc 081ce5df
Loading
Loading
Loading
Loading
+87 −87
Original line number Diff line number Diff line
@@ -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,13 +498,21 @@ 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
@@ -741,14 +739,7 @@ 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
@@ -757,12 +748,23 @@ public class AppStandbyController implements AppStandbyInternal {
                || 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 nextCheckTime;
        final long nextCheckDelay;
        final int subReason = usageEventToSubReason(eventType);
        final int reason = REASON_MAIN_USAGE | subReason;
        if (eventType == UsageEvents.Event.NOTIFICATION_SEEN
@@ -771,29 +773,29 @@ public class AppStandbyController implements AppStandbyInternal {
            mAppIdleHistory.reportUsage(appHistory, pkg,
                    STANDBY_BUCKET_WORKING_SET, subReason,
                    0, elapsedRealtime + mNotificationSeenTimeoutMillis);
                    nextCheckTime = mNotificationSeenTimeoutMillis;
            nextCheckDelay = mNotificationSeenTimeoutMillis;
        } else if (eventType == UsageEvents.Event.SYSTEM_INTERACTION) {
            mAppIdleHistory.reportUsage(appHistory, pkg,
                    STANDBY_BUCKET_ACTIVE, subReason,
                    0, elapsedRealtime + mSystemInteractionTimeoutMillis);
                    nextCheckTime = 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);
                    nextCheckTime = mInitialForegroundServiceStartTimeoutMillis;
            nextCheckDelay = mInitialForegroundServiceStartTimeoutMillis;
        } else {
            mAppIdleHistory.reportUsage(appHistory, pkg,
                    STANDBY_BUCKET_ACTIVE, subReason,
                    elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
                    nextCheckTime = mStrongUsageTimeoutMillis;
            nextCheckDelay = mStrongUsageTimeoutMillis;
        }
        if (appHistory.currentBucket != prevBucket) {
            mHandler.sendMessageDelayed(
                    mHandler.obtainMessage(MSG_CHECK_PACKAGE_IDLE_STATE, userId, -1, pkg),
                            nextCheckTime);
                    nextCheckDelay);
            final boolean userStartedInteracting =
                    appHistory.currentBucket == STANDBY_BUCKET_ACTIVE
                            && (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
@@ -805,8 +807,6 @@ public class AppStandbyController implements AppStandbyInternal {
            notifyBatteryStats(pkg, userId, false);
        }
    }
        }
    }

    private int usageEventToSubReason(int eventType) {
        switch (eventType) {