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

Commit 449fc406 authored by Yasin Kilicdere's avatar Yasin Kilicdere
Browse files

Set power mode to MODE_FIXED_PERFORMANCE during a user switch.

This reduces average duration of UserController.startUser-fg part
of the user switch by 32% from 269.39ms to 184.65ms.

Bug: 311070231
Bug: 325249845
Test: Run user switch 100 times in a row with flag on and off
Flag: ACONFIG android.multiuser.set_power_mode_during_user_switch DEVELOPMENT
Change-Id: I91c68cbe7dfabdd9dc1d63a9d763040474b02177
parent 12072146
Loading
Loading
Loading
Loading
+22 −1
Original line number Diff line number Diff line
@@ -97,6 +97,7 @@ import android.os.IProgressListener;
import android.os.IRemoteCallback;
import android.os.IUserManager;
import android.os.Message;
import android.os.PowerManagerInternal;
import android.os.PowerWhitelistManager;
import android.os.Process;
import android.os.RemoteCallbackList;
@@ -1934,9 +1935,12 @@ class UserController implements Handler.Callback {
    }

    /**
     * Start user, if its not already running, and bring it to foreground.
     * Start user, if it's not already running, and bring it to foreground.
     */
    void startUserInForeground(@UserIdInt int targetUserId) {
        if (android.multiuser.Flags.setPowerModeDuringUserSwitch()) {
            mInjector.setPerformancePowerMode(true);
        }
        boolean success = startUser(targetUserId, USER_START_MODE_FOREGROUND);
        if (!success) {
            mInjector.getWindowManager().setSwitchingUser(false);
@@ -2146,6 +2150,9 @@ class UserController implements Handler.Callback {
    }

    private void endUserSwitch() {
        if (android.multiuser.Flags.setPowerModeDuringUserSwitch()) {
            mInjector.setPerformancePowerMode(false);
        }
        final int nextUserId;
        synchronized (mLock) {
            nextUserId = ObjectUtils.getOrElse(mPendingTargetUserIds.poll(), UserHandle.USER_NULL);
@@ -3535,6 +3542,7 @@ class UserController implements Handler.Callback {
        private final ActivityManagerService mService;
        private UserManagerService mUserManager;
        private UserManagerInternal mUserManagerInternal;
        private PowerManagerInternal mPowerManagerInternal;
        private Handler mHandler;
        private final Object mUserSwitchingDialogLock = new Object();
        @GuardedBy("mUserSwitchingDialogLock")
@@ -3636,6 +3644,13 @@ class UserController implements Handler.Callback {
            return mUserManagerInternal;
        }

        PowerManagerInternal getPowerManagerInternal() {
            if (mPowerManagerInternal == null) {
                mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
            }
            return mPowerManagerInternal;
        }

        KeyguardManager getKeyguardManager() {
            return mService.mContext.getSystemService(KeyguardManager.class);
        }
@@ -3829,6 +3844,12 @@ class UserController implements Handler.Callback {
            getSystemServiceManager().onUserStarting(TimingsTraceAndSlog.newAsyncLog(), userId);
        }

        void setPerformancePowerMode(boolean enabled) {
            Slogf.i(TAG, "Setting power mode MODE_FIXED_PERFORMANCE to " + enabled);
            getPowerManagerInternal().setPowerMode(
                    PowerManagerInternal.MODE_FIXED_PERFORMANCE, enabled);
        }

        void onSystemUserVisibilityChanged(boolean visible) {
            getUserManagerInternal().onSystemUserVisibilityChanged(visible);
        }