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

Commit b90c4d3b authored by Keun young Park's avatar Keun young Park
Browse files

Decide the current user after PHASE_THIRD_PARTY boot phase

- Current user can change during the boot phase from other system services.
- If the current user has changed, and the system user is not started yet,
  crash the system as the system component starting other user should
  have started system user already.

Bug: 128871357
Test: Reboot and check if user switching happens in right order
Change-Id: I7e98e4a9f9f57612dca3052615689555cc965705
parent 1cfa6f42
Loading
Loading
Loading
Loading
+10 −1
Original line number Original line Diff line number Diff line
@@ -8789,7 +8789,6 @@ public class ActivityManagerService extends IActivityManager.Stub
        mAtmInternal.updateTopComponentForFactoryTest();
        mAtmInternal.updateTopComponentForFactoryTest();
        retrieveSettings();
        retrieveSettings();
        final int currentUserId = mUserController.getCurrentUserId();
        mUgmInternal.onSystemReady();
        mUgmInternal.onSystemReady();
        final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
        final PowerManagerInternal pmi = LocalServices.getService(PowerManagerInternal.class);
@@ -8803,6 +8802,16 @@ public class ActivityManagerService extends IActivityManager.Stub
        }
        }
        if (goingCallback != null) goingCallback.run();
        if (goingCallback != null) goingCallback.run();
        // Check the current user here as a user can be started inside goingCallback.run() from
        // other system services.
        final int currentUserId = mUserController.getCurrentUserId();
        Slog.i(TAG, "Current user:" + currentUserId);
        if (currentUserId != UserHandle.USER_SYSTEM && !mUserController.isSystemUserStarted()) {
            // User other than system user has started. Make sure that system user is already
            // started before switching user.
            throw new RuntimeException("System user not started while current user is:"
                    + currentUserId);
        }
        traceLog.traceBegin("ActivityManagerStartApps");
        traceLog.traceBegin("ActivityManagerStartApps");
        mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
        mBatteryStatsService.noteEvent(BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
                Integer.toString(currentUserId), currentUserId);
                Integer.toString(currentUserId), currentUserId);
+18 −0
Original line number Original line Diff line number Diff line
@@ -1743,6 +1743,24 @@ class UserController implements Handler.Callback {
        return state.state != UserState.STATE_STOPPING && state.state != UserState.STATE_SHUTDOWN;
        return state.state != UserState.STATE_STOPPING && state.state != UserState.STATE_SHUTDOWN;
    }
    }


    /**
     * Check if system user is already started. Unlike other user, system user is in STATE_BOOTING
     * even if it is not explicitly started. So isUserRunning cannot give the right state
     * to check if system user is started or not.
     * @return true if system user is started.
     */
    boolean isSystemUserStarted() {
        synchronized (mLock) {
            UserState uss = mStartedUsers.get(UserHandle.USER_SYSTEM);
            if (uss == null) {
                return false;
            }
            return uss.state == UserState.STATE_RUNNING_LOCKED
                || uss.state == UserState.STATE_RUNNING_UNLOCKING
                || uss.state == UserState.STATE_RUNNING_UNLOCKED;
        }
    }

    UserInfo getCurrentUser() {
    UserInfo getCurrentUser() {
        if ((mInjector.checkCallingPermission(INTERACT_ACROSS_USERS)
        if ((mInjector.checkCallingPermission(INTERACT_ACROSS_USERS)
                != PackageManager.PERMISSION_GRANTED) && (
                != PackageManager.PERMISSION_GRANTED) && (