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

Commit 5a5a798d authored by Makoto Onuki's avatar Makoto Onuki Committed by Android (Google) Code Review
Browse files

Merge "Don't take a lock on the UI thread"

parents 588aac35 4d298b5d
Loading
Loading
Loading
Loading
+15 −8
Original line number Original line Diff line number Diff line
@@ -3528,10 +3528,15 @@ class AlarmManagerService extends SystemService {
        public static final int REPORT_ALARMS_ACTIVE = 4;
        public static final int REPORT_ALARMS_ACTIVE = 4;
        public static final int APP_STANDBY_BUCKET_CHANGED = 5;
        public static final int APP_STANDBY_BUCKET_CHANGED = 5;
        public static final int APP_STANDBY_PAROLE_CHANGED = 6;
        public static final int APP_STANDBY_PAROLE_CHANGED = 6;
        public static final int REMOVE_FOR_STOPPED = 7;


        public AlarmHandler() {
        public AlarmHandler() {
        }
        }


        public void postRemoveForStopped(int uid) {
            obtainMessage(REMOVE_FOR_STOPPED, uid, 0).sendToTarget();
        }

        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            switch (msg.what) {
                case ALARM_EVENT: {
                case ALARM_EVENT: {
@@ -3594,6 +3599,12 @@ class AlarmManagerService extends SystemService {
                    }
                    }
                    break;
                    break;


                case REMOVE_FOR_STOPPED:
                    synchronized (mLock) {
                        removeForStoppedLocked(msg.arg1);
                    }
                    break;

                default:
                default:
                    // nope, just ignore it
                    // nope, just ignore it
                    break;
                    break;
@@ -3783,10 +3794,8 @@ class AlarmManagerService extends SystemService {
        }
        }


        @Override public void onUidGone(int uid, boolean disabled) {
        @Override public void onUidGone(int uid, boolean disabled) {
            synchronized (mLock) {
            if (disabled) {
            if (disabled) {
                    removeForStoppedLocked(uid);
                mHandler.postRemoveForStopped(uid);
                }
            }
            }
        }
        }


@@ -3794,10 +3803,8 @@ class AlarmManagerService extends SystemService {
        }
        }


        @Override public void onUidIdle(int uid, boolean disabled) {
        @Override public void onUidIdle(int uid, boolean disabled) {
            synchronized (mLock) {
            if (disabled) {
            if (disabled) {
                    removeForStoppedLocked(uid);
                mHandler.postRemoveForStopped(uid);
                }
            }
            }
        }
        }


+82 −32
Original line number Original line Diff line number Diff line
@@ -614,48 +614,22 @@ public class ForceAppStandbyTracker {
    private final class UidObserver extends IUidObserver.Stub {
    private final class UidObserver extends IUidObserver.Stub {
        @Override
        @Override
        public void onUidStateChanged(int uid, int procState, long procStateSeq) {
        public void onUidStateChanged(int uid, int procState, long procStateSeq) {
            synchronized (mLock) {
            mHandler.onUidStateChanged(uid, procState);
                if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
                    if (removeUidFromArray(mForegroundUids, uid, false)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                } else {
                    if (addUidToArray(mForegroundUids, uid)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                }
            }
        }
        }


        @Override
        @Override
        public void onUidGone(int uid, boolean disabled) {
        public void onUidActive(int uid) {
            removeUid(uid, true);
            mHandler.onUidActive(uid);
        }
        }


        @Override
        @Override
        public void onUidActive(int uid) {
        public void onUidGone(int uid, boolean disabled) {
            synchronized (mLock) {
            mHandler.onUidGone(uid, disabled);
                if (addUidToArray(mActiveUids, uid)) {
                    mHandler.notifyUidActiveStateChanged(uid);
                }
            }
        }
        }


        @Override
        @Override
        public void onUidIdle(int uid, boolean disabled) {
        public void onUidIdle(int uid, boolean disabled) {
            // Just to avoid excessive memcpy, don't remove from the array in this case.
            mHandler.onUidIdle(uid, disabled);
            removeUid(uid, false);
        }

        private void removeUid(int uid, boolean remove) {
            synchronized (mLock) {
                if (removeUidFromArray(mActiveUids, uid, remove)) {
                    mHandler.notifyUidActiveStateChanged(uid);
                }
                if (removeUidFromArray(mForegroundUids, uid, remove)) {
                    mHandler.notifyUidForegroundStateChanged(uid);
                }
            }
        }
        }


        @Override
        @Override
@@ -740,6 +714,11 @@ public class ForceAppStandbyTracker {
        private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 9;
        private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 9;
        private static final int MSG_EXEMPT_CHANGED = 10;
        private static final int MSG_EXEMPT_CHANGED = 10;


        private static final int MSG_ON_UID_STATE_CHANGED = 11;
        private static final int MSG_ON_UID_ACTIVE = 12;
        private static final int MSG_ON_UID_GONE = 13;
        private static final int MSG_ON_UID_IDLE = 14;

        public MyHandler(Looper looper) {
        public MyHandler(Looper looper) {
            super(looper);
            super(looper);
        }
        }
@@ -790,6 +769,22 @@ public class ForceAppStandbyTracker {
            obtainMessage(MSG_USER_REMOVED, userId, 0).sendToTarget();
            obtainMessage(MSG_USER_REMOVED, userId, 0).sendToTarget();
        }
        }


        public void onUidStateChanged(int uid, int procState) {
            obtainMessage(MSG_ON_UID_STATE_CHANGED, uid, procState).sendToTarget();
        }

        public void onUidActive(int uid) {
            obtainMessage(MSG_ON_UID_ACTIVE, uid, 0).sendToTarget();
        }

        public void onUidGone(int uid, boolean disabled) {
            obtainMessage(MSG_ON_UID_GONE, uid, disabled ? 1 : 0).sendToTarget();
        }

        public void onUidIdle(int uid, boolean disabled) {
            obtainMessage(MSG_ON_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget();
        }

        @Override
        @Override
        public void handleMessage(Message msg) {
        public void handleMessage(Message msg) {
            switch (msg.what) {
            switch (msg.what) {
@@ -883,6 +878,61 @@ public class ForceAppStandbyTracker {
                case MSG_USER_REMOVED:
                case MSG_USER_REMOVED:
                    handleUserRemoved(msg.arg1);
                    handleUserRemoved(msg.arg1);
                    return;
                    return;

                case MSG_ON_UID_STATE_CHANGED:
                    handleUidStateChanged(msg.arg1, msg.arg2);
                    return;
                case MSG_ON_UID_ACTIVE:
                    handleUidActive(msg.arg1);
                    return;
                case MSG_ON_UID_GONE:
                    handleUidGone(msg.arg1, msg.arg1 != 0);
                    return;
                case MSG_ON_UID_IDLE:
                    handleUidIdle(msg.arg1, msg.arg1 != 0);
                    return;
            }
        }

        public void handleUidStateChanged(int uid, int procState) {
            synchronized (mLock) {
                if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
                    if (removeUidFromArray(mForegroundUids, uid, false)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                } else {
                    if (addUidToArray(mForegroundUids, uid)) {
                        mHandler.notifyUidForegroundStateChanged(uid);
                    }
                }
            }
        }

        public void handleUidActive(int uid) {
            synchronized (mLock) {
                if (addUidToArray(mActiveUids, uid)) {
                    mHandler.notifyUidActiveStateChanged(uid);
                }
            }
        }

        public void handleUidGone(int uid, boolean disabled) {
            removeUid(uid, true);
        }

        public void handleUidIdle(int uid, boolean disabled) {
            // Just to avoid excessive memcpy, don't remove from the array in this case.
            removeUid(uid, false);
        }

        private void removeUid(int uid, boolean remove) {
            synchronized (mLock) {
                if (removeUidFromArray(mActiveUids, uid, remove)) {
                    mHandler.notifyUidActiveStateChanged(uid);
                }
                if (removeUidFromArray(mForegroundUids, uid, remove)) {
                    mHandler.notifyUidForegroundStateChanged(uid);
                }
            }
            }
        }
        }
    }
    }
+13 −0
Original line number Original line Diff line number Diff line
@@ -343,6 +343,7 @@ public class ForceAppStandbyTrackerTest {
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));


        mIUidObserver.onUidActive(UID_1);
        mIUidObserver.onUidActive(UID_1);
        waitUntilMainHandlerDrain();
        areRestricted(instance, UID_1, PACKAGE_1, NONE);
        areRestricted(instance, UID_1, PACKAGE_1, NONE);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -350,6 +351,7 @@ public class ForceAppStandbyTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));


        mIUidObserver.onUidGone(UID_1, /*disable=*/ false);
        mIUidObserver.onUidGone(UID_1, /*disable=*/ false);
        waitUntilMainHandlerDrain();
        areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
        areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -357,11 +359,13 @@ public class ForceAppStandbyTrackerTest {
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));


        mIUidObserver.onUidActive(UID_1);
        mIUidObserver.onUidActive(UID_1);
        waitUntilMainHandlerDrain();
        areRestricted(instance, UID_1, PACKAGE_1, NONE);
        areRestricted(instance, UID_1, PACKAGE_1, NONE);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);


        mIUidObserver.onUidIdle(UID_1, /*disable=*/ false);
        mIUidObserver.onUidIdle(UID_1, /*disable=*/ false);
        waitUntilMainHandlerDrain();
        areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
        areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
        areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -467,6 +471,7 @@ public class ForceAppStandbyTrackerTest {


        mIUidObserver.onUidActive(UID_1);
        mIUidObserver.onUidActive(UID_1);


        waitUntilMainHandlerDrain();
        assertTrue(instance.isUidActive(UID_1));
        assertTrue(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -479,6 +484,7 @@ public class ForceAppStandbyTrackerTest {
        mIUidObserver.onUidStateChanged(UID_2,
        mIUidObserver.onUidStateChanged(UID_2,
                ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0);
                ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0);


        waitUntilMainHandlerDrain();
        assertTrue(instance.isUidActive(UID_1));
        assertTrue(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -491,6 +497,7 @@ public class ForceAppStandbyTrackerTest {
        mIUidObserver.onUidStateChanged(UID_1,
        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
                ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);


        waitUntilMainHandlerDrain();
        assertTrue(instance.isUidActive(UID_1));
        assertTrue(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -501,6 +508,7 @@ public class ForceAppStandbyTrackerTest {


        mIUidObserver.onUidGone(UID_1, true);
        mIUidObserver.onUidGone(UID_1, true);


        waitUntilMainHandlerDrain();
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -511,6 +519,7 @@ public class ForceAppStandbyTrackerTest {


        mIUidObserver.onUidIdle(UID_2, true);
        mIUidObserver.onUidIdle(UID_2, true);


        waitUntilMainHandlerDrain();
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -522,6 +531,7 @@ public class ForceAppStandbyTrackerTest {
        mIUidObserver.onUidStateChanged(UID_1,
        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0);
                ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0);


        waitUntilMainHandlerDrain();
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -533,6 +543,7 @@ public class ForceAppStandbyTrackerTest {
        mIUidObserver.onUidStateChanged(UID_1,
        mIUidObserver.onUidStateChanged(UID_1,
                ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0);
                ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0);


        waitUntilMainHandlerDrain();
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_1));
        assertFalse(instance.isUidActive(UID_2));
        assertFalse(instance.isUidActive(UID_2));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
        assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -1037,6 +1048,8 @@ public class ForceAppStandbyTrackerTest {
        mIUidObserver.onUidActive(UID_1);
        mIUidObserver.onUidActive(UID_1);
        mIUidObserver.onUidActive(UID_10_1);
        mIUidObserver.onUidActive(UID_10_1);


        waitUntilMainHandlerDrain();

        setAppOps(UID_2, PACKAGE_2, true);
        setAppOps(UID_2, PACKAGE_2, true);
        setAppOps(UID_10_2, PACKAGE_2, true);
        setAppOps(UID_10_2, PACKAGE_2, true);