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

Commit f7784064 authored by Christopher Tate's avatar Christopher Tate
Browse files

Don't send idle-maint trigger broadcast as ordered

Using an ordered broadcast has been inadvertently making the idle
trigger wait in line behind all other pending broadcasts.  Don't do
that -- it's going to registered receivers only anyway.

We now see no measurable dispatch latency for the trigger broadcast
even if it's issued while the BOOT_COMPLETED broadcast is still
being processed.

Bug: 77230503
Test: adb shell cmd activity idle-maintenance
Test: manually set idle threshold to 10s and observe triggering
Change-Id: I75a9f9acf0debfd075750d87c65cda545af48299
parent 362b3522
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -14814,7 +14814,7 @@ public class ActivityManagerService extends IActivityManager.Stub
                    .setPackage("android")
                    .addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
            broadcastIntent(null, intent, null, null, 0, null, null, null,
                    OP_NONE, null, true, false, UserHandle.USER_ALL);
                    OP_NONE, null, false, false, UserHandle.USER_ALL);
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
+27 −23
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.server.job.controllers;
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -101,18 +100,19 @@ public final class IdleController extends StateController {

    final class IdlenessTracker extends BroadcastReceiver {
        private AlarmManager mAlarm;
        private PendingIntent mIdleTriggerIntent;
        boolean mIdle;
        boolean mScreenOn;

        // After construction, mutations of idle/screen-on state will only happen
        // on the main looper thread, either in onReceive() or in an alarm callback.
        private boolean mIdle;
        private boolean mScreenOn;

        private AlarmManager.OnAlarmListener mIdleAlarmListener = () -> {
            handleIdleTrigger();
        };

        public IdlenessTracker() {
            mAlarm = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);

            Intent intent = new Intent(ActivityManagerService.ACTION_TRIGGER_IDLE)
                    .setPackage("android")
                    .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
            mIdleTriggerIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0);

            // At boot we presume that the user has just "interacted" with the
            // device in some meaningful way.
            mIdle = false;
@@ -150,7 +150,7 @@ public final class IdleController extends StateController {
                }
                mScreenOn = true;
                //cancel the alarm
                mAlarm.cancel(mIdleTriggerIntent);
                mAlarm.cancel(mIdleAlarmListener);
                if (mIdle) {
                // possible transition to not-idle
                    mIdle = false;
@@ -169,8 +169,13 @@ public final class IdleController extends StateController {
                }
                mScreenOn = false;
                mAlarm.setWindow(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        when, mIdleWindowSlop, mIdleTriggerIntent);
                        when, mIdleWindowSlop, "JS idleness", mIdleAlarmListener, null);
            } else if (action.equals(ActivityManagerService.ACTION_TRIGGER_IDLE)) {
                handleIdleTrigger();
            }
        }

        private void handleIdleTrigger() {
            // idle time starts now. Do not set mIdle if screen is on.
            if (!mIdle && !mScreenOn) {
                if (DEBUG) {
@@ -186,7 +191,6 @@ public final class IdleController extends StateController {
            }
        }
    }
    }

    @Override
    public void dumpControllerStateLocked(IndentingPrintWriter pw,