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

Commit 081ce5df authored by Michael Wachenschwanz's avatar Michael Wachenschwanz
Browse files

Move AppStandbyController synchronous event reporting logic

Bug: 140808123
Test: atest com.android.server.usage.AppStandbyControllerTests
Change-Id: If8b79ff7703ebc598ddfbdb636c05de35b06d6e9
parent e38348d6
Loading
Loading
Loading
Loading
+87 −87
Original line number Diff line number Diff line
@@ -396,12 +396,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) {
@@ -432,12 +429,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);
        }
    }

@@ -450,12 +443,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);
            }
        }
    }
@@ -466,13 +456,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
@@ -699,14 +697,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
@@ -715,12 +706,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
@@ -729,29 +731,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;
@@ -763,8 +765,6 @@ public class AppStandbyController implements AppStandbyInternal {
            notifyBatteryStats(pkg, userId, false);
        }
    }
        }
    }

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