1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16
17package com.android.server.am;
18
19import static android.Manifest.permission.INTERACT_ACROSS_USERS;
20import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
21import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM;
22import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
23import static android.app.ActivityManager.USER_OP_IS_CURRENT;
24import static android.app.ActivityManager.USER_OP_SUCCESS;
25import static android.os.Process.SHELL_UID;
26import static android.os.Process.SYSTEM_UID;
27
28import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
29import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
30import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
31import static com.android.server.am.ActivityManagerService.ALLOW_FULL_ONLY;
32import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL;
33import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL_IN_PROFILE;
34import static com.android.server.am.ActivityManagerService.MY_PID;
35import static com.android.server.am.UserState.STATE_BOOTING;
36import static com.android.server.am.UserState.STATE_RUNNING_LOCKED;
37import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKED;
38import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKING;
39
40import android.annotation.NonNull;
41import android.annotation.Nullable;
42import android.annotation.UserIdInt;
43import android.app.ActivityManager;
44import android.app.AppGlobals;
45import android.app.AppOpsManager;
46import android.app.Dialog;
47import android.app.IStopUserCallback;
48import android.app.IUserSwitchObserver;
49import android.app.KeyguardManager;
50import android.app.usage.UsageEvents;
51import android.content.Context;
52import android.content.IIntentReceiver;
53import android.content.Intent;
54import android.content.pm.IPackageManager;
55import android.content.pm.PackageManager;
56import android.content.pm.UserInfo;
57import android.os.BatteryStats;
58import android.os.Binder;
59import android.os.Build;
60import android.os.Bundle;
61import android.os.Debug;
62import android.os.Handler;
63import android.os.IBinder;
64import android.os.IProgressListener;
65import android.os.IRemoteCallback;
66import android.os.IUserManager;
67import android.os.Looper;
68import android.os.Message;
69import android.os.Process;
70import android.os.RemoteCallbackList;
71import android.os.RemoteException;
72import android.os.ServiceManager;
73import android.os.SystemClock;
74import android.os.Trace;
75import android.os.UserHandle;
76import android.os.UserManager;
77import android.os.UserManagerInternal;
78import android.os.storage.IStorageManager;
79import android.os.storage.StorageManager;
80import android.text.format.DateUtils;
81import android.util.ArraySet;
82import android.util.IntArray;
83import android.util.Log;
84import android.util.Pair;
85import android.util.Slog;
86import android.util.SparseArray;
87import android.util.SparseIntArray;
88import android.util.TimingsTraceLog;
89import android.util.proto.ProtoOutputStream;
90
91import android.view.Window;
92import com.android.internal.R;
93import com.android.internal.annotations.GuardedBy;
94import com.android.internal.annotations.VisibleForTesting;
95import com.android.internal.logging.MetricsLogger;
96import com.android.internal.util.ArrayUtils;
97import com.android.internal.util.Preconditions;
98import com.android.internal.widget.LockPatternUtils;
99import com.android.server.FgThread;
100import com.android.server.LocalServices;
101import com.android.server.SystemServiceManager;
102import com.android.server.pm.UserManagerService;
103import com.android.server.wm.WindowManagerService;
104
105import java.io.PrintWriter;
106import java.util.ArrayList;
107import java.util.Arrays;
108import java.util.HashSet;
109import java.util.Iterator;
110import java.util.List;
111import java.util.Objects;
112import java.util.Set;
113import java.util.concurrent.atomic.AtomicInteger;
114
115/**
116 * Helper class for {@link ActivityManagerService} responsible for multi-user functionality.
117 *
118 * <p>This class use {@link #mLock} to synchronize access to internal state. Methods that require
119 * {@link #mLock} to be held should have "LU" suffix in the name.
120 *
121 * <p><strong>Important:</strong> Synchronized code, i.e. one executed inside a synchronized(mLock)
122 * block or inside LU method, should only access internal state of this class or make calls to
123 * other LU methods. Non-LU method calls or calls to external classes are discouraged as they
124 * may cause lock inversion.
125 */
126class UserController implements Handler.Callback {
127    private static final String TAG = TAG_WITH_CLASS_NAME ? "UserController" : TAG_AM;
128
129    // Amount of time we wait for observers to handle a user switch before
130    // giving up on them and unfreezing the screen.
131    static final int USER_SWITCH_TIMEOUT_MS = 3 * 1000;
132
133    // ActivityManager thread message constants
134    static final int REPORT_USER_SWITCH_MSG = 10;
135    static final int CONTINUE_USER_SWITCH_MSG = 20;
136    static final int USER_SWITCH_TIMEOUT_MSG = 30;
137    static final int START_PROFILES_MSG = 40;
138    static final int SYSTEM_USER_START_MSG = 50;
139    static final int SYSTEM_USER_CURRENT_MSG = 60;
140    static final int FOREGROUND_PROFILE_CHANGED_MSG = 70;
141    static final int REPORT_USER_SWITCH_COMPLETE_MSG = 80;
142    static final int USER_SWITCH_CALLBACKS_TIMEOUT_MSG = 90;
143    static final int SYSTEM_USER_UNLOCK_MSG = 100;
144    static final int REPORT_LOCKED_BOOT_COMPLETE_MSG = 110;
145    static final int START_USER_SWITCH_FG_MSG = 120;
146
147    // UI thread message constants
148    static final int START_USER_SWITCH_UI_MSG = 1000;
149
150    // If a callback wasn't called within USER_SWITCH_CALLBACKS_TIMEOUT_MS after
151    // USER_SWITCH_TIMEOUT_MS, an error is reported. Usually it indicates a problem in the observer
152    // when it never calls back.
153    private static final int USER_SWITCH_CALLBACKS_TIMEOUT_MS = 5 * 1000;
154
155    /**
156     * Maximum number of users we allow to be running at a time, including system user.
157     *
158     * <p>This parameter only affects how many background users will be stopped when switching to a
159     * new user. It has no impact on {@link #startUser(int, boolean)} behavior.
160     *
161     * <p>Note: Current and system user (and their related profiles) are never stopped when
162     * switching users. Due to that, the actual number of running users can exceed mMaxRunningUsers
163     */
164    int mMaxRunningUsers;
165
166    // Lock for internal state.
167    private final Object mLock = new Object();
168
169    private final Injector mInjector;
170    private final Handler mHandler;
171    private final Handler mUiHandler;
172
173    // Holds the current foreground user's id. Use mLock when updating
174    @GuardedBy("mLock")
175    private volatile int mCurrentUserId = UserHandle.USER_SYSTEM;
176    // Holds the target user's id during a user switch. The value of mCurrentUserId will be updated
177    // once target user goes into the foreground. Use mLock when updating
178    @GuardedBy("mLock")
179    private volatile int mTargetUserId = UserHandle.USER_NULL;
180
181    /**
182     * Which users have been started, so are allowed to run code.
183     */
184    @GuardedBy("mLock")
185    private final SparseArray<UserState> mStartedUsers = new SparseArray<>();
186
187    /**
188     * LRU list of history of current users.  Most recently current is at the end.
189     */
190    @GuardedBy("mLock")
191    private final ArrayList<Integer> mUserLru = new ArrayList<>();
192
193    /**
194     * Constant array of the users that are currently started.
195     */
196    @GuardedBy("mLock")
197    private int[] mStartedUserArray = new int[] { 0 };
198
199    // If there are multiple profiles for the current user, their ids are here
200    // Currently only the primary user can have managed profiles
201    @GuardedBy("mLock")
202    private int[] mCurrentProfileIds = new int[] {};
203
204    /**
205     * Mapping from each known user ID to the profile group ID it is associated with.
206     */
207    @GuardedBy("mLock")
208    private final SparseIntArray mUserProfileGroupIds = new SparseIntArray();
209
210    /**
211     * Registered observers of the user switching mechanics.
212     */
213    private final RemoteCallbackList<IUserSwitchObserver> mUserSwitchObservers
214            = new RemoteCallbackList<>();
215
216    boolean mUserSwitchUiEnabled = true;
217
218    /**
219     * Currently active user switch callbacks.
220     */
221    @GuardedBy("mLock")
222    private volatile ArraySet<String> mCurWaitingUserSwitchCallbacks;
223
224    /**
225     * Messages for for switching from {@link android.os.UserHandle#SYSTEM}.
226     */
227    @GuardedBy("mLock")
228    private String mSwitchingFromSystemUserMessage;
229
230    /**
231     * Messages for for switching to {@link android.os.UserHandle#SYSTEM}.
232     */
233    @GuardedBy("mLock")
234    private String mSwitchingToSystemUserMessage;
235
236    /**
237     * Callbacks that are still active after {@link #USER_SWITCH_TIMEOUT_MS}
238     */
239    @GuardedBy("mLock")
240    private ArraySet<String> mTimeoutUserSwitchCallbacks;
241
242    private final LockPatternUtils mLockPatternUtils;
243
244    UserController(ActivityManagerService service) {
245        this(new Injector(service));
246    }
247
248    @VisibleForTesting
249    UserController(Injector injector) {
250        mInjector = injector;
251        mHandler = mInjector.getHandler(this);
252        mUiHandler = mInjector.getUiHandler(this);
253        // User 0 is the first and only user that runs at boot.
254        final UserState uss = new UserState(UserHandle.SYSTEM);
255        uss.mUnlockProgress.addListener(new UserProgressListener());
256        mStartedUsers.put(UserHandle.USER_SYSTEM, uss);
257        mUserLru.add(UserHandle.USER_SYSTEM);
258        mLockPatternUtils = mInjector.getLockPatternUtils();
259        updateStartedUserArrayLU();
260    }
261
262    void finishUserSwitch(UserState uss) {
263        finishUserBoot(uss);
264        startProfiles();
265        synchronized (mLock) {
266            stopRunningUsersLU(mMaxRunningUsers);
267        }
268    }
269
270    List<Integer> getRunningUsersLU() {
271        ArrayList<Integer> runningUsers = new ArrayList<>();
272        for (Integer userId : mUserLru) {
273            UserState uss = mStartedUsers.get(userId);
274            if (uss == null) {
275                // Shouldn't happen, but be sane if it does.
276                continue;
277            }
278            if (uss.state == UserState.STATE_STOPPING
279                    || uss.state == UserState.STATE_SHUTDOWN) {
280                // This user is already stopping, doesn't count.
281                continue;
282            }
283            if (userId == UserHandle.USER_SYSTEM) {
284                // We only count system user as running when it is not a pure system user.
285                if (UserInfo.isSystemOnly(userId)) {
286                    continue;
287                }
288            }
289            runningUsers.add(userId);
290        }
291        return runningUsers;
292    }
293
294    void stopRunningUsersLU(int maxRunningUsers) {
295        List<Integer> currentlyRunning = getRunningUsersLU();
296        Iterator<Integer> iterator = currentlyRunning.iterator();
297        while (currentlyRunning.size() > maxRunningUsers && iterator.hasNext()) {
298            Integer userId = iterator.next();
299            if (userId == UserHandle.USER_SYSTEM || userId == mCurrentUserId) {
300                // Owner/System user and current user can't be stopped
301                continue;
302            }
303            if (stopUsersLU(userId, false, null) == USER_OP_SUCCESS) {
304                iterator.remove();
305            }
306        }
307    }
308
309    /**
310     * Returns if more users can be started without stopping currently running users.
311     */
312    boolean canStartMoreUsers() {
313        synchronized (mLock) {
314            return getRunningUsersLU().size() < mMaxRunningUsers;
315        }
316    }
317
318    private void finishUserBoot(UserState uss) {
319        finishUserBoot(uss, null);
320    }
321
322    private void finishUserBoot(UserState uss, IIntentReceiver resultTo) {
323        final int userId = uss.mHandle.getIdentifier();
324
325        Slog.d(TAG, "Finishing user boot " + userId);
326        synchronized (mLock) {
327            // Bail if we ended up with a stale user
328            if (mStartedUsers.get(userId) != uss) {
329                return;
330            }
331        }
332
333        // We always walk through all the user lifecycle states to send
334        // consistent developer events. We step into RUNNING_LOCKED here,
335        // but we might immediately step into RUNNING below if the user
336        // storage is already unlocked.
337        if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
338            mInjector.getUserManagerInternal().setUserState(userId, uss.state);
339            // Do not report secondary users, runtime restarts or first boot/upgrade
340            if (userId == UserHandle.USER_SYSTEM
341                    && !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {
342                int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
343                MetricsLogger.histogram(mInjector.getContext(),
344                        "framework_locked_boot_completed", uptimeSeconds);
345                final int MAX_UPTIME_SECONDS = 120;
346                if (uptimeSeconds > MAX_UPTIME_SECONDS) {
347                    Slog.wtf("SystemServerTiming",
348                            "finishUserBoot took too long. uptimeSeconds=" + uptimeSeconds);
349                }
350            }
351
352            mHandler.sendMessage(mHandler.obtainMessage(REPORT_LOCKED_BOOT_COMPLETE_MSG,
353                    userId, 0));
354            Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
355            intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
356            intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
357                    | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
358            mInjector.broadcastIntent(intent, null, resultTo, 0, null, null,
359                    new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED},
360                    AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
361        }
362
363        // We need to delay unlocking managed profiles until the parent user
364        // is also unlocked.
365        if (mInjector.getUserManager().isManagedProfile(userId)) {
366            final UserInfo parent = mInjector.getUserManager().getProfileParent(userId);
367            if (parent != null
368                    && isUserRunning(parent.id, ActivityManager.FLAG_AND_UNLOCKED)) {
369                Slog.d(TAG, "User " + userId + " (parent " + parent.id
370                        + "): attempting unlock because parent is unlocked");
371                maybeUnlockUser(userId);
372            } else {
373                String parentId = (parent == null) ? "<null>" : String.valueOf(parent.id);
374                Slog.d(TAG, "User " + userId + " (parent " + parentId
375                        + "): delaying unlock because parent is locked");
376            }
377        } else {
378            maybeUnlockUser(userId);
379        }
380    }
381
382    /**
383     * Step from {@link UserState#STATE_RUNNING_LOCKED} to
384     * {@link UserState#STATE_RUNNING_UNLOCKING}.
385     */
386    private void finishUserUnlocking(final UserState uss) {
387        final int userId = uss.mHandle.getIdentifier();
388        // Only keep marching forward if user is actually unlocked
389        if (!StorageManager.isUserKeyUnlocked(userId)) return;
390        synchronized (mLock) {
391            // Do not proceed if unexpected state or a stale user
392            if (mStartedUsers.get(userId) != uss || uss.state != STATE_RUNNING_LOCKED) {
393                return;
394            }
395        }
396        uss.mUnlockProgress.start();
397
398        // Prepare app storage before we go any further
399        uss.mUnlockProgress.setProgress(5,
400                    mInjector.getContext().getString(R.string.android_start_title));
401
402        // Call onBeforeUnlockUser on a worker thread that allows disk I/O
403        FgThread.getHandler().post(() -> {
404            if (!StorageManager.isUserKeyUnlocked(userId)) {
405                Slog.w(TAG, "User key got locked unexpectedly, leaving user locked.");
406                return;
407            }
408            mInjector.getUserManager().onBeforeUnlockUser(userId);
409            synchronized (mLock) {
410                // Do not proceed if unexpected state
411                if (!uss.setState(STATE_RUNNING_LOCKED, STATE_RUNNING_UNLOCKING)) {
412                    return;
413                }
414            }
415            mInjector.getUserManagerInternal().setUserState(userId, uss.state);
416
417            uss.mUnlockProgress.setProgress(20);
418
419            // Dispatch unlocked to system services; when fully dispatched,
420            // that calls through to the next "unlocked" phase
421            mHandler.obtainMessage(SYSTEM_USER_UNLOCK_MSG, userId, 0, uss)
422                    .sendToTarget();
423        });
424    }
425
426    /**
427     * Step from {@link UserState#STATE_RUNNING_UNLOCKING} to
428     * {@link UserState#STATE_RUNNING_UNLOCKED}.
429     */
430    void finishUserUnlocked(final UserState uss) {
431        final int userId = uss.mHandle.getIdentifier();
432        // Only keep marching forward if user is actually unlocked
433        if (!StorageManager.isUserKeyUnlocked(userId)) return;
434        synchronized (mLock) {
435            // Bail if we ended up with a stale user
436            if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
437
438            // Do not proceed if unexpected state
439            if (!uss.setState(STATE_RUNNING_UNLOCKING, STATE_RUNNING_UNLOCKED)) {
440                return;
441            }
442        }
443        mInjector.getUserManagerInternal().setUserState(userId, uss.state);
444        uss.mUnlockProgress.finish();
445
446        // Get unaware persistent apps running and start any unaware providers
447        // in already-running apps that are partially aware
448        if (userId == UserHandle.USER_SYSTEM) {
449            mInjector.startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
450        }
451        mInjector.installEncryptionUnawareProviders(userId);
452
453        // Dispatch unlocked to external apps
454        final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED);
455        unlockedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
456        unlockedIntent.addFlags(
457                Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
458        mInjector.broadcastIntent(unlockedIntent, null, null, 0, null,
459                null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
460                userId);
461
462        if (getUserInfo(userId).isManagedProfile()) {
463            UserInfo parent = mInjector.getUserManager().getProfileParent(userId);
464            if (parent != null) {
465                final Intent profileUnlockedIntent = new Intent(
466                        Intent.ACTION_MANAGED_PROFILE_UNLOCKED);
467                profileUnlockedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(userId));
468                profileUnlockedIntent.addFlags(
469                        Intent.FLAG_RECEIVER_REGISTERED_ONLY
470                                | Intent.FLAG_RECEIVER_FOREGROUND);
471                mInjector.broadcastIntent(profileUnlockedIntent,
472                        null, null, 0, null, null, null, AppOpsManager.OP_NONE,
473                        null, false, false, MY_PID, SYSTEM_UID,
474                        parent.id);
475            }
476        }
477
478        // Send PRE_BOOT broadcasts if user fingerprint changed; we
479        // purposefully block sending BOOT_COMPLETED until after all
480        // PRE_BOOT receivers are finished to avoid ANR'ing apps
481        final UserInfo info = getUserInfo(userId);
482        if (!Objects.equals(info.lastLoggedInFingerprint, Build.FINGERPRINT)) {
483            // Suppress double notifications for managed profiles that
484            // were unlocked automatically as part of their parent user
485            // being unlocked.
486            final boolean quiet;
487            if (info.isManagedProfile()) {
488                quiet = !uss.tokenProvided
489                        || !mLockPatternUtils.isSeparateProfileChallengeEnabled(userId);
490            } else {
491                quiet = false;
492            }
493            mInjector.sendPreBootBroadcast(userId, quiet,
494                    () -> finishUserUnlockedCompleted(uss));
495        } else {
496            finishUserUnlockedCompleted(uss);
497        }
498    }
499
500    private void finishUserUnlockedCompleted(UserState uss) {
501        final int userId = uss.mHandle.getIdentifier();
502        synchronized (mLock) {
503            // Bail if we ended up with a stale user
504            if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
505        }
506        UserInfo userInfo = getUserInfo(userId);
507        if (userInfo == null) {
508            return;
509        }
510        // Only keep marching forward if user is actually unlocked
511        if (!StorageManager.isUserKeyUnlocked(userId)) return;
512
513        // Remember that we logged in
514        mInjector.getUserManager().onUserLoggedIn(userId);
515
516        if (!userInfo.isInitialized()) {
517            if (userId != UserHandle.USER_SYSTEM) {
518                Slog.d(TAG, "Initializing user #" + userId);
519                Intent intent = new Intent(Intent.ACTION_USER_INITIALIZE);
520                intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND
521                        | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
522                mInjector.broadcastIntent(intent, null,
523                        new IIntentReceiver.Stub() {
524                            @Override
525                            public void performReceive(Intent intent, int resultCode,
526                                    String data, Bundle extras, boolean ordered,
527                                    boolean sticky, int sendingUser) {
528                                // Note: performReceive is called with mService lock held
529                                mInjector.getUserManager().makeInitialized(userInfo.id);
530                            }
531                        }, 0, null, null, null, AppOpsManager.OP_NONE,
532                        null, true, false, MY_PID, SYSTEM_UID, userId);
533            }
534        }
535
536        Slog.i(TAG, "Sending BOOT_COMPLETE user #" + userId);
537        // Do not report secondary users, runtime restarts or first boot/upgrade
538        if (userId == UserHandle.USER_SYSTEM
539                && !mInjector.isRuntimeRestarted() && !mInjector.isFirstBootOrUpgrade()) {
540            int uptimeSeconds = (int) (SystemClock.elapsedRealtime() / 1000);
541            MetricsLogger.histogram(mInjector.getContext(), "framework_boot_completed",
542                    uptimeSeconds);
543        }
544        final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
545        bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
546        bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
547                | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
548        mInjector.broadcastIntent(bootIntent, null, new IIntentReceiver.Stub() {
549                    @Override
550                    public void performReceive(Intent intent, int resultCode, String data,
551                            Bundle extras, boolean ordered, boolean sticky, int sendingUser)
552                            throws RemoteException {
553                        Slog.i(UserController.TAG, "Finished processing BOOT_COMPLETED for u" + userId);
554                    }
555                }, 0, null, null,
556                new String[]{android.Manifest.permission.RECEIVE_BOOT_COMPLETED},
557                AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
558    }
559
560    int restartUser(final int userId, final boolean foreground) {
561        return stopUser(userId, /* force */ true, new IStopUserCallback.Stub() {
562            @Override
563            public void userStopped(final int userId) {
564                // Post to the same handler that this callback is called from to ensure the user
565                // cleanup is complete before restarting.
566                mHandler.post(() -> startUser(userId, foreground));
567            }
568            @Override
569            public void userStopAborted(final int userId) {}
570        });
571    }
572
573    int stopUser(final int userId, final boolean force, final IStopUserCallback callback) {
574        if (mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
575                != PackageManager.PERMISSION_GRANTED) {
576            String msg = "Permission Denial: switchUser() from pid="
577                    + Binder.getCallingPid()
578                    + ", uid=" + Binder.getCallingUid()
579                    + " requires " + INTERACT_ACROSS_USERS_FULL;
580            Slog.w(TAG, msg);
581            throw new SecurityException(msg);
582        }
583        if (userId < 0 || userId == UserHandle.USER_SYSTEM) {
584            throw new IllegalArgumentException("Can't stop system user " + userId);
585        }
586        enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, userId);
587        synchronized (mLock) {
588            return stopUsersLU(userId, force, callback);
589        }
590    }
591
592    /**
593     * Stops the user along with its related users. The method calls
594     * {@link #getUsersToStopLU(int)} to determine the list of users that should be stopped.
595     */
596    private int stopUsersLU(final int userId, boolean force, final IStopUserCallback callback) {
597        if (userId == UserHandle.USER_SYSTEM) {
598            return USER_OP_ERROR_IS_SYSTEM;
599        }
600        if (isCurrentUserLU(userId)) {
601            return USER_OP_IS_CURRENT;
602        }
603        int[] usersToStop = getUsersToStopLU(userId);
604        // If one of related users is system or current, no related users should be stopped
605        for (int i = 0; i < usersToStop.length; i++) {
606            int relatedUserId = usersToStop[i];
607            if ((UserHandle.USER_SYSTEM == relatedUserId) || isCurrentUserLU(relatedUserId)) {
608                if (DEBUG_MU) Slog.i(TAG, "stopUsersLocked cannot stop related user "
609                        + relatedUserId);
610                // We still need to stop the requested user if it's a force stop.
611                if (force) {
612                    Slog.i(TAG,
613                            "Force stop user " + userId + ". Related users will not be stopped");
614                    stopSingleUserLU(userId, callback);
615                    return USER_OP_SUCCESS;
616                }
617                return USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
618            }
619        }
620        if (DEBUG_MU) Slog.i(TAG, "stopUsersLocked usersToStop=" + Arrays.toString(usersToStop));
621        for (int userIdToStop : usersToStop) {
622            stopSingleUserLU(userIdToStop, userIdToStop == userId ? callback : null);
623        }
624        return USER_OP_SUCCESS;
625    }
626
627    private void stopSingleUserLU(final int userId, final IStopUserCallback callback) {
628        if (DEBUG_MU) Slog.i(TAG, "stopSingleUserLocked userId=" + userId);
629        final UserState uss = mStartedUsers.get(userId);
630        if (uss == null) {
631            // User is not started, nothing to do...  but we do need to
632            // callback if requested.
633            if (callback != null) {
634                mHandler.post(() -> {
635                    try {
636                        callback.userStopped(userId);
637                    } catch (RemoteException e) {
638                    }
639                });
640            }
641            return;
642        }
643
644        if (callback != null) {
645            uss.mStopCallbacks.add(callback);
646        }
647
648        if (uss.state != UserState.STATE_STOPPING
649                && uss.state != UserState.STATE_SHUTDOWN) {
650            uss.setState(UserState.STATE_STOPPING);
651            mInjector.getUserManagerInternal().setUserState(userId, uss.state);
652            updateStartedUserArrayLU();
653
654            // Post to handler to obtain amLock
655            mHandler.post(() -> {
656                // We are going to broadcast ACTION_USER_STOPPING and then
657                // once that is done send a final ACTION_SHUTDOWN and then
658                // stop the user.
659                final Intent stoppingIntent = new Intent(Intent.ACTION_USER_STOPPING);
660                stoppingIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
661                stoppingIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
662                stoppingIntent.putExtra(Intent.EXTRA_SHUTDOWN_USERSPACE_ONLY, true);
663                // This is the result receiver for the initial stopping broadcast.
664                final IIntentReceiver stoppingReceiver = new IIntentReceiver.Stub() {
665                    @Override
666                    public void performReceive(Intent intent, int resultCode, String data,
667                            Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
668                        mHandler.post(() -> finishUserStopping(userId, uss));
669                    }
670                };
671
672                // Clear broadcast queue for the user to avoid delivering stale broadcasts
673                mInjector.clearBroadcastQueueForUser(userId);
674                // Kick things off.
675                mInjector.broadcastIntent(stoppingIntent,
676                        null, stoppingReceiver, 0, null, null,
677                        new String[]{INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
678                        null, true, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
679            });
680        }
681    }
682
683    void finishUserStopping(final int userId, final UserState uss) {
684        // On to the next.
685        final Intent shutdownIntent = new Intent(Intent.ACTION_SHUTDOWN);
686        // This is the result receiver for the final shutdown broadcast.
687        final IIntentReceiver shutdownReceiver = new IIntentReceiver.Stub() {
688            @Override
689            public void performReceive(Intent intent, int resultCode, String data,
690                    Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
691                mHandler.post(new Runnable() {
692                    @Override
693                    public void run() {
694                        finishUserStopped(uss);
695                    }
696                });
697            }
698        };
699
700        synchronized (mLock) {
701            if (uss.state != UserState.STATE_STOPPING) {
702                // Whoops, we are being started back up.  Abort, abort!
703                return;
704            }
705            uss.setState(UserState.STATE_SHUTDOWN);
706        }
707        mInjector.getUserManagerInternal().setUserState(userId, uss.state);
708
709        mInjector.batteryStatsServiceNoteEvent(
710                BatteryStats.HistoryItem.EVENT_USER_RUNNING_FINISH,
711                Integer.toString(userId), userId);
712        mInjector.getSystemServiceManager().stopUser(userId);
713
714        mInjector.broadcastIntent(shutdownIntent,
715                null, shutdownReceiver, 0, null, null, null,
716                AppOpsManager.OP_NONE,
717                null, true, false, MY_PID, SYSTEM_UID, userId);
718    }
719
720    void finishUserStopped(UserState uss) {
721        final int userId = uss.mHandle.getIdentifier();
722        final boolean stopped;
723        ArrayList<IStopUserCallback> callbacks;
724        synchronized (mLock) {
725            callbacks = new ArrayList<>(uss.mStopCallbacks);
726            if (mStartedUsers.get(userId) != uss || uss.state != UserState.STATE_SHUTDOWN) {
727                stopped = false;
728            } else {
729                stopped = true;
730                // User can no longer run.
731                mStartedUsers.remove(userId);
732                mUserLru.remove(Integer.valueOf(userId));
733                updateStartedUserArrayLU();
734            }
735        }
736
737        if (stopped) {
738            mInjector.getUserManagerInternal().removeUserState(userId);
739            mInjector.activityManagerOnUserStopped(userId);
740            // Clean up all state and processes associated with the user.
741            // Kill all the processes for the user.
742            forceStopUser(userId, "finish user");
743        }
744
745        for (int i = 0; i < callbacks.size(); i++) {
746            try {
747                if (stopped) callbacks.get(i).userStopped(userId);
748                else callbacks.get(i).userStopAborted(userId);
749            } catch (RemoteException e) {
750            }
751        }
752
753        if (stopped) {
754            mInjector.systemServiceManagerCleanupUser(userId);
755            mInjector.stackSupervisorRemoveUser(userId);
756            // Remove the user if it is ephemeral.
757            if (getUserInfo(userId).isEphemeral()) {
758                mInjector.getUserManager().removeUserEvenWhenDisallowed(userId);
759            }
760
761            // Evict the user's credential encryption key. Performed on FgThread to make it
762            // serialized with call to UserManagerService.onBeforeUnlockUser in finishUserUnlocking
763            // to prevent data corruption.
764            FgThread.getHandler().post(() -> {
765                synchronized (mLock) {
766                    if (mStartedUsers.get(userId) != null) {
767                        Slog.w(TAG, "User was restarted, skipping key eviction");
768                        return;
769                    }
770                }
771                try {
772                    getStorageManager().lockUserKey(userId);
773                } catch (RemoteException re) {
774                    throw re.rethrowAsRuntimeException();
775                }
776            });
777        }
778    }
779
780    /**
781     * Determines the list of users that should be stopped together with the specified
782     * {@code userId}. The returned list includes {@code userId}.
783     */
784    private @NonNull int[] getUsersToStopLU(int userId) {
785        int startedUsersSize = mStartedUsers.size();
786        IntArray userIds = new IntArray();
787        userIds.add(userId);
788        int userGroupId = mUserProfileGroupIds.get(userId, UserInfo.NO_PROFILE_GROUP_ID);
789        for (int i = 0; i < startedUsersSize; i++) {
790            UserState uss = mStartedUsers.valueAt(i);
791            int startedUserId = uss.mHandle.getIdentifier();
792            // Skip unrelated users (profileGroupId mismatch)
793            int startedUserGroupId = mUserProfileGroupIds.get(startedUserId,
794                    UserInfo.NO_PROFILE_GROUP_ID);
795            boolean sameGroup = (userGroupId != UserInfo.NO_PROFILE_GROUP_ID)
796                    && (userGroupId == startedUserGroupId);
797            // userId has already been added
798            boolean sameUserId = startedUserId == userId;
799            if (!sameGroup || sameUserId) {
800                continue;
801            }
802            userIds.add(startedUserId);
803        }
804        return userIds.toArray();
805    }
806
807    private void forceStopUser(int userId, String reason) {
808        mInjector.activityManagerForceStopPackage(userId, reason);
809        Intent intent = new Intent(Intent.ACTION_USER_STOPPED);
810        intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
811                | Intent.FLAG_RECEIVER_FOREGROUND);
812        intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
813        mInjector.broadcastIntent(intent,
814                null, null, 0, null, null, null, AppOpsManager.OP_NONE,
815                null, false, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
816    }
817
818    /**
819     * Stops the guest or ephemeral user if it has gone to the background.
820     */
821    private void stopGuestOrEphemeralUserIfBackground(int oldUserId) {
822        if (DEBUG_MU) Slog.i(TAG, "Stop guest or ephemeral user if background: " + oldUserId);
823        synchronized(mLock) {
824            UserState oldUss = mStartedUsers.get(oldUserId);
825            if (oldUserId == UserHandle.USER_SYSTEM || oldUserId == mCurrentUserId || oldUss == null
826                    || oldUss.state == UserState.STATE_STOPPING
827                    || oldUss.state == UserState.STATE_SHUTDOWN) {
828                return;
829            }
830        }
831
832        UserInfo userInfo = getUserInfo(oldUserId);
833        if (userInfo.isEphemeral()) {
834            LocalServices.getService(UserManagerInternal.class).onEphemeralUserStop(oldUserId);
835        }
836        if (userInfo.isGuest() || userInfo.isEphemeral()) {
837            // This is a user to be stopped.
838            synchronized (mLock) {
839                stopUsersLU(oldUserId, true, null);
840            }
841        }
842    }
843
844    void scheduleStartProfiles() {
845        if (!mHandler.hasMessages(START_PROFILES_MSG)) {
846            mHandler.sendMessageDelayed(mHandler.obtainMessage(START_PROFILES_MSG),
847                    DateUtils.SECOND_IN_MILLIS);
848        }
849    }
850
851    void startProfiles() {
852        int currentUserId = getCurrentUserId();
853        if (DEBUG_MU) Slog.i(TAG, "startProfilesLocked");
854        List<UserInfo> profiles = mInjector.getUserManager().getProfiles(
855                currentUserId, false /* enabledOnly */);
856        List<UserInfo> profilesToStart = new ArrayList<>(profiles.size());
857        for (UserInfo user : profiles) {
858            if ((user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED
859                    && user.id != currentUserId && !user.isQuietModeEnabled()) {
860                profilesToStart.add(user);
861            }
862        }
863        final int profilesToStartSize = profilesToStart.size();
864        int i = 0;
865        for (; i < profilesToStartSize && i < (mMaxRunningUsers - 1); ++i) {
866            startUser(profilesToStart.get(i).id, /* foreground= */ false);
867        }
868        if (i < profilesToStartSize) {
869            Slog.w(TAG, "More profiles than MAX_RUNNING_USERS");
870        }
871    }
872
873    private IStorageManager getStorageManager() {
874        return IStorageManager.Stub.asInterface(ServiceManager.getService("mount"));
875    }
876    boolean startUser(final int userId, final boolean foreground) {
877        return startUser(userId, foreground, null);
878    }
879
880    /**
881     * Start user, if its not already running.
882     * <p>The user will be brought to the foreground, if {@code foreground} parameter is set.
883     * When starting the user, multiple intents will be broadcast in the following order:</p>
884     * <ul>
885     *     <li>{@link Intent#ACTION_USER_STARTED} - sent to registered receivers of the new user
886     *     <li>{@link Intent#ACTION_USER_BACKGROUND} - sent to registered receivers of the outgoing
887     *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
888     *     <li>{@link Intent#ACTION_USER_FOREGROUND} - sent to registered receivers of the new
889     *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
890     *     <li>{@link Intent#ACTION_USER_SWITCHED} - sent to registered receivers of the new user.
891     *     Sent only if {@code foreground} parameter is true
892     *     <li>{@link Intent#ACTION_USER_STARTING} - ordered broadcast sent to registered receivers
893     *     of the new fg user
894     *     <li>{@link Intent#ACTION_LOCKED_BOOT_COMPLETED} - ordered broadcast sent to receivers of
895     *     the new user
896     *     <li>{@link Intent#ACTION_USER_UNLOCKED} - sent to registered receivers of the new user
897     *     <li>{@link Intent#ACTION_PRE_BOOT_COMPLETED} - ordered broadcast sent to receivers of the
898     *     new user. Sent only when the user is booting after a system update.
899     *     <li>{@link Intent#ACTION_USER_INITIALIZE} - ordered broadcast sent to receivers of the
900     *     new user. Sent only the first time a user is starting.
901     *     <li>{@link Intent#ACTION_BOOT_COMPLETED} - ordered broadcast sent to receivers of the new
902     *     user. Indicates that the user has finished booting.
903     * </ul>
904     *
905     * @param userId ID of the user to start
906     * @param foreground true if user should be brought to the foreground
907     * @return true if the user has been successfully started
908     */
909    boolean startUser(
910            final int userId,
911            final boolean foreground,
912            @Nullable IProgressListener unlockListener) {
913        if (mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
914                != PackageManager.PERMISSION_GRANTED) {
915            String msg = "Permission Denial: switchUser() from pid="
916                    + Binder.getCallingPid()
917                    + ", uid=" + Binder.getCallingUid()
918                    + " requires " + INTERACT_ACROSS_USERS_FULL;
919            Slog.w(TAG, msg);
920            throw new SecurityException(msg);
921        }
922
923        Slog.i(TAG, "Starting userid:" + userId + " fg:" + foreground);
924
925        final long ident = Binder.clearCallingIdentity();
926        try {
927            final int oldUserId = getCurrentUserId();
928            if (oldUserId == userId) {
929                return true;
930            }
931
932            if (foreground) {
933                mInjector.clearAllLockedTasks("startUser");
934            }
935
936            final UserInfo userInfo = getUserInfo(userId);
937            if (userInfo == null) {
938                Slog.w(TAG, "No user info for user #" + userId);
939                return false;
940            }
941            if (foreground && userInfo.isManagedProfile()) {
942                Slog.w(TAG, "Cannot switch to User #" + userId + ": not a full user");
943                return false;
944            }
945
946            if (foreground && mUserSwitchUiEnabled) {
947                mInjector.getWindowManager().startFreezingScreen(
948                        R.anim.screen_user_exit, R.anim.screen_user_enter);
949            }
950
951            boolean needStart = false;
952            boolean updateUmState = false;
953            UserState uss;
954
955            // If the user we are switching to is not currently started, then
956            // we need to start it now.
957            synchronized (mLock) {
958                uss = mStartedUsers.get(userId);
959                if (uss == null) {
960                    uss = new UserState(UserHandle.of(userId));
961                    uss.mUnlockProgress.addListener(new UserProgressListener());
962                    mStartedUsers.put(userId, uss);
963                    updateStartedUserArrayLU();
964                    needStart = true;
965                    updateUmState = true;
966                } else if (uss.state == UserState.STATE_SHUTDOWN && !isCallingOnHandlerThread()) {
967                    Slog.i(TAG, "User #" + userId
968                            + " is shutting down - will start after full stop");
969                    mHandler.post(() -> startUser(userId, foreground, unlockListener));
970                    return true;
971                }
972                final Integer userIdInt = userId;
973                mUserLru.remove(userIdInt);
974                mUserLru.add(userIdInt);
975            }
976            if (unlockListener != null) {
977                uss.mUnlockProgress.addListener(unlockListener);
978            }
979            if (updateUmState) {
980                mInjector.getUserManagerInternal().setUserState(userId, uss.state);
981            }
982            if (foreground) {
983                // Make sure the old user is no longer considering the display to be on.
984                mInjector.reportGlobalUsageEventLocked(UsageEvents.Event.SCREEN_NON_INTERACTIVE);
985                synchronized (mLock) {
986                    mCurrentUserId = userId;
987                    mTargetUserId = UserHandle.USER_NULL; // reset, mCurrentUserId has caught up
988                }
989                mInjector.updateUserConfiguration();
990                updateCurrentProfileIds();
991                mInjector.getWindowManager().setCurrentUser(userId, getCurrentProfileIds());
992                mInjector.reportCurWakefulnessUsageEvent();
993                // Once the internal notion of the active user has switched, we lock the device
994                // with the option to show the user switcher on the keyguard.
995                if (mUserSwitchUiEnabled) {
996                    mInjector.getWindowManager().setSwitchingUser(true);
997                    mInjector.getWindowManager().lockNow(null);
998                }
999            } else {
1000                final Integer currentUserIdInt = mCurrentUserId;
1001                updateCurrentProfileIds();
1002                mInjector.getWindowManager().setCurrentProfileIds(getCurrentProfileIds());
1003                synchronized (mLock) {
1004                    mUserLru.remove(currentUserIdInt);
1005                    mUserLru.add(currentUserIdInt);
1006                }
1007            }
1008
1009            // Make sure user is in the started state.  If it is currently
1010            // stopping, we need to knock that off.
1011            if (uss.state == UserState.STATE_STOPPING) {
1012                // If we are stopping, we haven't sent ACTION_SHUTDOWN,
1013                // so we can just fairly silently bring the user back from
1014                // the almost-dead.
1015                uss.setState(uss.lastState);
1016                mInjector.getUserManagerInternal().setUserState(userId, uss.state);
1017                synchronized (mLock) {
1018                    updateStartedUserArrayLU();
1019                }
1020                needStart = true;
1021            } else if (uss.state == UserState.STATE_SHUTDOWN) {
1022                // This means ACTION_SHUTDOWN has been sent, so we will
1023                // need to treat this as a new boot of the user.
1024                uss.setState(UserState.STATE_BOOTING);
1025                mInjector.getUserManagerInternal().setUserState(userId, uss.state);
1026                synchronized (mLock) {
1027                    updateStartedUserArrayLU();
1028                }
1029                needStart = true;
1030            }
1031
1032            if (uss.state == UserState.STATE_BOOTING) {
1033                // Give user manager a chance to propagate user restrictions
1034                // to other services and prepare app storage
1035                mInjector.getUserManager().onBeforeStartUser(userId);
1036
1037                // Booting up a new user, need to tell system services about it.
1038                // Note that this is on the same handler as scheduling of broadcasts,
1039                // which is important because it needs to go first.
1040                mHandler.sendMessage(
1041                        mHandler.obtainMessage(SYSTEM_USER_START_MSG, userId, 0));
1042            }
1043
1044            if (foreground) {
1045                mHandler.sendMessage(mHandler.obtainMessage(SYSTEM_USER_CURRENT_MSG, userId,
1046                        oldUserId));
1047                mHandler.removeMessages(REPORT_USER_SWITCH_MSG);
1048                mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG);
1049                mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_MSG,
1050                        oldUserId, userId, uss));
1051                mHandler.sendMessageDelayed(mHandler.obtainMessage(USER_SWITCH_TIMEOUT_MSG,
1052                        oldUserId, userId, uss), USER_SWITCH_TIMEOUT_MS);
1053            }
1054
1055            if (needStart) {
1056                // Send USER_STARTED broadcast
1057                Intent intent = new Intent(Intent.ACTION_USER_STARTED);
1058                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1059                        | Intent.FLAG_RECEIVER_FOREGROUND);
1060                intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1061                mInjector.broadcastIntent(intent,
1062                        null, null, 0, null, null, null, AppOpsManager.OP_NONE,
1063                        null, false, false, MY_PID, SYSTEM_UID, userId);
1064            }
1065
1066            if (foreground) {
1067                moveUserToForeground(uss, oldUserId, userId);
1068            } else {
1069                finishUserBoot(uss);
1070            }
1071
1072            if (needStart) {
1073                Intent intent = new Intent(Intent.ACTION_USER_STARTING);
1074                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
1075                intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
1076                mInjector.broadcastIntent(intent,
1077                        null, new IIntentReceiver.Stub() {
1078                            @Override
1079                            public void performReceive(Intent intent, int resultCode,
1080                                    String data, Bundle extras, boolean ordered,
1081                                    boolean sticky,
1082                                    int sendingUser) throws RemoteException {
1083                            }
1084                        }, 0, null, null,
1085                        new String[]{INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
1086                        null, true, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
1087            }
1088        } finally {
1089            Binder.restoreCallingIdentity(ident);
1090        }
1091
1092        return true;
1093    }
1094
1095    private boolean isCallingOnHandlerThread() {
1096        return Looper.myLooper() == mHandler.getLooper();
1097    }
1098
1099    /**
1100     * Start user, if its not already running, and bring it to foreground.
1101     */
1102    void startUserInForeground(final int targetUserId) {
1103        boolean success = startUser(targetUserId, /* foreground */ true);
1104        if (!success) {
1105            mInjector.getWindowManager().setSwitchingUser(false);
1106        }
1107    }
1108
1109    boolean unlockUser(final int userId, byte[] token, byte[] secret, IProgressListener listener) {
1110        if (mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
1111                != PackageManager.PERMISSION_GRANTED) {
1112            String msg = "Permission Denial: unlockUser() from pid="
1113                    + Binder.getCallingPid()
1114                    + ", uid=" + Binder.getCallingUid()
1115                    + " requires " + INTERACT_ACROSS_USERS_FULL;
1116            Slog.w(TAG, msg);
1117            throw new SecurityException(msg);
1118        }
1119
1120        final long binderToken = Binder.clearCallingIdentity();
1121        try {
1122            return unlockUserCleared(userId, token, secret, listener);
1123        } finally {
1124            Binder.restoreCallingIdentity(binderToken);
1125        }
1126    }
1127
1128    /**
1129     * Attempt to unlock user without a credential token. This typically
1130     * succeeds when the device doesn't have credential-encrypted storage, or
1131     * when the the credential-encrypted storage isn't tied to a user-provided
1132     * PIN or pattern.
1133     */
1134    private boolean maybeUnlockUser(final int userId) {
1135        // Try unlocking storage using empty token
1136        return unlockUserCleared(userId, null, null, null);
1137    }
1138
1139    private static void notifyFinished(int userId, IProgressListener listener) {
1140        if (listener == null) return;
1141        try {
1142            listener.onFinished(userId, null);
1143        } catch (RemoteException ignored) {
1144        }
1145    }
1146
1147    private boolean unlockUserCleared(final int userId, byte[] token, byte[] secret,
1148            IProgressListener listener) {
1149        UserState uss;
1150        if (!StorageManager.isUserKeyUnlocked(userId)) {
1151            final UserInfo userInfo = getUserInfo(userId);
1152            final IStorageManager storageManager = getStorageManager();
1153            try {
1154                // We always want to unlock user storage, even user is not started yet
1155                storageManager.unlockUserKey(userId, userInfo.serialNumber, token, secret);
1156            } catch (RemoteException | RuntimeException e) {
1157                Slog.w(TAG, "Failed to unlock: " + e.getMessage());
1158            }
1159        }
1160        synchronized (mLock) {
1161            // Register the given listener to watch for unlock progress
1162            uss = mStartedUsers.get(userId);
1163            if (uss != null) {
1164                uss.mUnlockProgress.addListener(listener);
1165                uss.tokenProvided = (token != null);
1166            }
1167        }
1168        // Bail if user isn't actually running
1169        if (uss == null) {
1170            notifyFinished(userId, listener);
1171            return false;
1172        }
1173
1174        finishUserUnlocking(uss);
1175
1176        // We just unlocked a user, so let's now attempt to unlock any
1177        // managed profiles under that user.
1178
1179        // First, get list of userIds. Requires mLock, so we cannot make external calls, e.g. to UMS
1180        int[] userIds;
1181        synchronized (mLock) {
1182            userIds = new int[mStartedUsers.size()];
1183            for (int i = 0; i < userIds.length; i++) {
1184                userIds[i] = mStartedUsers.keyAt(i);
1185            }
1186        }
1187        for (int testUserId : userIds) {
1188            final UserInfo parent = mInjector.getUserManager().getProfileParent(testUserId);
1189            if (parent != null && parent.id == userId && testUserId != userId) {
1190                Slog.d(TAG, "User " + testUserId + " (parent " + parent.id
1191                        + "): attempting unlock because parent was just unlocked");
1192                maybeUnlockUser(testUserId);
1193            }
1194        }
1195
1196        return true;
1197    }
1198
1199    boolean switchUser(final int targetUserId) {
1200        enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, targetUserId);
1201        int currentUserId = getCurrentUserId();
1202        UserInfo targetUserInfo = getUserInfo(targetUserId);
1203        if (targetUserId == currentUserId) {
1204            Slog.i(TAG, "user #" + targetUserId + " is already the current user");
1205            return true;
1206        }
1207        if (targetUserInfo == null) {
1208            Slog.w(TAG, "No user info for user #" + targetUserId);
1209            return false;
1210        }
1211        if (!targetUserInfo.supportsSwitchTo()) {
1212            Slog.w(TAG, "Cannot switch to User #" + targetUserId + ": not supported");
1213            return false;
1214        }
1215        if (targetUserInfo.isManagedProfile()) {
1216            Slog.w(TAG, "Cannot switch to User #" + targetUserId + ": not a full user");
1217            return false;
1218        }
1219        synchronized (mLock) {
1220            mTargetUserId = targetUserId;
1221        }
1222        if (mUserSwitchUiEnabled) {
1223            UserInfo currentUserInfo = getUserInfo(currentUserId);
1224            Pair<UserInfo, UserInfo> userNames = new Pair<>(currentUserInfo, targetUserInfo);
1225            mUiHandler.removeMessages(START_USER_SWITCH_UI_MSG);
1226            mUiHandler.sendMessage(mHandler.obtainMessage(
1227                    START_USER_SWITCH_UI_MSG, userNames));
1228        } else {
1229            mHandler.removeMessages(START_USER_SWITCH_FG_MSG);
1230            mHandler.sendMessage(mHandler.obtainMessage(
1231                    START_USER_SWITCH_FG_MSG, targetUserId, 0));
1232        }
1233        return true;
1234    }
1235
1236    private void showUserSwitchDialog(Pair<UserInfo, UserInfo> fromToUserPair) {
1237        // The dialog will show and then initiate the user switch by calling startUserInForeground
1238        mInjector.showUserSwitchingDialog(fromToUserPair.first, fromToUserPair.second,
1239                getSwitchingFromSystemUserMessage(), getSwitchingToSystemUserMessage());
1240    }
1241
1242    private void dispatchForegroundProfileChanged(int userId) {
1243        final int observerCount = mUserSwitchObservers.beginBroadcast();
1244        for (int i = 0; i < observerCount; i++) {
1245            try {
1246                mUserSwitchObservers.getBroadcastItem(i).onForegroundProfileSwitch(userId);
1247            } catch (RemoteException e) {
1248                // Ignore
1249            }
1250        }
1251        mUserSwitchObservers.finishBroadcast();
1252    }
1253
1254    /** Called on handler thread */
1255    void dispatchUserSwitchComplete(int userId) {
1256        mInjector.getWindowManager().setSwitchingUser(false);
1257        final int observerCount = mUserSwitchObservers.beginBroadcast();
1258        for (int i = 0; i < observerCount; i++) {
1259            try {
1260                mUserSwitchObservers.getBroadcastItem(i).onUserSwitchComplete(userId);
1261            } catch (RemoteException e) {
1262            }
1263        }
1264        mUserSwitchObservers.finishBroadcast();
1265    }
1266
1267    private void dispatchLockedBootComplete(int userId) {
1268        final int observerCount = mUserSwitchObservers.beginBroadcast();
1269        for (int i = 0; i < observerCount; i++) {
1270            try {
1271                mUserSwitchObservers.getBroadcastItem(i).onLockedBootComplete(userId);
1272            } catch (RemoteException e) {
1273                // Ignore
1274            }
1275        }
1276        mUserSwitchObservers.finishBroadcast();
1277    }
1278
1279    private void stopBackgroundUsersIfEnforced(int oldUserId) {
1280        // Never stop system user
1281        if (oldUserId == UserHandle.USER_SYSTEM) {
1282            return;
1283        }
1284        // For now, only check for user restriction. Additional checks can be added here
1285        boolean disallowRunInBg = hasUserRestriction(UserManager.DISALLOW_RUN_IN_BACKGROUND,
1286                oldUserId);
1287        if (!disallowRunInBg) {
1288            return;
1289        }
1290        synchronized (mLock) {
1291            if (DEBUG_MU) Slog.i(TAG, "stopBackgroundUsersIfEnforced stopping " + oldUserId
1292                    + " and related users");
1293            stopUsersLU(oldUserId, false, null);
1294        }
1295    }
1296
1297    private void timeoutUserSwitch(UserState uss, int oldUserId, int newUserId) {
1298        synchronized (mLock) {
1299            Slog.e(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId);
1300            mTimeoutUserSwitchCallbacks = mCurWaitingUserSwitchCallbacks;
1301            mHandler.removeMessages(USER_SWITCH_CALLBACKS_TIMEOUT_MSG);
1302            sendContinueUserSwitchLU(uss, oldUserId, newUserId);
1303            // Report observers that never called back (USER_SWITCH_CALLBACKS_TIMEOUT)
1304            mHandler.sendMessageDelayed(mHandler.obtainMessage(USER_SWITCH_CALLBACKS_TIMEOUT_MSG,
1305                    oldUserId, newUserId), USER_SWITCH_CALLBACKS_TIMEOUT_MS);
1306        }
1307    }
1308
1309    private void timeoutUserSwitchCallbacks(int oldUserId, int newUserId) {
1310        synchronized (mLock) {
1311            if (mTimeoutUserSwitchCallbacks != null && !mTimeoutUserSwitchCallbacks.isEmpty()) {
1312                Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId
1313                        + ". Observers that didn't respond: " + mTimeoutUserSwitchCallbacks);
1314                mTimeoutUserSwitchCallbacks = null;
1315            }
1316        }
1317    }
1318
1319    void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newUserId) {
1320        Slog.d(TAG, "Dispatch onUserSwitching oldUser #" + oldUserId + " newUser #" + newUserId);
1321        final int observerCount = mUserSwitchObservers.beginBroadcast();
1322        if (observerCount > 0) {
1323            final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>();
1324            synchronized (mLock) {
1325                uss.switching = true;
1326                mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks;
1327            }
1328            final AtomicInteger waitingCallbacksCount = new AtomicInteger(observerCount);
1329            final long dispatchStartedTime = SystemClock.elapsedRealtime();
1330            for (int i = 0; i < observerCount; i++) {
1331                try {
1332                    // Prepend with unique prefix to guarantee that keys are unique
1333                    final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i);
1334                    synchronized (mLock) {
1335                        curWaitingUserSwitchCallbacks.add(name);
1336                    }
1337                    final IRemoteCallback callback = new IRemoteCallback.Stub() {
1338                        @Override
1339                        public void sendResult(Bundle data) throws RemoteException {
1340                            synchronized (mLock) {
1341                                long delay = SystemClock.elapsedRealtime() - dispatchStartedTime;
1342                                if (delay > USER_SWITCH_TIMEOUT_MS) {
1343                                    Slog.e(TAG, "User switch timeout: observer "  + name
1344                                            + " sent result after " + delay + " ms");
1345                                }
1346                                curWaitingUserSwitchCallbacks.remove(name);
1347                                // Continue switching if all callbacks have been notified and
1348                                // user switching session is still valid
1349                                if (waitingCallbacksCount.decrementAndGet() == 0
1350                                        && (curWaitingUserSwitchCallbacks
1351                                        == mCurWaitingUserSwitchCallbacks)) {
1352                                    sendContinueUserSwitchLU(uss, oldUserId, newUserId);
1353                                }
1354                            }
1355                        }
1356                    };
1357                    mUserSwitchObservers.getBroadcastItem(i).onUserSwitching(newUserId, callback);
1358                } catch (RemoteException e) {
1359                }
1360            }
1361        } else {
1362            synchronized (mLock) {
1363                sendContinueUserSwitchLU(uss, oldUserId, newUserId);
1364            }
1365        }
1366        mUserSwitchObservers.finishBroadcast();
1367    }
1368
1369    void sendContinueUserSwitchLU(UserState uss, int oldUserId, int newUserId) {
1370        mCurWaitingUserSwitchCallbacks = null;
1371        mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG);
1372        mHandler.sendMessage(mHandler.obtainMessage(CONTINUE_USER_SWITCH_MSG,
1373                oldUserId, newUserId, uss));
1374    }
1375
1376    void continueUserSwitch(UserState uss, int oldUserId, int newUserId) {
1377        Slog.d(TAG, "Continue user switch oldUser #" + oldUserId + ", newUser #" + newUserId);
1378        if (mUserSwitchUiEnabled) {
1379            mInjector.getWindowManager().stopFreezingScreen();
1380        }
1381        uss.switching = false;
1382        mHandler.removeMessages(REPORT_USER_SWITCH_COMPLETE_MSG);
1383        mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_COMPLETE_MSG,
1384                newUserId, 0));
1385        stopGuestOrEphemeralUserIfBackground(oldUserId);
1386        stopBackgroundUsersIfEnforced(oldUserId);
1387    }
1388
1389    private void moveUserToForeground(UserState uss, int oldUserId, int newUserId) {
1390        boolean homeInFront = mInjector.stackSupervisorSwitchUser(newUserId, uss);
1391        if (homeInFront) {
1392            mInjector.startHomeActivity(newUserId, "moveUserToForeground");
1393        } else {
1394            mInjector.stackSupervisorResumeFocusedStackTopActivity();
1395        }
1396        EventLogTags.writeAmSwitchUser(newUserId);
1397        sendUserSwitchBroadcasts(oldUserId, newUserId);
1398    }
1399
1400    void sendUserSwitchBroadcasts(int oldUserId, int newUserId) {
1401        long ident = Binder.clearCallingIdentity();
1402        try {
1403            Intent intent;
1404            if (oldUserId >= 0) {
1405                // Send USER_BACKGROUND broadcast to all profiles of the outgoing user
1406                List<UserInfo> profiles = mInjector.getUserManager().getProfiles(oldUserId, false);
1407                int count = profiles.size();
1408                for (int i = 0; i < count; i++) {
1409                    int profileUserId = profiles.get(i).id;
1410                    intent = new Intent(Intent.ACTION_USER_BACKGROUND);
1411                    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1412                            | Intent.FLAG_RECEIVER_FOREGROUND);
1413                    intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId);
1414                    mInjector.broadcastIntent(intent,
1415                            null, null, 0, null, null, null, AppOpsManager.OP_NONE,
1416                            null, false, false, MY_PID, SYSTEM_UID, profileUserId);
1417                }
1418            }
1419            if (newUserId >= 0) {
1420                // Send USER_FOREGROUND broadcast to all profiles of the incoming user
1421                List<UserInfo> profiles = mInjector.getUserManager().getProfiles(newUserId, false);
1422                int count = profiles.size();
1423                for (int i = 0; i < count; i++) {
1424                    int profileUserId = profiles.get(i).id;
1425                    intent = new Intent(Intent.ACTION_USER_FOREGROUND);
1426                    intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1427                            | Intent.FLAG_RECEIVER_FOREGROUND);
1428                    intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId);
1429                    mInjector.broadcastIntent(intent,
1430                            null, null, 0, null, null, null, AppOpsManager.OP_NONE,
1431                            null, false, false, MY_PID, SYSTEM_UID, profileUserId);
1432                }
1433                intent = new Intent(Intent.ACTION_USER_SWITCHED);
1434                intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1435                        | Intent.FLAG_RECEIVER_FOREGROUND);
1436                intent.putExtra(Intent.EXTRA_USER_HANDLE, newUserId);
1437                mInjector.broadcastIntent(intent,
1438                        null, null, 0, null, null,
1439                        new String[] {android.Manifest.permission.MANAGE_USERS},
1440                        AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
1441                        UserHandle.USER_ALL);
1442            }
1443        } finally {
1444            Binder.restoreCallingIdentity(ident);
1445        }
1446    }
1447
1448
1449    int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll,
1450            int allowMode, String name, String callerPackage) {
1451        final int callingUserId = UserHandle.getUserId(callingUid);
1452        if (callingUserId == userId) {
1453            return userId;
1454        }
1455
1456        // Note that we may be accessing mCurrentUserId outside of a lock...
1457        // shouldn't be a big deal, if this is being called outside
1458        // of a locked context there is intrinsically a race with
1459        // the value the caller will receive and someone else changing it.
1460        // We assume that USER_CURRENT_OR_SELF will use the current user; later
1461        // we will switch to the calling user if access to the current user fails.
1462        int targetUserId = unsafeConvertIncomingUser(userId);
1463
1464        if (callingUid != 0 && callingUid != SYSTEM_UID) {
1465            final boolean allow;
1466            if (mInjector.isCallerRecents(callingUid)
1467                    && callingUserId == getCurrentUserId()
1468                    && isSameProfileGroup(callingUserId, targetUserId)) {
1469                // If the caller is Recents and it is running in the current user, we then allow it
1470                // to access its profiles.
1471                allow = true;
1472            } else if (mInjector.checkComponentPermission(INTERACT_ACROSS_USERS_FULL, callingPid,
1473                    callingUid, -1, true) == PackageManager.PERMISSION_GRANTED) {
1474                // If the caller has this permission, they always pass go.  And collect $200.
1475                allow = true;
1476            } else if (allowMode == ALLOW_FULL_ONLY) {
1477                // We require full access, sucks to be you.
1478                allow = false;
1479            } else if (mInjector.checkComponentPermission(INTERACT_ACROSS_USERS, callingPid,
1480                    callingUid, -1, true) != PackageManager.PERMISSION_GRANTED) {
1481                // If the caller does not have either permission, they are always doomed.
1482                allow = false;
1483            } else if (allowMode == ALLOW_NON_FULL) {
1484                // We are blanket allowing non-full access, you lucky caller!
1485                allow = true;
1486            } else if (allowMode == ALLOW_NON_FULL_IN_PROFILE) {
1487                // We may or may not allow this depending on whether the two users are
1488                // in the same profile.
1489                allow = isSameProfileGroup(callingUserId, targetUserId);
1490            } else {
1491                throw new IllegalArgumentException("Unknown mode: " + allowMode);
1492            }
1493            if (!allow) {
1494                if (userId == UserHandle.USER_CURRENT_OR_SELF) {
1495                    // In this case, they would like to just execute as their
1496                    // owner user instead of failing.
1497                    targetUserId = callingUserId;
1498                } else {
1499                    StringBuilder builder = new StringBuilder(128);
1500                    builder.append("Permission Denial: ");
1501                    builder.append(name);
1502                    if (callerPackage != null) {
1503                        builder.append(" from ");
1504                        builder.append(callerPackage);
1505                    }
1506                    builder.append(" asks to run as user ");
1507                    builder.append(userId);
1508                    builder.append(" but is calling from user ");
1509                    builder.append(UserHandle.getUserId(callingUid));
1510                    builder.append("; this requires ");
1511                    builder.append(INTERACT_ACROSS_USERS_FULL);
1512                    if (allowMode != ALLOW_FULL_ONLY) {
1513                        builder.append(" or ");
1514                        builder.append(INTERACT_ACROSS_USERS);
1515                    }
1516                    String msg = builder.toString();
1517                    Slog.w(TAG, msg);
1518                    throw new SecurityException(msg);
1519                }
1520            }
1521        }
1522        if (!allowAll) {
1523            ensureNotSpecialUser(targetUserId);
1524        }
1525        // Check shell permission
1526        if (callingUid == Process.SHELL_UID && targetUserId >= UserHandle.USER_SYSTEM) {
1527            if (hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, targetUserId)) {
1528                throw new SecurityException("Shell does not have permission to access user "
1529                        + targetUserId + "\n " + Debug.getCallers(3));
1530            }
1531        }
1532        return targetUserId;
1533    }
1534
1535    int unsafeConvertIncomingUser(int userId) {
1536        return (userId == UserHandle.USER_CURRENT || userId == UserHandle.USER_CURRENT_OR_SELF)
1537                ? getCurrentUserId(): userId;
1538    }
1539
1540    void ensureNotSpecialUser(int userId) {
1541        if (userId >= 0) {
1542            return;
1543        }
1544        throw new IllegalArgumentException("Call does not support special user #" + userId);
1545    }
1546
1547    void registerUserSwitchObserver(IUserSwitchObserver observer, String name) {
1548        Preconditions.checkNotNull(name, "Observer name cannot be null");
1549        if (mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
1550                != PackageManager.PERMISSION_GRANTED) {
1551            final String msg = "Permission Denial: registerUserSwitchObserver() from pid="
1552                    + Binder.getCallingPid()
1553                    + ", uid=" + Binder.getCallingUid()
1554                    + " requires " + INTERACT_ACROSS_USERS_FULL;
1555            Slog.w(TAG, msg);
1556            throw new SecurityException(msg);
1557        }
1558        mUserSwitchObservers.register(observer, name);
1559    }
1560
1561    void sendForegroundProfileChanged(int userId) {
1562        mHandler.removeMessages(FOREGROUND_PROFILE_CHANGED_MSG);
1563        mHandler.obtainMessage(FOREGROUND_PROFILE_CHANGED_MSG, userId, 0).sendToTarget();
1564    }
1565
1566    void unregisterUserSwitchObserver(IUserSwitchObserver observer) {
1567        mUserSwitchObservers.unregister(observer);
1568    }
1569
1570    UserState getStartedUserState(int userId) {
1571        synchronized (mLock) {
1572            return mStartedUsers.get(userId);
1573        }
1574    }
1575
1576    boolean hasStartedUserState(int userId) {
1577        return mStartedUsers.get(userId) != null;
1578    }
1579
1580    private void updateStartedUserArrayLU() {
1581        int num = 0;
1582        for (int i = 0; i < mStartedUsers.size(); i++) {
1583            UserState uss = mStartedUsers.valueAt(i);
1584            // This list does not include stopping users.
1585            if (uss.state != UserState.STATE_STOPPING
1586                    && uss.state != UserState.STATE_SHUTDOWN) {
1587                num++;
1588            }
1589        }
1590        mStartedUserArray = new int[num];
1591        num = 0;
1592        for (int i = 0; i < mStartedUsers.size(); i++) {
1593            UserState uss = mStartedUsers.valueAt(i);
1594            if (uss.state != UserState.STATE_STOPPING
1595                    && uss.state != UserState.STATE_SHUTDOWN) {
1596                mStartedUserArray[num++] = mStartedUsers.keyAt(i);
1597            }
1598        }
1599    }
1600
1601    void sendBootCompleted(IIntentReceiver resultTo) {
1602        // Get a copy of mStartedUsers to use outside of lock
1603        SparseArray<UserState> startedUsers;
1604        synchronized (mLock) {
1605            startedUsers = mStartedUsers.clone();
1606        }
1607        for (int i = 0; i < startedUsers.size(); i++) {
1608            UserState uss = startedUsers.valueAt(i);
1609            finishUserBoot(uss, resultTo);
1610        }
1611    }
1612
1613    void onSystemReady() {
1614        updateCurrentProfileIds();
1615        mInjector.reportCurWakefulnessUsageEvent();
1616    }
1617
1618    /**
1619     * Refreshes the list of users related to the current user when either a
1620     * user switch happens or when a new related user is started in the
1621     * background.
1622     */
1623    private void updateCurrentProfileIds() {
1624        final List<UserInfo> profiles = mInjector.getUserManager().getProfiles(getCurrentUserId(),
1625                false /* enabledOnly */);
1626        int[] currentProfileIds = new int[profiles.size()]; // profiles will not be null
1627        for (int i = 0; i < currentProfileIds.length; i++) {
1628            currentProfileIds[i] = profiles.get(i).id;
1629        }
1630        final List<UserInfo> users = mInjector.getUserManager().getUsers(false);
1631        synchronized (mLock) {
1632            mCurrentProfileIds = currentProfileIds;
1633
1634            mUserProfileGroupIds.clear();
1635            for (int i = 0; i < users.size(); i++) {
1636                UserInfo user = users.get(i);
1637                if (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID) {
1638                    mUserProfileGroupIds.put(user.id, user.profileGroupId);
1639                }
1640            }
1641        }
1642    }
1643
1644    int[] getStartedUserArray() {
1645        synchronized (mLock) {
1646            return mStartedUserArray;
1647        }
1648    }
1649
1650    boolean isUserRunning(int userId, int flags) {
1651        UserState state = getStartedUserState(userId);
1652        if (state == null) {
1653            return false;
1654        }
1655        if ((flags & ActivityManager.FLAG_OR_STOPPED) != 0) {
1656            return true;
1657        }
1658        if ((flags & ActivityManager.FLAG_AND_LOCKED) != 0) {
1659            switch (state.state) {
1660                case UserState.STATE_BOOTING:
1661                case UserState.STATE_RUNNING_LOCKED:
1662                    return true;
1663                default:
1664                    return false;
1665            }
1666        }
1667        if ((flags & ActivityManager.FLAG_AND_UNLOCKING_OR_UNLOCKED) != 0) {
1668            switch (state.state) {
1669                case UserState.STATE_RUNNING_UNLOCKING:
1670                case UserState.STATE_RUNNING_UNLOCKED:
1671                    return true;
1672                // In the stopping/shutdown state return unlock state of the user key
1673                case UserState.STATE_STOPPING:
1674                case UserState.STATE_SHUTDOWN:
1675                    return StorageManager.isUserKeyUnlocked(userId);
1676                default:
1677                    return false;
1678            }
1679        }
1680        if ((flags & ActivityManager.FLAG_AND_UNLOCKED) != 0) {
1681            switch (state.state) {
1682                case UserState.STATE_RUNNING_UNLOCKED:
1683                    return true;
1684                // In the stopping/shutdown state return unlock state of the user key
1685                case UserState.STATE_STOPPING:
1686                case UserState.STATE_SHUTDOWN:
1687                    return StorageManager.isUserKeyUnlocked(userId);
1688                default:
1689                    return false;
1690            }
1691        }
1692
1693        return state.state != UserState.STATE_STOPPING && state.state != UserState.STATE_SHUTDOWN;
1694    }
1695
1696    UserInfo getCurrentUser() {
1697        if ((mInjector.checkCallingPermission(INTERACT_ACROSS_USERS)
1698                != PackageManager.PERMISSION_GRANTED) && (
1699                mInjector.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
1700                        != PackageManager.PERMISSION_GRANTED)) {
1701            String msg = "Permission Denial: getCurrentUser() from pid="
1702                    + Binder.getCallingPid()
1703                    + ", uid=" + Binder.getCallingUid()
1704                    + " requires " + INTERACT_ACROSS_USERS;
1705            Slog.w(TAG, msg);
1706            throw new SecurityException(msg);
1707        }
1708
1709        // Optimization - if there is no pending user switch, return current id
1710        if (mTargetUserId == UserHandle.USER_NULL) {
1711            return getUserInfo(mCurrentUserId);
1712        }
1713        synchronized (mLock) {
1714            return getCurrentUserLU();
1715        }
1716    }
1717
1718    UserInfo getCurrentUserLU() {
1719        int userId = mTargetUserId != UserHandle.USER_NULL ? mTargetUserId : mCurrentUserId;
1720        return getUserInfo(userId);
1721    }
1722
1723    int getCurrentOrTargetUserId() {
1724        synchronized (mLock) {
1725            return mTargetUserId != UserHandle.USER_NULL ? mTargetUserId : mCurrentUserId;
1726        }
1727    }
1728
1729    int getCurrentOrTargetUserIdLU() {
1730        return mTargetUserId != UserHandle.USER_NULL ? mTargetUserId : mCurrentUserId;
1731    }
1732
1733
1734    int getCurrentUserIdLU() {
1735        return mCurrentUserId;
1736    }
1737
1738    int getCurrentUserId() {
1739        synchronized (mLock) {
1740            return mCurrentUserId;
1741        }
1742    }
1743
1744    private boolean isCurrentUserLU(int userId) {
1745        return userId == getCurrentOrTargetUserIdLU();
1746    }
1747
1748    int[] getUsers() {
1749        UserManagerService ums = mInjector.getUserManager();
1750        return ums != null ? ums.getUserIds() : new int[] { 0 };
1751    }
1752
1753    UserInfo getUserInfo(int userId) {
1754        return mInjector.getUserManager().getUserInfo(userId);
1755    }
1756
1757    int[] getUserIds() {
1758        return mInjector.getUserManager().getUserIds();
1759    }
1760
1761    /**
1762     * If {@code userId} is {@link UserHandle#USER_ALL}, then return an array with all running user
1763     * IDs. Otherwise return an array whose only element is the given user id.
1764     *
1765     * It doesn't handle other special user IDs such as {@link UserHandle#USER_CURRENT}.
1766     */
1767    int[] expandUserId(int userId) {
1768        if (userId != UserHandle.USER_ALL) {
1769            return new int[] {userId};
1770        } else {
1771            return getUsers();
1772        }
1773    }
1774
1775    boolean exists(int userId) {
1776        return mInjector.getUserManager().exists(userId);
1777    }
1778
1779    void enforceShellRestriction(String restriction, int userHandle) {
1780        if (Binder.getCallingUid() == SHELL_UID) {
1781            if (userHandle < 0 || hasUserRestriction(restriction, userHandle)) {
1782                throw new SecurityException("Shell does not have permission to access user "
1783                        + userHandle);
1784            }
1785        }
1786    }
1787
1788    boolean hasUserRestriction(String restriction, int userId) {
1789        return mInjector.getUserManager().hasUserRestriction(restriction, userId);
1790    }
1791
1792    Set<Integer> getProfileIds(int userId) {
1793        Set<Integer> userIds = new HashSet<>();
1794        final List<UserInfo> profiles = mInjector.getUserManager().getProfiles(userId,
1795                false /* enabledOnly */);
1796        for (UserInfo user : profiles) {
1797            userIds.add(user.id);
1798        }
1799        return userIds;
1800    }
1801
1802    boolean isSameProfileGroup(int callingUserId, int targetUserId) {
1803        if (callingUserId == targetUserId) {
1804            return true;
1805        }
1806        synchronized (mLock) {
1807            int callingProfile = mUserProfileGroupIds.get(callingUserId,
1808                    UserInfo.NO_PROFILE_GROUP_ID);
1809            int targetProfile = mUserProfileGroupIds.get(targetUserId,
1810                    UserInfo.NO_PROFILE_GROUP_ID);
1811            return callingProfile != UserInfo.NO_PROFILE_GROUP_ID
1812                    && callingProfile == targetProfile;
1813        }
1814    }
1815
1816    boolean isUserOrItsParentRunning(int userId) {
1817        synchronized (mLock) {
1818            if (isUserRunning(userId, 0)) {
1819                return true;
1820            }
1821            final int parentUserId = mUserProfileGroupIds.get(userId, UserInfo.NO_PROFILE_GROUP_ID);
1822            if (parentUserId == UserInfo.NO_PROFILE_GROUP_ID) {
1823                return false;
1824            }
1825            return isUserRunning(parentUserId, 0);
1826        }
1827    }
1828
1829    boolean isCurrentProfile(int userId) {
1830        synchronized (mLock) {
1831            return ArrayUtils.contains(mCurrentProfileIds, userId);
1832        }
1833    }
1834
1835    int[] getCurrentProfileIds() {
1836        synchronized (mLock) {
1837            return mCurrentProfileIds;
1838        }
1839    }
1840
1841    void onUserRemoved(int userId) {
1842        synchronized (mLock) {
1843            int size = mUserProfileGroupIds.size();
1844            for (int i = size - 1; i >= 0; i--) {
1845                if (mUserProfileGroupIds.keyAt(i) == userId
1846                        || mUserProfileGroupIds.valueAt(i) == userId) {
1847                    mUserProfileGroupIds.removeAt(i);
1848
1849                }
1850            }
1851            mCurrentProfileIds = ArrayUtils.removeInt(mCurrentProfileIds, userId);
1852        }
1853    }
1854
1855    /**
1856     * Returns whether the given user requires credential entry at this time. This is used to
1857     * intercept activity launches for work apps when the Work Challenge is present.
1858     */
1859    protected boolean shouldConfirmCredentials(int userId) {
1860        synchronized (mLock) {
1861            if (mStartedUsers.get(userId) == null) {
1862                return false;
1863            }
1864        }
1865        if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
1866            return false;
1867        }
1868        final KeyguardManager km = mInjector.getKeyguardManager();
1869        return km.isDeviceLocked(userId) && km.isDeviceSecure(userId);
1870    }
1871
1872    boolean isLockScreenDisabled(@UserIdInt int userId) {
1873        return mLockPatternUtils.isLockScreenDisabled(userId);
1874    }
1875
1876    void setSwitchingFromSystemUserMessage(String switchingFromSystemUserMessage) {
1877        synchronized (mLock) {
1878            mSwitchingFromSystemUserMessage = switchingFromSystemUserMessage;
1879        }
1880    }
1881
1882    void setSwitchingToSystemUserMessage(String switchingToSystemUserMessage) {
1883        synchronized (mLock) {
1884            mSwitchingToSystemUserMessage = switchingToSystemUserMessage;
1885        }
1886    }
1887
1888    private String getSwitchingFromSystemUserMessage() {
1889        synchronized (mLock) {
1890            return mSwitchingFromSystemUserMessage;
1891        }
1892    }
1893
1894    private String getSwitchingToSystemUserMessage() {
1895        synchronized (mLock) {
1896            return mSwitchingToSystemUserMessage;
1897        }
1898    }
1899
1900    void writeToProto(ProtoOutputStream proto, long fieldId) {
1901        synchronized (mLock) {
1902            long token = proto.start(fieldId);
1903            for (int i = 0; i < mStartedUsers.size(); i++) {
1904                UserState uss = mStartedUsers.valueAt(i);
1905                final long uToken = proto.start(UserControllerProto.STARTED_USERS);
1906                proto.write(UserControllerProto.User.ID, uss.mHandle.getIdentifier());
1907                uss.writeToProto(proto, UserControllerProto.User.STATE);
1908                proto.end(uToken);
1909            }
1910            for (int i = 0; i < mStartedUserArray.length; i++) {
1911                proto.write(UserControllerProto.STARTED_USER_ARRAY, mStartedUserArray[i]);
1912            }
1913            for (int i = 0; i < mUserLru.size(); i++) {
1914                proto.write(UserControllerProto.USER_LRU, mUserLru.get(i));
1915            }
1916            if (mUserProfileGroupIds.size() > 0) {
1917                for (int i = 0; i < mUserProfileGroupIds.size(); i++) {
1918                    final long uToken = proto.start(UserControllerProto.USER_PROFILE_GROUP_IDS);
1919                    proto.write(UserControllerProto.UserProfile.USER,
1920                            mUserProfileGroupIds.keyAt(i));
1921                    proto.write(UserControllerProto.UserProfile.PROFILE,
1922                            mUserProfileGroupIds.valueAt(i));
1923                    proto.end(uToken);
1924                }
1925            }
1926            proto.end(token);
1927        }
1928    }
1929
1930    void dump(PrintWriter pw, boolean dumpAll) {
1931        synchronized (mLock) {
1932            pw.println("  mStartedUsers:");
1933            for (int i = 0; i < mStartedUsers.size(); i++) {
1934                UserState uss = mStartedUsers.valueAt(i);
1935                pw.print("    User #");
1936                pw.print(uss.mHandle.getIdentifier());
1937                pw.print(": ");
1938                uss.dump("", pw);
1939            }
1940            pw.print("  mStartedUserArray: [");
1941            for (int i = 0; i < mStartedUserArray.length; i++) {
1942                if (i > 0)
1943                    pw.print(", ");
1944                pw.print(mStartedUserArray[i]);
1945            }
1946            pw.println("]");
1947            pw.print("  mUserLru: [");
1948            for (int i = 0; i < mUserLru.size(); i++) {
1949                if (i > 0)
1950                    pw.print(", ");
1951                pw.print(mUserLru.get(i));
1952            }
1953            pw.println("]");
1954            if (mUserProfileGroupIds.size() > 0) {
1955                pw.println("  mUserProfileGroupIds:");
1956                for (int i=0; i< mUserProfileGroupIds.size(); i++) {
1957                    pw.print("    User #");
1958                    pw.print(mUserProfileGroupIds.keyAt(i));
1959                    pw.print(" -> profile #");
1960                    pw.println(mUserProfileGroupIds.valueAt(i));
1961                }
1962            }
1963        }
1964    }
1965
1966    public boolean handleMessage(Message msg) {
1967        switch (msg.what) {
1968            case START_USER_SWITCH_FG_MSG:
1969                startUserInForeground(msg.arg1);
1970                break;
1971            case REPORT_USER_SWITCH_MSG:
1972                dispatchUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2);
1973                break;
1974            case CONTINUE_USER_SWITCH_MSG:
1975                continueUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2);
1976                break;
1977            case USER_SWITCH_TIMEOUT_MSG:
1978                timeoutUserSwitch((UserState) msg.obj, msg.arg1, msg.arg2);
1979                break;
1980            case USER_SWITCH_CALLBACKS_TIMEOUT_MSG:
1981                timeoutUserSwitchCallbacks(msg.arg1, msg.arg2);
1982                break;
1983            case START_PROFILES_MSG:
1984                startProfiles();
1985                break;
1986            case SYSTEM_USER_START_MSG:
1987                mInjector.batteryStatsServiceNoteEvent(
1988                        BatteryStats.HistoryItem.EVENT_USER_RUNNING_START,
1989                        Integer.toString(msg.arg1), msg.arg1);
1990                mInjector.getSystemServiceManager().startUser(msg.arg1);
1991                break;
1992            case SYSTEM_USER_UNLOCK_MSG:
1993                final int userId = msg.arg1;
1994                mInjector.getSystemServiceManager().unlockUser(userId);
1995                // Loads recents on a worker thread that allows disk I/O
1996                FgThread.getHandler().post(() -> {
1997                    mInjector.loadUserRecents(userId);
1998                });
1999                finishUserUnlocked((UserState) msg.obj);
2000                break;
2001            case SYSTEM_USER_CURRENT_MSG:
2002                mInjector.batteryStatsServiceNoteEvent(
2003                        BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_FINISH,
2004                        Integer.toString(msg.arg2), msg.arg2);
2005                mInjector.batteryStatsServiceNoteEvent(
2006                        BatteryStats.HistoryItem.EVENT_USER_FOREGROUND_START,
2007                        Integer.toString(msg.arg1), msg.arg1);
2008
2009                mInjector.getSystemServiceManager().switchUser(msg.arg1);
2010                break;
2011            case FOREGROUND_PROFILE_CHANGED_MSG:
2012                dispatchForegroundProfileChanged(msg.arg1);
2013                break;
2014            case REPORT_USER_SWITCH_COMPLETE_MSG:
2015                dispatchUserSwitchComplete(msg.arg1);
2016                break;
2017            case REPORT_LOCKED_BOOT_COMPLETE_MSG:
2018                dispatchLockedBootComplete(msg.arg1);
2019                break;
2020            case START_USER_SWITCH_UI_MSG:
2021                showUserSwitchDialog((Pair<UserInfo, UserInfo>) msg.obj);
2022                break;
2023        }
2024        return false;
2025    }
2026
2027    private static class UserProgressListener extends IProgressListener.Stub {
2028        private volatile long mUnlockStarted;
2029        @Override
2030        public void onStarted(int id, Bundle extras) throws RemoteException {
2031            Slog.d(TAG, "Started unlocking user " + id);
2032            mUnlockStarted = SystemClock.uptimeMillis();
2033        }
2034
2035        @Override
2036        public void onProgress(int id, int progress, Bundle extras) throws RemoteException {
2037            Slog.d(TAG, "Unlocking user " + id + " progress " + progress);
2038        }
2039
2040        @Override
2041        public void onFinished(int id, Bundle extras) throws RemoteException {
2042            long unlockTime = SystemClock.uptimeMillis() - mUnlockStarted;
2043
2044            // Report system user unlock time to perf dashboard
2045            if (id == UserHandle.USER_SYSTEM) {
2046                new TimingsTraceLog("SystemServerTiming", Trace.TRACE_TAG_SYSTEM_SERVER)
2047                        .logDuration("SystemUserUnlock", unlockTime);
2048            } else {
2049                Slog.d(TAG, "Unlocking user " + id + " took " + unlockTime + " ms");
2050            }
2051        }
2052    };
2053
2054    @VisibleForTesting
2055    static class Injector {
2056        private final ActivityManagerService mService;
2057        private UserManagerService mUserManager;
2058        private UserManagerInternal mUserManagerInternal;
2059
2060        Injector(ActivityManagerService service) {
2061            mService = service;
2062        }
2063
2064        protected Handler getHandler(Handler.Callback callback) {
2065            return new Handler(mService.mHandlerThread.getLooper(), callback);
2066        }
2067
2068        protected Handler getUiHandler(Handler.Callback callback) {
2069            return new Handler(mService.mUiHandler.getLooper(), callback);
2070        }
2071
2072        protected Context getContext() {
2073            return mService.mContext;
2074        }
2075
2076        protected LockPatternUtils getLockPatternUtils() {
2077            return new LockPatternUtils(getContext());
2078        }
2079
2080        protected int broadcastIntent(Intent intent, String resolvedType,
2081                IIntentReceiver resultTo, int resultCode, String resultData,
2082                Bundle resultExtras, String[] requiredPermissions, int appOp, Bundle bOptions,
2083                boolean ordered, boolean sticky, int callingPid, int callingUid, int userId) {
2084            // TODO b/64165549 Verify that mLock is not held before calling AMS methods
2085            synchronized (mService) {
2086                return mService.broadcastIntentLocked(null, null, intent, resolvedType, resultTo,
2087                        resultCode, resultData, resultExtras, requiredPermissions, appOp, bOptions,
2088                        ordered, sticky, callingPid, callingUid, userId);
2089            }
2090        }
2091
2092        int checkCallingPermission(String permission) {
2093            return mService.checkCallingPermission(permission);
2094        }
2095
2096        WindowManagerService getWindowManager() {
2097            return mService.mWindowManager;
2098        }
2099        void activityManagerOnUserStopped(int userId) {
2100            synchronized (mService) {
2101                mService.onUserStoppedLocked(userId);
2102            }
2103        }
2104
2105        void systemServiceManagerCleanupUser(int userId) {
2106            mService.mSystemServiceManager.cleanupUser(userId);
2107        }
2108
2109        protected UserManagerService getUserManager() {
2110            if (mUserManager == null) {
2111                IBinder b = ServiceManager.getService(Context.USER_SERVICE);
2112                mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
2113            }
2114            return mUserManager;
2115        }
2116
2117        UserManagerInternal getUserManagerInternal() {
2118            if (mUserManagerInternal == null) {
2119                mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
2120            }
2121            return mUserManagerInternal;
2122        }
2123
2124        KeyguardManager getKeyguardManager() {
2125            return mService.mContext.getSystemService(KeyguardManager.class);
2126        }
2127
2128        void batteryStatsServiceNoteEvent(int code, String name, int uid) {
2129            mService.mBatteryStatsService.noteEvent(code, name, uid);
2130        }
2131
2132        boolean isRuntimeRestarted() {
2133            return mService.mSystemServiceManager.isRuntimeRestarted();
2134        }
2135
2136        SystemServiceManager getSystemServiceManager() {
2137            return mService.mSystemServiceManager;
2138        }
2139
2140        boolean isFirstBootOrUpgrade() {
2141            IPackageManager pm = AppGlobals.getPackageManager();
2142            try {
2143                return pm.isFirstBoot() || pm.isUpgrade();
2144            } catch (RemoteException e) {
2145                throw e.rethrowFromSystemServer();
2146            }
2147        }
2148
2149        void sendPreBootBroadcast(int userId, boolean quiet, final Runnable onFinish) {
2150            new PreBootBroadcaster(mService, userId, null, quiet) {
2151                @Override
2152                public void onFinished() {
2153                    onFinish.run();
2154                }
2155            }.sendNext();
2156        }
2157
2158        void activityManagerForceStopPackage(int userId, String reason) {
2159            synchronized (mService) {
2160                mService.forceStopPackageLocked(null, -1, false, false, true, false, false,
2161                        userId, reason);
2162            }
2163        };
2164
2165        int checkComponentPermission(String permission, int pid, int uid, int owningUid,
2166                boolean exported) {
2167            return mService.checkComponentPermission(permission, pid, uid, owningUid, exported);
2168        }
2169
2170        protected void startHomeActivity(int userId, String reason) {
2171            synchronized (mService) {
2172                mService.startHomeActivityLocked(userId, reason);
2173            }
2174        }
2175
2176        void updateUserConfiguration() {
2177            synchronized (mService) {
2178                mService.updateUserConfigurationLocked();
2179            }
2180        }
2181
2182        void clearBroadcastQueueForUser(int userId) {
2183            synchronized (mService) {
2184                mService.clearBroadcastQueueForUserLocked(userId);
2185            }
2186        }
2187
2188        void loadUserRecents(int userId) {
2189            synchronized (mService) {
2190                mService.getRecentTasks().loadUserRecentsLocked(userId);
2191            }
2192        }
2193
2194        void startPersistentApps(int matchFlags) {
2195            mService.startPersistentApps(matchFlags);
2196        }
2197
2198        void installEncryptionUnawareProviders(int userId) {
2199            mService.installEncryptionUnawareProviders(userId);
2200        }
2201
2202        void showUserSwitchingDialog(UserInfo fromUser, UserInfo toUser,
2203                String switchingFromSystemUserMessage, String switchingToSystemUserMessage) {
2204            Dialog d;
2205            if (!mService.mContext.getPackageManager()
2206                    .hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
2207                d = new UserSwitchingDialog(mService, mService.mContext, fromUser, toUser,
2208                    true /* above system */, switchingFromSystemUserMessage,
2209                    switchingToSystemUserMessage);
2210            } else {
2211                d = new CarUserSwitchingDialog(mService, mService.mContext, fromUser, toUser,
2212                    true /* above system */, switchingFromSystemUserMessage,
2213                    switchingToSystemUserMessage);
2214            }
2215
2216            d.show();
2217        }
2218
2219        void reportGlobalUsageEventLocked(int event) {
2220            synchronized (mService) {
2221                mService.reportGlobalUsageEventLocked(event);
2222            }
2223        }
2224
2225        void reportCurWakefulnessUsageEvent() {
2226            synchronized (mService) {
2227                mService.reportCurWakefulnessUsageEventLocked();
2228            }
2229        }
2230
2231        void stackSupervisorRemoveUser(int userId) {
2232            synchronized (mService) {
2233                mService.mStackSupervisor.removeUserLocked(userId);
2234            }
2235        }
2236
2237        protected boolean stackSupervisorSwitchUser(int userId, UserState uss) {
2238            synchronized (mService) {
2239                return mService.mStackSupervisor.switchUserLocked(userId, uss);
2240            }
2241        }
2242
2243        protected void stackSupervisorResumeFocusedStackTopActivity() {
2244            synchronized (mService) {
2245                mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
2246            }
2247        }
2248
2249        protected void clearAllLockedTasks(String reason) {
2250            synchronized (mService) {
2251                mService.getLockTaskController().clearLockedTasks(reason);
2252            }
2253        }
2254
2255        protected boolean isCallerRecents(int callingUid) {
2256            return mService.getRecentTasks().isCallerRecents(callingUid);
2257        }
2258    }
2259}
2260