OSDN Git Service

DO NOT MERGE. Grant MMS Uri permissions as the calling UID.
[android-x86/frameworks-base.git] / services / core / java / com / android / server / am / UserController.java
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
17 package com.android.server.am;
18
19 import static android.Manifest.permission.INTERACT_ACROSS_USERS;
20 import static android.Manifest.permission.INTERACT_ACROSS_USERS_FULL;
21 import static android.app.ActivityManager.USER_OP_ERROR_IS_SYSTEM;
22 import static android.app.ActivityManager.USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
23 import static android.app.ActivityManager.USER_OP_IS_CURRENT;
24 import static android.app.ActivityManager.USER_OP_SUCCESS;
25 import static android.content.Context.KEYGUARD_SERVICE;
26 import static android.os.Process.SYSTEM_UID;
27
28 import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_MU;
29 import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
30 import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
31 import static com.android.server.am.ActivityManagerService.ALLOW_FULL_ONLY;
32 import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL;
33 import static com.android.server.am.ActivityManagerService.ALLOW_NON_FULL_IN_PROFILE;
34 import static com.android.server.am.ActivityManagerService.MY_PID;
35 import static com.android.server.am.ActivityManagerService.REPORT_USER_SWITCH_COMPLETE_MSG;
36 import static com.android.server.am.ActivityManagerService.REPORT_USER_SWITCH_MSG;
37 import static com.android.server.am.ActivityManagerService.SYSTEM_USER_CURRENT_MSG;
38 import static com.android.server.am.ActivityManagerService.SYSTEM_USER_START_MSG;
39 import static com.android.server.am.ActivityManagerService.SYSTEM_USER_UNLOCK_MSG;
40 import static com.android.server.am.ActivityManagerService.USER_SWITCH_TIMEOUT_MSG;
41 import static com.android.server.am.UserState.STATE_BOOTING;
42 import static com.android.server.am.UserState.STATE_RUNNING_LOCKED;
43 import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKED;
44 import static com.android.server.am.UserState.STATE_RUNNING_UNLOCKING;
45
46 import android.annotation.NonNull;
47 import android.annotation.UserIdInt;
48 import android.app.ActivityManager;
49 import android.app.AppOpsManager;
50 import android.app.Dialog;
51 import android.app.IStopUserCallback;
52 import android.app.IUserSwitchObserver;
53 import android.app.KeyguardManager;
54 import android.content.Context;
55 import android.content.IIntentReceiver;
56 import android.content.Intent;
57 import android.content.pm.PackageManager;
58 import android.content.pm.UserInfo;
59 import android.os.BatteryStats;
60 import android.os.Binder;
61 import android.os.Build;
62 import android.os.Bundle;
63 import android.os.Debug;
64 import android.os.Handler;
65 import android.os.IBinder;
66 import android.os.IProgressListener;
67 import android.os.IRemoteCallback;
68 import android.os.IUserManager;
69 import android.os.Process;
70 import android.os.RemoteCallbackList;
71 import android.os.RemoteException;
72 import android.os.ServiceManager;
73 import android.os.SystemClock;
74 import android.os.UserHandle;
75 import android.os.UserManager;
76 import android.os.UserManagerInternal;
77 import android.os.storage.IMountService;
78 import android.os.storage.StorageManager;
79 import android.util.ArraySet;
80 import android.util.IntArray;
81 import android.util.Pair;
82 import android.util.Slog;
83 import android.util.SparseArray;
84 import android.util.SparseIntArray;
85
86 import com.android.internal.R;
87 import com.android.internal.annotations.GuardedBy;
88 import com.android.internal.logging.MetricsLogger;
89 import com.android.internal.util.ArrayUtils;
90 import com.android.internal.util.Preconditions;
91 import com.android.internal.widget.LockPatternUtils;
92 import com.android.server.LocalServices;
93 import com.android.server.pm.UserManagerService;
94
95 import java.io.PrintWriter;
96 import java.util.ArrayList;
97 import java.util.Arrays;
98 import java.util.HashSet;
99 import java.util.List;
100 import java.util.Objects;
101 import java.util.Set;
102 import java.util.concurrent.atomic.AtomicInteger;
103
104 /**
105  * Helper class for {@link ActivityManagerService} responsible for multi-user functionality.
106  */
107 final class UserController {
108     private static final String TAG = TAG_WITH_CLASS_NAME ? "UserController" : TAG_AM;
109
110     // Maximum number of users we allow to be running at a time.
111     static final int MAX_RUNNING_USERS = 3;
112
113     // Amount of time we wait for observers to handle a user switch before
114     // giving up on them and unfreezing the screen.
115     static final int USER_SWITCH_TIMEOUT = 2 * 1000;
116
117     private final ActivityManagerService mService;
118     private final Handler mHandler;
119
120     // Holds the current foreground user's id
121     private int mCurrentUserId = UserHandle.USER_SYSTEM;
122     // Holds the target user's id during a user switch
123     private int mTargetUserId = UserHandle.USER_NULL;
124
125     /**
126      * Which users have been started, so are allowed to run code.
127      */
128     @GuardedBy("mService")
129     private final SparseArray<UserState> mStartedUsers = new SparseArray<>();
130
131     /**
132      * LRU list of history of current users.  Most recently current is at the end.
133      */
134     private final ArrayList<Integer> mUserLru = new ArrayList<>();
135
136     /**
137      * Constant array of the users that are currently started.
138      */
139     private int[] mStartedUserArray = new int[] { 0 };
140
141     // If there are multiple profiles for the current user, their ids are here
142     // Currently only the primary user can have managed profiles
143     private int[] mCurrentProfileIds = new int[] {};
144
145     /**
146      * Mapping from each known user ID to the profile group ID it is associated with.
147      */
148     private final SparseIntArray mUserProfileGroupIdsSelfLocked = new SparseIntArray();
149
150     /**
151      * Registered observers of the user switching mechanics.
152      */
153     private final RemoteCallbackList<IUserSwitchObserver> mUserSwitchObservers
154             = new RemoteCallbackList<>();
155
156     /**
157      * Currently active user switch callbacks.
158      */
159     private volatile ArraySet<String> mCurWaitingUserSwitchCallbacks;
160
161     private volatile UserManagerService mUserManager;
162
163     private final LockPatternUtils mLockPatternUtils;
164
165     private UserManagerInternal mUserManagerInternal;
166
167     UserController(ActivityManagerService service) {
168         mService = service;
169         mHandler = mService.mHandler;
170         // User 0 is the first and only user that runs at boot.
171         final UserState uss = new UserState(UserHandle.SYSTEM);
172         mStartedUsers.put(UserHandle.USER_SYSTEM, uss);
173         mUserLru.add(UserHandle.USER_SYSTEM);
174         mLockPatternUtils = new LockPatternUtils(mService.mContext);
175         updateStartedUserArrayLocked();
176     }
177
178     void finishUserSwitch(UserState uss) {
179         synchronized (mService) {
180             finishUserBoot(uss);
181
182             startProfilesLocked();
183             stopRunningUsersLocked(MAX_RUNNING_USERS);
184         }
185     }
186
187     void stopRunningUsersLocked(int maxRunningUsers) {
188         int num = mUserLru.size();
189         int i = 0;
190         while (num > maxRunningUsers && i < mUserLru.size()) {
191             Integer oldUserId = mUserLru.get(i);
192             UserState oldUss = mStartedUsers.get(oldUserId);
193             if (oldUss == null) {
194                 // Shouldn't happen, but be sane if it does.
195                 mUserLru.remove(i);
196                 num--;
197                 continue;
198             }
199             if (oldUss.state == UserState.STATE_STOPPING
200                     || oldUss.state == UserState.STATE_SHUTDOWN) {
201                 // This user is already stopping, doesn't count.
202                 num--;
203                 i++;
204                 continue;
205             }
206             if (oldUserId == UserHandle.USER_SYSTEM || oldUserId == mCurrentUserId) {
207                 // Owner/System user and current user can't be stopped. We count it as running
208                 // when it is not a pure system user.
209                 if (UserInfo.isSystemOnly(oldUserId)) {
210                     num--;
211                 }
212                 i++;
213                 continue;
214             }
215             // This is a user to be stopped.
216             if (stopUsersLocked(oldUserId, false, null) != USER_OP_SUCCESS) {
217                 num--;
218             }
219             num--;
220             i++;
221         }
222     }
223
224     private void finishUserBoot(UserState uss) {
225         finishUserBoot(uss, null);
226     }
227
228     private void finishUserBoot(UserState uss, IIntentReceiver resultTo) {
229         final int userId = uss.mHandle.getIdentifier();
230
231         Slog.d(TAG, "Finishing user boot " + userId);
232         synchronized (mService) {
233             // Bail if we ended up with a stale user
234             if (mStartedUsers.get(userId) != uss) return;
235
236             // We always walk through all the user lifecycle states to send
237             // consistent developer events. We step into RUNNING_LOCKED here,
238             // but we might immediately step into RUNNING below if the user
239             // storage is already unlocked.
240             if (uss.setState(STATE_BOOTING, STATE_RUNNING_LOCKED)) {
241                 getUserManagerInternal().setUserState(userId, uss.state);
242
243                 int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
244                 MetricsLogger.histogram(mService.mContext, "framework_locked_boot_completed",
245                     uptimeSeconds);
246
247                 Intent intent = new Intent(Intent.ACTION_LOCKED_BOOT_COMPLETED, null);
248                 intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
249                 intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
250                         | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
251                 mService.broadcastIntentLocked(null, null, intent, null, resultTo, 0, null, null,
252                         new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED },
253                         AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
254             }
255
256             // We need to delay unlocking managed profiles until the parent user
257             // is also unlocked.
258             if (getUserManager().isManagedProfile(userId)) {
259                 final UserInfo parent = getUserManager().getProfileParent(userId);
260                 if (parent != null
261                         && isUserRunningLocked(parent.id, ActivityManager.FLAG_AND_UNLOCKED)) {
262                     Slog.d(TAG, "User " + userId + " (parent " + parent.id
263                             + "): attempting unlock because parent is unlocked");
264                     maybeUnlockUser(userId);
265                 } else {
266                     String parentId = (parent == null) ? "<null>" : String.valueOf(parent.id);
267                     Slog.d(TAG, "User " + userId + " (parent " + parentId
268                             + "): delaying unlock because parent is locked");
269                 }
270             } else {
271                 maybeUnlockUser(userId);
272             }
273         }
274     }
275
276     /**
277      * Step from {@link UserState#STATE_RUNNING_LOCKED} to
278      * {@link UserState#STATE_RUNNING_UNLOCKING}.
279      */
280     private void finishUserUnlocking(final UserState uss) {
281         final int userId = uss.mHandle.getIdentifier();
282         boolean proceedWithUnlock = false;
283         synchronized (mService) {
284             // Bail if we ended up with a stale user
285             if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
286
287             // Only keep marching forward if user is actually unlocked
288             if (!StorageManager.isUserKeyUnlocked(userId)) return;
289
290             if (uss.setState(STATE_RUNNING_LOCKED, STATE_RUNNING_UNLOCKING)) {
291                 getUserManagerInternal().setUserState(userId, uss.state);
292                 proceedWithUnlock = true;
293             }
294         }
295
296         if (proceedWithUnlock) {
297             uss.mUnlockProgress.start();
298
299             // Prepare app storage before we go any further
300             uss.mUnlockProgress.setProgress(5,
301                     mService.mContext.getString(R.string.android_start_title));
302             mUserManager.onBeforeUnlockUser(userId);
303             uss.mUnlockProgress.setProgress(20);
304
305             // Dispatch unlocked to system services; when fully dispatched,
306             // that calls through to the next "unlocked" phase
307             mHandler.obtainMessage(SYSTEM_USER_UNLOCK_MSG, userId, 0, uss)
308                     .sendToTarget();
309         }
310     }
311
312     /**
313      * Step from {@link UserState#STATE_RUNNING_UNLOCKING} to
314      * {@link UserState#STATE_RUNNING_UNLOCKED}.
315      */
316     void finishUserUnlocked(final UserState uss) {
317         final int userId = uss.mHandle.getIdentifier();
318         synchronized (mService) {
319             // Bail if we ended up with a stale user
320             if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
321
322             // Only keep marching forward if user is actually unlocked
323             if (!StorageManager.isUserKeyUnlocked(userId)) return;
324
325             if (uss.setState(STATE_RUNNING_UNLOCKING, STATE_RUNNING_UNLOCKED)) {
326                 getUserManagerInternal().setUserState(userId, uss.state);
327                 uss.mUnlockProgress.finish();
328
329                 // Dispatch unlocked to external apps
330                 final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED);
331                 unlockedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
332                 unlockedIntent.addFlags(
333                         Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND);
334                 mService.broadcastIntentLocked(null, null, unlockedIntent, null, null, 0, null,
335                         null, null, AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
336                         userId);
337
338                 if (getUserInfo(userId).isManagedProfile()) {
339                     UserInfo parent = getUserManager().getProfileParent(userId);
340                     if (parent != null) {
341                         final Intent profileUnlockedIntent = new Intent(
342                                 Intent.ACTION_MANAGED_PROFILE_UNLOCKED);
343                         profileUnlockedIntent.putExtra(Intent.EXTRA_USER, UserHandle.of(userId));
344                         profileUnlockedIntent.addFlags(
345                                 Intent.FLAG_RECEIVER_REGISTERED_ONLY
346                                 | Intent.FLAG_RECEIVER_FOREGROUND);
347                         mService.broadcastIntentLocked(null, null, profileUnlockedIntent,
348                                 null, null, 0, null, null, null, AppOpsManager.OP_NONE,
349                                 null, false, false, MY_PID, SYSTEM_UID,
350                                 parent.id);
351                     }
352                 }
353
354                 // Send PRE_BOOT broadcasts if user fingerprint changed; we
355                 // purposefully block sending BOOT_COMPLETED until after all
356                 // PRE_BOOT receivers are finished to avoid ANR'ing apps
357                 final UserInfo info = getUserInfo(userId);
358                 if (!Objects.equals(info.lastLoggedInFingerprint, Build.FINGERPRINT)) {
359                     // Suppress double notifications for managed profiles that
360                     // were unlocked automatically as part of their parent user
361                     // being unlocked.
362                     final boolean quiet;
363                     if (info.isManagedProfile()) {
364                         quiet = !uss.tokenProvided
365                                 || !mLockPatternUtils.isSeparateProfileChallengeEnabled(userId);
366                     } else {
367                         quiet = false;
368                     }
369                     new PreBootBroadcaster(mService, userId, null, quiet) {
370                         @Override
371                         public void onFinished() {
372                             finishUserUnlockedCompleted(uss);
373                         }
374                     }.sendNext();
375                 } else {
376                     finishUserUnlockedCompleted(uss);
377                 }
378             }
379         }
380     }
381
382     private void finishUserUnlockedCompleted(UserState uss) {
383         final int userId = uss.mHandle.getIdentifier();
384         synchronized (mService) {
385             // Bail if we ended up with a stale user
386             if (mStartedUsers.get(uss.mHandle.getIdentifier()) != uss) return;
387             final UserInfo userInfo = getUserInfo(userId);
388             if (userInfo == null) {
389                 return;
390             }
391
392             // Only keep marching forward if user is actually unlocked
393             if (!StorageManager.isUserKeyUnlocked(userId)) return;
394
395             // Remember that we logged in
396             mUserManager.onUserLoggedIn(userId);
397
398             if (!userInfo.isInitialized()) {
399                 if (userId != UserHandle.USER_SYSTEM) {
400                     Slog.d(TAG, "Initializing user #" + userId);
401                     Intent intent = new Intent(Intent.ACTION_USER_INITIALIZE);
402                     intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
403                     mService.broadcastIntentLocked(null, null, intent, null,
404                             new IIntentReceiver.Stub() {
405                                 @Override
406                                 public void performReceive(Intent intent, int resultCode,
407                                         String data, Bundle extras, boolean ordered,
408                                         boolean sticky, int sendingUser) {
409                                     // Note: performReceive is called with mService lock held
410                                     getUserManager().makeInitialized(userInfo.id);
411                                 }
412                             }, 0, null, null, null, AppOpsManager.OP_NONE,
413                             null, true, false, MY_PID, SYSTEM_UID, userId);
414                 }
415             }
416
417             Slog.d(TAG, "Sending BOOT_COMPLETE user #" + userId);
418             int uptimeSeconds = (int)(SystemClock.elapsedRealtime() / 1000);
419             MetricsLogger.histogram(mService.mContext, "framework_boot_completed", uptimeSeconds);
420             final Intent bootIntent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
421             bootIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
422             bootIntent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT
423                     | Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
424             mService.broadcastIntentLocked(null, null, bootIntent, null, null, 0, null, null,
425                     new String[] { android.Manifest.permission.RECEIVE_BOOT_COMPLETED },
426                     AppOpsManager.OP_NONE, null, true, false, MY_PID, SYSTEM_UID, userId);
427         }
428     }
429
430     int stopUser(final int userId, final boolean force, final IStopUserCallback callback) {
431         if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
432                 != PackageManager.PERMISSION_GRANTED) {
433             String msg = "Permission Denial: switchUser() from pid="
434                     + Binder.getCallingPid()
435                     + ", uid=" + Binder.getCallingUid()
436                     + " requires " + INTERACT_ACROSS_USERS_FULL;
437             Slog.w(TAG, msg);
438             throw new SecurityException(msg);
439         }
440         if (userId < 0 || userId == UserHandle.USER_SYSTEM) {
441             throw new IllegalArgumentException("Can't stop system user " + userId);
442         }
443         mService.enforceShellRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES,
444                 userId);
445         synchronized (mService) {
446             return stopUsersLocked(userId, force, callback);
447         }
448     }
449
450     /**
451      * Stops the user along with its related users. The method calls
452      * {@link #getUsersToStopLocked(int)} to determine the list of users that should be stopped.
453      */
454     private int stopUsersLocked(final int userId, boolean force, final IStopUserCallback callback) {
455         if (userId == UserHandle.USER_SYSTEM) {
456             return USER_OP_ERROR_IS_SYSTEM;
457         }
458         if (isCurrentUserLocked(userId)) {
459             return USER_OP_IS_CURRENT;
460         }
461         int[] usersToStop = getUsersToStopLocked(userId);
462         // If one of related users is system or current, no related users should be stopped
463         for (int i = 0; i < usersToStop.length; i++) {
464             int relatedUserId = usersToStop[i];
465             if ((UserHandle.USER_SYSTEM == relatedUserId) || isCurrentUserLocked(relatedUserId)) {
466                 if (DEBUG_MU) Slog.i(TAG, "stopUsersLocked cannot stop related user "
467                         + relatedUserId);
468                 // We still need to stop the requested user if it's a force stop.
469                 if (force) {
470                     Slog.i(TAG,
471                             "Force stop user " + userId + ". Related users will not be stopped");
472                     stopSingleUserLocked(userId, callback);
473                     return USER_OP_SUCCESS;
474                 }
475                 return USER_OP_ERROR_RELATED_USERS_CANNOT_STOP;
476             }
477         }
478         if (DEBUG_MU) Slog.i(TAG, "stopUsersLocked usersToStop=" + Arrays.toString(usersToStop));
479         for (int userIdToStop : usersToStop) {
480             stopSingleUserLocked(userIdToStop, userIdToStop == userId ? callback : null);
481         }
482         return USER_OP_SUCCESS;
483     }
484
485     private void stopSingleUserLocked(final int userId, final IStopUserCallback callback) {
486         if (DEBUG_MU) Slog.i(TAG, "stopSingleUserLocked userId=" + userId);
487         final UserState uss = mStartedUsers.get(userId);
488         if (uss == null) {
489             // User is not started, nothing to do...  but we do need to
490             // callback if requested.
491             if (callback != null) {
492                 mHandler.post(new Runnable() {
493                     @Override
494                     public void run() {
495                         try {
496                             callback.userStopped(userId);
497                         } catch (RemoteException e) {
498                         }
499                     }
500                 });
501             }
502             return;
503         }
504
505         if (callback != null) {
506             uss.mStopCallbacks.add(callback);
507         }
508
509         if (uss.state != UserState.STATE_STOPPING
510                 && uss.state != UserState.STATE_SHUTDOWN) {
511             uss.setState(UserState.STATE_STOPPING);
512             getUserManagerInternal().setUserState(userId, uss.state);
513             updateStartedUserArrayLocked();
514
515             long ident = Binder.clearCallingIdentity();
516             try {
517                 // We are going to broadcast ACTION_USER_STOPPING and then
518                 // once that is done send a final ACTION_SHUTDOWN and then
519                 // stop the user.
520                 final Intent stoppingIntent = new Intent(Intent.ACTION_USER_STOPPING);
521                 stoppingIntent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
522                 stoppingIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
523                 stoppingIntent.putExtra(Intent.EXTRA_SHUTDOWN_USERSPACE_ONLY, true);
524                 // This is the result receiver for the initial stopping broadcast.
525                 final IIntentReceiver stoppingReceiver = new IIntentReceiver.Stub() {
526                     @Override
527                     public void performReceive(Intent intent, int resultCode, String data,
528                             Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
529                         mHandler.post(new Runnable() {
530                             @Override
531                             public void run() {
532                                 finishUserStopping(userId, uss);
533                             }
534                         });
535                     }
536                 };
537                 // Clear broadcast queue for the user to avoid delivering stale broadcasts
538                 mService.clearBroadcastQueueForUserLocked(userId);
539                 // Kick things off.
540                 mService.broadcastIntentLocked(null, null, stoppingIntent,
541                         null, stoppingReceiver, 0, null, null,
542                         new String[]{INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
543                         null, true, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
544             } finally {
545                 Binder.restoreCallingIdentity(ident);
546             }
547         }
548     }
549
550     void finishUserStopping(final int userId, final UserState uss) {
551         // On to the next.
552         final Intent shutdownIntent = new Intent(Intent.ACTION_SHUTDOWN);
553         // This is the result receiver for the final shutdown broadcast.
554         final IIntentReceiver shutdownReceiver = new IIntentReceiver.Stub() {
555             @Override
556             public void performReceive(Intent intent, int resultCode, String data,
557                     Bundle extras, boolean ordered, boolean sticky, int sendingUser) {
558                 mHandler.post(new Runnable() {
559                     @Override
560                     public void run() {
561                         finishUserStopped(uss);
562                     }
563                 });
564             }
565         };
566
567         synchronized (mService) {
568             if (uss.state != UserState.STATE_STOPPING) {
569                 // Whoops, we are being started back up.  Abort, abort!
570                 return;
571             }
572             uss.setState(UserState.STATE_SHUTDOWN);
573         }
574         getUserManagerInternal().setUserState(userId, uss.state);
575
576         mService.mBatteryStatsService.noteEvent(
577                 BatteryStats.HistoryItem.EVENT_USER_RUNNING_FINISH,
578                 Integer.toString(userId), userId);
579         mService.mSystemServiceManager.stopUser(userId);
580
581         synchronized (mService) {
582             mService.broadcastIntentLocked(null, null, shutdownIntent,
583                     null, shutdownReceiver, 0, null, null, null,
584                     AppOpsManager.OP_NONE,
585                     null, true, false, MY_PID, SYSTEM_UID, userId);
586         }
587     }
588
589     void finishUserStopped(UserState uss) {
590         final int userId = uss.mHandle.getIdentifier();
591         boolean stopped;
592         ArrayList<IStopUserCallback> callbacks;
593         synchronized (mService) {
594             callbacks = new ArrayList<>(uss.mStopCallbacks);
595             if (mStartedUsers.get(userId) != uss) {
596                 stopped = false;
597             } else if (uss.state != UserState.STATE_SHUTDOWN) {
598                 stopped = false;
599             } else {
600                 stopped = true;
601                 // User can no longer run.
602                 mStartedUsers.remove(userId);
603                 getUserManagerInternal().removeUserState(userId);
604                 mUserLru.remove(Integer.valueOf(userId));
605                 updateStartedUserArrayLocked();
606
607                 mService.onUserStoppedLocked(userId);
608                 // Clean up all state and processes associated with the user.
609                 // Kill all the processes for the user.
610                 forceStopUserLocked(userId, "finish user");
611             }
612         }
613
614         for (int i = 0; i < callbacks.size(); i++) {
615             try {
616                 if (stopped) callbacks.get(i).userStopped(userId);
617                 else callbacks.get(i).userStopAborted(userId);
618             } catch (RemoteException e) {
619             }
620         }
621
622         if (stopped) {
623             mService.mSystemServiceManager.cleanupUser(userId);
624             synchronized (mService) {
625                 mService.mStackSupervisor.removeUserLocked(userId);
626             }
627             // Remove the user if it is ephemeral.
628             if (getUserInfo(userId).isEphemeral()) {
629                 mUserManager.removeUser(userId);
630             }
631         }
632     }
633
634     /**
635      * Determines the list of users that should be stopped together with the specified
636      * {@code userId}. The returned list includes {@code userId}.
637      */
638     private @NonNull int[] getUsersToStopLocked(int userId) {
639         int startedUsersSize = mStartedUsers.size();
640         IntArray userIds = new IntArray();
641         userIds.add(userId);
642         synchronized (mUserProfileGroupIdsSelfLocked) {
643             int userGroupId = mUserProfileGroupIdsSelfLocked.get(userId,
644                     UserInfo.NO_PROFILE_GROUP_ID);
645             for (int i = 0; i < startedUsersSize; i++) {
646                 UserState uss = mStartedUsers.valueAt(i);
647                 int startedUserId = uss.mHandle.getIdentifier();
648                 // Skip unrelated users (profileGroupId mismatch)
649                 int startedUserGroupId = mUserProfileGroupIdsSelfLocked.get(startedUserId,
650                         UserInfo.NO_PROFILE_GROUP_ID);
651                 boolean sameGroup = (userGroupId != UserInfo.NO_PROFILE_GROUP_ID)
652                         && (userGroupId == startedUserGroupId);
653                 // userId has already been added
654                 boolean sameUserId = startedUserId == userId;
655                 if (!sameGroup || sameUserId) {
656                     continue;
657                 }
658                 userIds.add(startedUserId);
659             }
660         }
661         return userIds.toArray();
662     }
663
664     private void forceStopUserLocked(int userId, String reason) {
665         mService.forceStopPackageLocked(null, -1, false, false, true, false, false,
666                 userId, reason);
667         Intent intent = new Intent(Intent.ACTION_USER_STOPPED);
668         intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
669                 | Intent.FLAG_RECEIVER_FOREGROUND);
670         intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
671         mService.broadcastIntentLocked(null, null, intent,
672                 null, null, 0, null, null, null, AppOpsManager.OP_NONE,
673                 null, false, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
674     }
675
676     /**
677      * Stops the guest or ephemeral user if it has gone to the background.
678      */
679     private void stopGuestOrEphemeralUserIfBackground() {
680         synchronized (mService) {
681             final int num = mUserLru.size();
682             for (int i = 0; i < num; i++) {
683                 Integer oldUserId = mUserLru.get(i);
684                 UserState oldUss = mStartedUsers.get(oldUserId);
685                 if (oldUserId == UserHandle.USER_SYSTEM || oldUserId == mCurrentUserId
686                         || oldUss.state == UserState.STATE_STOPPING
687                         || oldUss.state == UserState.STATE_SHUTDOWN) {
688                     continue;
689                 }
690                 UserInfo userInfo = getUserInfo(oldUserId);
691                 if (userInfo.isEphemeral()) {
692                     LocalServices.getService(UserManagerInternal.class)
693                             .onEphemeralUserStop(oldUserId);
694                 }
695                 if (userInfo.isGuest() || userInfo.isEphemeral()) {
696                     // This is a user to be stopped.
697                     stopUsersLocked(oldUserId, true, null);
698                     break;
699                 }
700             }
701         }
702     }
703
704     void startProfilesLocked() {
705         if (DEBUG_MU) Slog.i(TAG, "startProfilesLocked");
706         List<UserInfo> profiles = getUserManager().getProfiles(
707                 mCurrentUserId, false /* enabledOnly */);
708         List<UserInfo> profilesToStart = new ArrayList<>(profiles.size());
709         for (UserInfo user : profiles) {
710             if ((user.flags & UserInfo.FLAG_INITIALIZED) == UserInfo.FLAG_INITIALIZED
711                     && user.id != mCurrentUserId && !user.isQuietModeEnabled()) {
712                 profilesToStart.add(user);
713             }
714         }
715         final int profilesToStartSize = profilesToStart.size();
716         int i = 0;
717         for (; i < profilesToStartSize && i < (MAX_RUNNING_USERS - 1); ++i) {
718             startUser(profilesToStart.get(i).id, /* foreground= */ false);
719         }
720         if (i < profilesToStartSize) {
721             Slog.w(TAG, "More profiles than MAX_RUNNING_USERS");
722         }
723     }
724
725     private UserManagerService getUserManager() {
726         UserManagerService userManager = mUserManager;
727         if (userManager == null) {
728             IBinder b = ServiceManager.getService(Context.USER_SERVICE);
729             userManager = mUserManager = (UserManagerService) IUserManager.Stub.asInterface(b);
730         }
731         return userManager;
732     }
733
734     private IMountService getMountService() {
735         return IMountService.Stub.asInterface(ServiceManager.getService("mount"));
736     }
737
738     /**
739      * Start user, if its not already running.
740      * <p>The user will be brought to the foreground, if {@code foreground} parameter is set.
741      * When starting the user, multiple intents will be broadcast in the following order:</p>
742      * <ul>
743      *     <li>{@link Intent#ACTION_USER_STARTED} - sent to registered receivers of the new user
744      *     <li>{@link Intent#ACTION_USER_BACKGROUND} - sent to registered receivers of the outgoing
745      *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
746      *     <li>{@link Intent#ACTION_USER_FOREGROUND} - sent to registered receivers of the new
747      *     user and all profiles of this user. Sent only if {@code foreground} parameter is true
748      *     <li>{@link Intent#ACTION_USER_SWITCHED} - sent to registered receivers of the new user.
749      *     Sent only if {@code foreground} parameter is true
750      *     <li>{@link Intent#ACTION_USER_STARTING} - ordered broadcast sent to registered receivers
751      *     of the new fg user
752      *     <li>{@link Intent#ACTION_LOCKED_BOOT_COMPLETED} - ordered broadcast sent to receivers of
753      *     the new user
754      *     <li>{@link Intent#ACTION_USER_UNLOCKED} - sent to registered receivers of the new user
755      *     <li>{@link Intent#ACTION_PRE_BOOT_COMPLETED} - ordered broadcast sent to receivers of the
756      *     new user. Sent only when the user is booting after a system update.
757      *     <li>{@link Intent#ACTION_USER_INITIALIZE} - ordered broadcast sent to receivers of the
758      *     new user. Sent only the first time a user is starting.
759      *     <li>{@link Intent#ACTION_BOOT_COMPLETED} - ordered broadcast sent to receivers of the new
760      *     user. Indicates that the user has finished booting.
761      * </ul>
762      *
763      * @param userId ID of the user to start
764      * @param foreground true if user should be brought to the foreground
765      * @return true if the user has been successfully started
766      */
767     boolean startUser(final int userId, final boolean foreground) {
768         if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
769                 != PackageManager.PERMISSION_GRANTED) {
770             String msg = "Permission Denial: switchUser() from pid="
771                     + Binder.getCallingPid()
772                     + ", uid=" + Binder.getCallingUid()
773                     + " requires " + INTERACT_ACROSS_USERS_FULL;
774             Slog.w(TAG, msg);
775             throw new SecurityException(msg);
776         }
777
778         Slog.i(TAG, "Starting userid:" + userId + " fg:" + foreground);
779
780         final long ident = Binder.clearCallingIdentity();
781         try {
782             synchronized (mService) {
783                 final int oldUserId = mCurrentUserId;
784                 if (oldUserId == userId) {
785                     return true;
786                 }
787
788                 mService.mStackSupervisor.setLockTaskModeLocked(null,
789                         ActivityManager.LOCK_TASK_MODE_NONE, "startUser", false);
790
791                 final UserInfo userInfo = getUserInfo(userId);
792                 if (userInfo == null) {
793                     Slog.w(TAG, "No user info for user #" + userId);
794                     return false;
795                 }
796                 if (foreground && userInfo.isManagedProfile()) {
797                     Slog.w(TAG, "Cannot switch to User #" + userId + ": not a full user");
798                     return false;
799                 }
800
801                 if (foreground) {
802                     mService.mWindowManager.startFreezingScreen(
803                             R.anim.screen_user_exit, R.anim.screen_user_enter);
804                 }
805
806                 boolean needStart = false;
807
808                 // If the user we are switching to is not currently started, then
809                 // we need to start it now.
810                 if (mStartedUsers.get(userId) == null) {
811                     UserState userState = new UserState(UserHandle.of(userId));
812                     mStartedUsers.put(userId, userState);
813                     getUserManagerInternal().setUserState(userId, userState.state);
814                     updateStartedUserArrayLocked();
815                     needStart = true;
816                 }
817
818                 final UserState uss = mStartedUsers.get(userId);
819                 final Integer userIdInt = userId;
820                 mUserLru.remove(userIdInt);
821                 mUserLru.add(userIdInt);
822
823                 if (foreground) {
824                     mCurrentUserId = userId;
825                     mService.updateUserConfigurationLocked();
826                     mTargetUserId = UserHandle.USER_NULL; // reset, mCurrentUserId has caught up
827                     updateCurrentProfileIdsLocked();
828                     mService.mWindowManager.setCurrentUser(userId, mCurrentProfileIds);
829                     // Once the internal notion of the active user has switched, we lock the device
830                     // with the option to show the user switcher on the keyguard.
831                     mService.mWindowManager.lockNow(null);
832                 } else {
833                     final Integer currentUserIdInt = mCurrentUserId;
834                     updateCurrentProfileIdsLocked();
835                     mService.mWindowManager.setCurrentProfileIds(mCurrentProfileIds);
836                     mUserLru.remove(currentUserIdInt);
837                     mUserLru.add(currentUserIdInt);
838                 }
839
840                 // Make sure user is in the started state.  If it is currently
841                 // stopping, we need to knock that off.
842                 if (uss.state == UserState.STATE_STOPPING) {
843                     // If we are stopping, we haven't sent ACTION_SHUTDOWN,
844                     // so we can just fairly silently bring the user back from
845                     // the almost-dead.
846                     uss.setState(uss.lastState);
847                     getUserManagerInternal().setUserState(userId, uss.state);
848                     updateStartedUserArrayLocked();
849                     needStart = true;
850                 } else if (uss.state == UserState.STATE_SHUTDOWN) {
851                     // This means ACTION_SHUTDOWN has been sent, so we will
852                     // need to treat this as a new boot of the user.
853                     uss.setState(UserState.STATE_BOOTING);
854                     getUserManagerInternal().setUserState(userId, uss.state);
855                     updateStartedUserArrayLocked();
856                     needStart = true;
857                 }
858
859                 if (uss.state == UserState.STATE_BOOTING) {
860                     // Give user manager a chance to propagate user restrictions
861                     // to other services and prepare app storage
862                     getUserManager().onBeforeStartUser(userId);
863
864                     // Booting up a new user, need to tell system services about it.
865                     // Note that this is on the same handler as scheduling of broadcasts,
866                     // which is important because it needs to go first.
867                     mHandler.sendMessage(mHandler.obtainMessage(SYSTEM_USER_START_MSG, userId, 0));
868                 }
869
870                 if (foreground) {
871                     mHandler.sendMessage(mHandler.obtainMessage(SYSTEM_USER_CURRENT_MSG, userId,
872                             oldUserId));
873                     mHandler.removeMessages(REPORT_USER_SWITCH_MSG);
874                     mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG);
875                     mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_MSG,
876                             oldUserId, userId, uss));
877                     mHandler.sendMessageDelayed(mHandler.obtainMessage(USER_SWITCH_TIMEOUT_MSG,
878                             oldUserId, userId, uss), USER_SWITCH_TIMEOUT);
879                 }
880
881                 if (needStart) {
882                     // Send USER_STARTED broadcast
883                     Intent intent = new Intent(Intent.ACTION_USER_STARTED);
884                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
885                             | Intent.FLAG_RECEIVER_FOREGROUND);
886                     intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
887                     mService.broadcastIntentLocked(null, null, intent,
888                             null, null, 0, null, null, null, AppOpsManager.OP_NONE,
889                             null, false, false, MY_PID, SYSTEM_UID, userId);
890                 }
891
892                 if (foreground) {
893                     moveUserToForegroundLocked(uss, oldUserId, userId);
894                 } else {
895                     mService.mUserController.finishUserBoot(uss);
896                 }
897
898                 if (needStart) {
899                     Intent intent = new Intent(Intent.ACTION_USER_STARTING);
900                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY);
901                     intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
902                     mService.broadcastIntentLocked(null, null, intent,
903                             null, new IIntentReceiver.Stub() {
904                                 @Override
905                                 public void performReceive(Intent intent, int resultCode,
906                                         String data, Bundle extras, boolean ordered, boolean sticky,
907                                         int sendingUser) throws RemoteException {
908                                 }
909                             }, 0, null, null,
910                             new String[] {INTERACT_ACROSS_USERS}, AppOpsManager.OP_NONE,
911                             null, true, false, MY_PID, SYSTEM_UID, UserHandle.USER_ALL);
912                 }
913             }
914         } finally {
915             Binder.restoreCallingIdentity(ident);
916         }
917
918         return true;
919     }
920
921     /**
922      * Start user, if its not already running, and bring it to foreground.
923      */
924     boolean startUserInForeground(final int userId, Dialog dlg) {
925         boolean result = startUser(userId, /* foreground */ true);
926         dlg.dismiss();
927         return result;
928     }
929
930     boolean unlockUser(final int userId, byte[] token, byte[] secret, IProgressListener listener) {
931         if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
932                 != PackageManager.PERMISSION_GRANTED) {
933             String msg = "Permission Denial: unlockUser() from pid="
934                     + Binder.getCallingPid()
935                     + ", uid=" + Binder.getCallingUid()
936                     + " requires " + INTERACT_ACROSS_USERS_FULL;
937             Slog.w(TAG, msg);
938             throw new SecurityException(msg);
939         }
940
941         final long binderToken = Binder.clearCallingIdentity();
942         try {
943             return unlockUserCleared(userId, token, secret, listener);
944         } finally {
945             Binder.restoreCallingIdentity(binderToken);
946         }
947     }
948
949     /**
950      * Attempt to unlock user without a credential token. This typically
951      * succeeds when the device doesn't have credential-encrypted storage, or
952      * when the the credential-encrypted storage isn't tied to a user-provided
953      * PIN or pattern.
954      */
955     boolean maybeUnlockUser(final int userId) {
956         // Try unlocking storage using empty token
957         return unlockUserCleared(userId, null, null, null);
958     }
959
960     private static void notifyFinished(int userId, IProgressListener listener) {
961         if (listener == null) return;
962         try {
963             listener.onFinished(userId, null);
964         } catch (RemoteException ignored) {
965         }
966     }
967
968     boolean unlockUserCleared(final int userId, byte[] token, byte[] secret,
969             IProgressListener listener) {
970         UserState uss;
971         synchronized (mService) {
972             // TODO Move this block outside of synchronized if it causes lock contention
973             if (!StorageManager.isUserKeyUnlocked(userId)) {
974                 final UserInfo userInfo = getUserInfo(userId);
975                 final IMountService mountService = getMountService();
976                 try {
977                     // We always want to unlock user storage, even user is not started yet
978                     mountService.unlockUserKey(userId, userInfo.serialNumber, token, secret);
979                 } catch (RemoteException | RuntimeException e) {
980                     Slog.w(TAG, "Failed to unlock: " + e.getMessage());
981                 }
982             }
983             // Bail if user isn't actually running, otherwise register the given
984             // listener to watch for unlock progress
985             uss = mStartedUsers.get(userId);
986             if (uss == null) {
987                 notifyFinished(userId, listener);
988                 return false;
989             } else {
990                 uss.mUnlockProgress.addListener(listener);
991                 uss.tokenProvided = (token != null);
992             }
993         }
994
995         finishUserUnlocking(uss);
996
997         final ArraySet<Integer> childProfilesToUnlock = new ArraySet<>();
998         synchronized (mService) {
999
1000             // We just unlocked a user, so let's now attempt to unlock any
1001             // managed profiles under that user.
1002             for (int i = 0; i < mStartedUsers.size(); i++) {
1003                 final int testUserId = mStartedUsers.keyAt(i);
1004                 final UserInfo parent = getUserManager().getProfileParent(testUserId);
1005                 if (parent != null && parent.id == userId && testUserId != userId) {
1006                     Slog.d(TAG, "User " + testUserId + " (parent " + parent.id
1007                             + "): attempting unlock because parent was just unlocked");
1008                     childProfilesToUnlock.add(testUserId);
1009                 }
1010             }
1011         }
1012
1013         final int size = childProfilesToUnlock.size();
1014         for (int i = 0; i < size; i++) {
1015             maybeUnlockUser(childProfilesToUnlock.valueAt(i));
1016         }
1017
1018         return true;
1019     }
1020
1021     void showUserSwitchDialog(Pair<UserInfo, UserInfo> fromToUserPair) {
1022         // The dialog will show and then initiate the user switch by calling startUserInForeground
1023         Dialog d = new UserSwitchingDialog(mService, mService.mContext, fromToUserPair.first,
1024                 fromToUserPair.second, true /* above system */);
1025         d.show();
1026     }
1027
1028     void dispatchForegroundProfileChanged(int userId) {
1029         final int observerCount = mUserSwitchObservers.beginBroadcast();
1030         for (int i = 0; i < observerCount; i++) {
1031             try {
1032                 mUserSwitchObservers.getBroadcastItem(i).onForegroundProfileSwitch(userId);
1033             } catch (RemoteException e) {
1034                 // Ignore
1035             }
1036         }
1037         mUserSwitchObservers.finishBroadcast();
1038     }
1039
1040     /** Called on handler thread */
1041     void dispatchUserSwitchComplete(int userId) {
1042         final int observerCount = mUserSwitchObservers.beginBroadcast();
1043         for (int i = 0; i < observerCount; i++) {
1044             try {
1045                 mUserSwitchObservers.getBroadcastItem(i).onUserSwitchComplete(userId);
1046             } catch (RemoteException e) {
1047             }
1048         }
1049         mUserSwitchObservers.finishBroadcast();
1050     }
1051
1052     private void stopBackgroundUsersIfEnforced(int oldUserId) {
1053         // Never stop system user
1054         if (oldUserId == UserHandle.USER_SYSTEM) {
1055             return;
1056         }
1057         // For now, only check for user restriction. Additional checks can be added here
1058         boolean disallowRunInBg = hasUserRestriction(UserManager.DISALLOW_RUN_IN_BACKGROUND,
1059                 oldUserId);
1060         if (!disallowRunInBg) {
1061             return;
1062         }
1063         synchronized (mService) {
1064             if (DEBUG_MU) Slog.i(TAG, "stopBackgroundUsersIfEnforced stopping " + oldUserId
1065                     + " and related users");
1066             stopUsersLocked(oldUserId, false, null);
1067         }
1068     }
1069
1070     void timeoutUserSwitch(UserState uss, int oldUserId, int newUserId) {
1071         synchronized (mService) {
1072             Slog.wtf(TAG, "User switch timeout: from " + oldUserId + " to " + newUserId
1073                     + ". Observers that didn't send results: " + mCurWaitingUserSwitchCallbacks);
1074             sendContinueUserSwitchLocked(uss, oldUserId, newUserId);
1075         }
1076     }
1077
1078     void dispatchUserSwitch(final UserState uss, final int oldUserId, final int newUserId) {
1079         Slog.d(TAG, "Dispatch onUserSwitching oldUser #" + oldUserId + " newUser #" + newUserId);
1080         final int observerCount = mUserSwitchObservers.beginBroadcast();
1081         if (observerCount > 0) {
1082             final ArraySet<String> curWaitingUserSwitchCallbacks = new ArraySet<>();
1083             synchronized (mService) {
1084                 uss.switching = true;
1085                 mCurWaitingUserSwitchCallbacks = curWaitingUserSwitchCallbacks;
1086             }
1087             final AtomicInteger waitingCallbacksCount = new AtomicInteger(observerCount);
1088             for (int i = 0; i < observerCount; i++) {
1089                 try {
1090                     // Prepend with unique prefix to guarantee that keys are unique
1091                     final String name = "#" + i + " " + mUserSwitchObservers.getBroadcastCookie(i);
1092                     synchronized (mService) {
1093                         curWaitingUserSwitchCallbacks.add(name);
1094                     }
1095                     final IRemoteCallback callback = new IRemoteCallback.Stub() {
1096                         @Override
1097                         public void sendResult(Bundle data) throws RemoteException {
1098                             synchronized (mService) {
1099                                 // Early return if this session is no longer valid
1100                                 if (curWaitingUserSwitchCallbacks
1101                                         != mCurWaitingUserSwitchCallbacks) {
1102                                     return;
1103                                 }
1104                                 curWaitingUserSwitchCallbacks.remove(name);
1105                                 // Continue switching if all callbacks have been notified
1106                                 if (waitingCallbacksCount.decrementAndGet() == 0) {
1107                                     sendContinueUserSwitchLocked(uss, oldUserId, newUserId);
1108                                 }
1109                             }
1110                         }
1111                     };
1112                     mUserSwitchObservers.getBroadcastItem(i).onUserSwitching(newUserId, callback);
1113                 } catch (RemoteException e) {
1114                 }
1115             }
1116         } else {
1117             synchronized (mService) {
1118                 sendContinueUserSwitchLocked(uss, oldUserId, newUserId);
1119             }
1120         }
1121         mUserSwitchObservers.finishBroadcast();
1122     }
1123
1124     void sendContinueUserSwitchLocked(UserState uss, int oldUserId, int newUserId) {
1125         mCurWaitingUserSwitchCallbacks = null;
1126         mHandler.removeMessages(USER_SWITCH_TIMEOUT_MSG);
1127         mHandler.sendMessage(mHandler.obtainMessage(ActivityManagerService.CONTINUE_USER_SWITCH_MSG,
1128                 oldUserId, newUserId, uss));
1129     }
1130
1131     void continueUserSwitch(UserState uss, int oldUserId, int newUserId) {
1132         Slog.d(TAG, "Continue user switch oldUser #" + oldUserId + ", newUser #" + newUserId);
1133         synchronized (mService) {
1134             mService.mWindowManager.stopFreezingScreen();
1135         }
1136         uss.switching = false;
1137         mHandler.removeMessages(REPORT_USER_SWITCH_COMPLETE_MSG);
1138         mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_COMPLETE_MSG,
1139                 newUserId, 0));
1140         stopGuestOrEphemeralUserIfBackground();
1141         stopBackgroundUsersIfEnforced(oldUserId);
1142     }
1143
1144     void moveUserToForegroundLocked(UserState uss, int oldUserId, int newUserId) {
1145         boolean homeInFront = mService.mStackSupervisor.switchUserLocked(newUserId, uss);
1146         if (homeInFront) {
1147             mService.startHomeActivityLocked(newUserId, "moveUserToForeground");
1148         } else {
1149             mService.mStackSupervisor.resumeFocusedStackTopActivityLocked();
1150         }
1151         EventLogTags.writeAmSwitchUser(newUserId);
1152         sendUserSwitchBroadcastsLocked(oldUserId, newUserId);
1153     }
1154
1155     void sendUserSwitchBroadcastsLocked(int oldUserId, int newUserId) {
1156         long ident = Binder.clearCallingIdentity();
1157         try {
1158             Intent intent;
1159             if (oldUserId >= 0) {
1160                 // Send USER_BACKGROUND broadcast to all profiles of the outgoing user
1161                 List<UserInfo> profiles = getUserManager().getProfiles(oldUserId, false);
1162                 int count = profiles.size();
1163                 for (int i = 0; i < count; i++) {
1164                     int profileUserId = profiles.get(i).id;
1165                     intent = new Intent(Intent.ACTION_USER_BACKGROUND);
1166                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1167                             | Intent.FLAG_RECEIVER_FOREGROUND);
1168                     intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId);
1169                     mService.broadcastIntentLocked(null, null, intent,
1170                             null, null, 0, null, null, null, AppOpsManager.OP_NONE,
1171                             null, false, false, MY_PID, SYSTEM_UID, profileUserId);
1172                 }
1173             }
1174             if (newUserId >= 0) {
1175                 // Send USER_FOREGROUND broadcast to all profiles of the incoming user
1176                 List<UserInfo> profiles = getUserManager().getProfiles(newUserId, false);
1177                 int count = profiles.size();
1178                 for (int i = 0; i < count; i++) {
1179                     int profileUserId = profiles.get(i).id;
1180                     intent = new Intent(Intent.ACTION_USER_FOREGROUND);
1181                     intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1182                             | Intent.FLAG_RECEIVER_FOREGROUND);
1183                     intent.putExtra(Intent.EXTRA_USER_HANDLE, profileUserId);
1184                     mService.broadcastIntentLocked(null, null, intent,
1185                             null, null, 0, null, null, null, AppOpsManager.OP_NONE,
1186                             null, false, false, MY_PID, SYSTEM_UID, profileUserId);
1187                 }
1188                 intent = new Intent(Intent.ACTION_USER_SWITCHED);
1189                 intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY
1190                         | Intent.FLAG_RECEIVER_FOREGROUND);
1191                 intent.putExtra(Intent.EXTRA_USER_HANDLE, newUserId);
1192                 mService.broadcastIntentLocked(null, null, intent,
1193                         null, null, 0, null, null,
1194                         new String[] {android.Manifest.permission.MANAGE_USERS},
1195                         AppOpsManager.OP_NONE, null, false, false, MY_PID, SYSTEM_UID,
1196                         UserHandle.USER_ALL);
1197             }
1198         } finally {
1199             Binder.restoreCallingIdentity(ident);
1200         }
1201     }
1202
1203
1204     int handleIncomingUser(int callingPid, int callingUid, int userId, boolean allowAll,
1205             int allowMode, String name, String callerPackage) {
1206         final int callingUserId = UserHandle.getUserId(callingUid);
1207         if (callingUserId == userId) {
1208             return userId;
1209         }
1210
1211         // Note that we may be accessing mCurrentUserId outside of a lock...
1212         // shouldn't be a big deal, if this is being called outside
1213         // of a locked context there is intrinsically a race with
1214         // the value the caller will receive and someone else changing it.
1215         // We assume that USER_CURRENT_OR_SELF will use the current user; later
1216         // we will switch to the calling user if access to the current user fails.
1217         int targetUserId = unsafeConvertIncomingUserLocked(userId);
1218
1219         if (callingUid != 0 && callingUid != SYSTEM_UID) {
1220             final boolean allow;
1221             if (mService.checkComponentPermission(INTERACT_ACROSS_USERS_FULL, callingPid,
1222                     callingUid, -1, true) == PackageManager.PERMISSION_GRANTED) {
1223                 // If the caller has this permission, they always pass go.  And collect $200.
1224                 allow = true;
1225             } else if (allowMode == ALLOW_FULL_ONLY) {
1226                 // We require full access, sucks to be you.
1227                 allow = false;
1228             } else if (mService.checkComponentPermission(INTERACT_ACROSS_USERS, callingPid,
1229                     callingUid, -1, true) != PackageManager.PERMISSION_GRANTED) {
1230                 // If the caller does not have either permission, they are always doomed.
1231                 allow = false;
1232             } else if (allowMode == ALLOW_NON_FULL) {
1233                 // We are blanket allowing non-full access, you lucky caller!
1234                 allow = true;
1235             } else if (allowMode == ALLOW_NON_FULL_IN_PROFILE) {
1236                 // We may or may not allow this depending on whether the two users are
1237                 // in the same profile.
1238                 allow = isSameProfileGroup(callingUserId, targetUserId);
1239             } else {
1240                 throw new IllegalArgumentException("Unknown mode: " + allowMode);
1241             }
1242             if (!allow) {
1243                 if (userId == UserHandle.USER_CURRENT_OR_SELF) {
1244                     // In this case, they would like to just execute as their
1245                     // owner user instead of failing.
1246                     targetUserId = callingUserId;
1247                 } else {
1248                     StringBuilder builder = new StringBuilder(128);
1249                     builder.append("Permission Denial: ");
1250                     builder.append(name);
1251                     if (callerPackage != null) {
1252                         builder.append(" from ");
1253                         builder.append(callerPackage);
1254                     }
1255                     builder.append(" asks to run as user ");
1256                     builder.append(userId);
1257                     builder.append(" but is calling from user ");
1258                     builder.append(UserHandle.getUserId(callingUid));
1259                     builder.append("; this requires ");
1260                     builder.append(INTERACT_ACROSS_USERS_FULL);
1261                     if (allowMode != ALLOW_FULL_ONLY) {
1262                         builder.append(" or ");
1263                         builder.append(INTERACT_ACROSS_USERS);
1264                     }
1265                     String msg = builder.toString();
1266                     Slog.w(TAG, msg);
1267                     throw new SecurityException(msg);
1268                 }
1269             }
1270         }
1271         if (!allowAll && targetUserId < 0) {
1272             throw new IllegalArgumentException(
1273                     "Call does not support special user #" + targetUserId);
1274         }
1275         // Check shell permission
1276         if (callingUid == Process.SHELL_UID && targetUserId >= UserHandle.USER_SYSTEM) {
1277             if (hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES, targetUserId)) {
1278                 throw new SecurityException("Shell does not have permission to access user "
1279                         + targetUserId + "\n " + Debug.getCallers(3));
1280             }
1281         }
1282         return targetUserId;
1283     }
1284
1285     int unsafeConvertIncomingUserLocked(int userId) {
1286         return (userId == UserHandle.USER_CURRENT || userId == UserHandle.USER_CURRENT_OR_SELF)
1287                 ? getCurrentUserIdLocked(): userId;
1288     }
1289
1290     void registerUserSwitchObserver(IUserSwitchObserver observer, String name) {
1291         Preconditions.checkNotNull(name, "Observer name cannot be null");
1292         if (mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
1293                 != PackageManager.PERMISSION_GRANTED) {
1294             final String msg = "Permission Denial: registerUserSwitchObserver() from pid="
1295                     + Binder.getCallingPid()
1296                     + ", uid=" + Binder.getCallingUid()
1297                     + " requires " + INTERACT_ACROSS_USERS_FULL;
1298             Slog.w(TAG, msg);
1299             throw new SecurityException(msg);
1300         }
1301         mUserSwitchObservers.register(observer, name);
1302     }
1303
1304     void unregisterUserSwitchObserver(IUserSwitchObserver observer) {
1305         mUserSwitchObservers.unregister(observer);
1306     }
1307
1308     UserState getStartedUserStateLocked(int userId) {
1309         return mStartedUsers.get(userId);
1310     }
1311
1312     boolean hasStartedUserState(int userId) {
1313         return mStartedUsers.get(userId) != null;
1314     }
1315
1316     private void updateStartedUserArrayLocked() {
1317         int num = 0;
1318         for (int i = 0; i < mStartedUsers.size(); i++) {
1319             UserState uss = mStartedUsers.valueAt(i);
1320             // This list does not include stopping users.
1321             if (uss.state != UserState.STATE_STOPPING
1322                     && uss.state != UserState.STATE_SHUTDOWN) {
1323                 num++;
1324             }
1325         }
1326         mStartedUserArray = new int[num];
1327         num = 0;
1328         for (int i = 0; i < mStartedUsers.size(); i++) {
1329             UserState uss = mStartedUsers.valueAt(i);
1330             if (uss.state != UserState.STATE_STOPPING
1331                     && uss.state != UserState.STATE_SHUTDOWN) {
1332                 mStartedUserArray[num++] = mStartedUsers.keyAt(i);
1333             }
1334         }
1335     }
1336
1337     void sendBootCompletedLocked(IIntentReceiver resultTo) {
1338         for (int i = 0; i < mStartedUsers.size(); i++) {
1339             UserState uss = mStartedUsers.valueAt(i);
1340             finishUserBoot(uss, resultTo);
1341         }
1342     }
1343
1344     void onSystemReady() {
1345         updateCurrentProfileIdsLocked();
1346     }
1347
1348     /**
1349      * Refreshes the list of users related to the current user when either a
1350      * user switch happens or when a new related user is started in the
1351      * background.
1352      */
1353     private void updateCurrentProfileIdsLocked() {
1354         final List<UserInfo> profiles = getUserManager().getProfiles(mCurrentUserId,
1355                 false /* enabledOnly */);
1356         int[] currentProfileIds = new int[profiles.size()]; // profiles will not be null
1357         for (int i = 0; i < currentProfileIds.length; i++) {
1358             currentProfileIds[i] = profiles.get(i).id;
1359         }
1360         mCurrentProfileIds = currentProfileIds;
1361
1362         synchronized (mUserProfileGroupIdsSelfLocked) {
1363             mUserProfileGroupIdsSelfLocked.clear();
1364             final List<UserInfo> users = getUserManager().getUsers(false);
1365             for (int i = 0; i < users.size(); i++) {
1366                 UserInfo user = users.get(i);
1367                 if (user.profileGroupId != UserInfo.NO_PROFILE_GROUP_ID) {
1368                     mUserProfileGroupIdsSelfLocked.put(user.id, user.profileGroupId);
1369                 }
1370             }
1371         }
1372     }
1373
1374     int[] getStartedUserArrayLocked() {
1375         return mStartedUserArray;
1376     }
1377
1378     boolean isUserStoppingOrShuttingDownLocked(int userId) {
1379         UserState state = getStartedUserStateLocked(userId);
1380         if (state == null) {
1381             return false;
1382         }
1383         return state.state == UserState.STATE_STOPPING
1384                 || state.state == UserState.STATE_SHUTDOWN;
1385     }
1386
1387     boolean isUserRunningLocked(int userId, int flags) {
1388         UserState state = getStartedUserStateLocked(userId);
1389         if (state == null) {
1390             return false;
1391         }
1392         if ((flags & ActivityManager.FLAG_OR_STOPPED) != 0) {
1393             return true;
1394         }
1395         if ((flags & ActivityManager.FLAG_AND_LOCKED) != 0) {
1396             switch (state.state) {
1397                 case UserState.STATE_BOOTING:
1398                 case UserState.STATE_RUNNING_LOCKED:
1399                     return true;
1400                 default:
1401                     return false;
1402             }
1403         }
1404         if ((flags & ActivityManager.FLAG_AND_UNLOCKING_OR_UNLOCKED) != 0) {
1405             switch (state.state) {
1406                 case UserState.STATE_RUNNING_UNLOCKING:
1407                 case UserState.STATE_RUNNING_UNLOCKED:
1408                     return true;
1409                 default:
1410                     return false;
1411             }
1412         }
1413         if ((flags & ActivityManager.FLAG_AND_UNLOCKED) != 0) {
1414             switch (state.state) {
1415                 case UserState.STATE_RUNNING_UNLOCKED:
1416                     return true;
1417                 default:
1418                     return false;
1419             }
1420         }
1421
1422         // One way or another, we're running!
1423         return true;
1424     }
1425
1426     UserInfo getCurrentUser() {
1427         if ((mService.checkCallingPermission(INTERACT_ACROSS_USERS)
1428                 != PackageManager.PERMISSION_GRANTED) && (
1429                 mService.checkCallingPermission(INTERACT_ACROSS_USERS_FULL)
1430                         != PackageManager.PERMISSION_GRANTED)) {
1431             String msg = "Permission Denial: getCurrentUser() from pid="
1432                     + Binder.getCallingPid()
1433                     + ", uid=" + Binder.getCallingUid()
1434                     + " requires " + INTERACT_ACROSS_USERS;
1435             Slog.w(TAG, msg);
1436             throw new SecurityException(msg);
1437         }
1438         synchronized (mService) {
1439             return getCurrentUserLocked();
1440         }
1441     }
1442
1443     UserInfo getCurrentUserLocked() {
1444         int userId = mTargetUserId != UserHandle.USER_NULL ? mTargetUserId : mCurrentUserId;
1445         return getUserInfo(userId);
1446     }
1447
1448     int getCurrentOrTargetUserIdLocked() {
1449         return mTargetUserId != UserHandle.USER_NULL ? mTargetUserId : mCurrentUserId;
1450     }
1451
1452     int getCurrentUserIdLocked() {
1453         return mCurrentUserId;
1454     }
1455
1456     private boolean isCurrentUserLocked(int userId) {
1457         return userId == getCurrentOrTargetUserIdLocked();
1458     }
1459
1460     int setTargetUserIdLocked(int targetUserId) {
1461         return mTargetUserId = targetUserId;
1462     }
1463
1464     int[] getUsers() {
1465         UserManagerService ums = getUserManager();
1466         return ums != null ? ums.getUserIds() : new int[] { 0 };
1467     }
1468
1469     UserInfo getUserInfo(int userId) {
1470         return getUserManager().getUserInfo(userId);
1471     }
1472
1473     int[] getUserIds() {
1474         return getUserManager().getUserIds();
1475     }
1476
1477     boolean exists(int userId) {
1478         return getUserManager().exists(userId);
1479     }
1480
1481     boolean hasUserRestriction(String restriction, int userId) {
1482         return getUserManager().hasUserRestriction(restriction, userId);
1483     }
1484
1485     Set<Integer> getProfileIds(int userId) {
1486         Set<Integer> userIds = new HashSet<>();
1487         final List<UserInfo> profiles = getUserManager().getProfiles(userId,
1488                 false /* enabledOnly */);
1489         for (UserInfo user : profiles) {
1490             userIds.add(user.id);
1491         }
1492         return userIds;
1493     }
1494
1495     boolean isSameProfileGroup(int callingUserId, int targetUserId) {
1496         if (callingUserId == targetUserId) {
1497             return true;
1498         }
1499         synchronized (mUserProfileGroupIdsSelfLocked) {
1500             int callingProfile = mUserProfileGroupIdsSelfLocked.get(callingUserId,
1501                     UserInfo.NO_PROFILE_GROUP_ID);
1502             int targetProfile = mUserProfileGroupIdsSelfLocked.get(targetUserId,
1503                     UserInfo.NO_PROFILE_GROUP_ID);
1504             return callingProfile != UserInfo.NO_PROFILE_GROUP_ID
1505                     && callingProfile == targetProfile;
1506         }
1507     }
1508
1509     boolean isCurrentProfileLocked(int userId) {
1510         return ArrayUtils.contains(mCurrentProfileIds, userId);
1511     }
1512
1513     int[] getCurrentProfileIdsLocked() {
1514         return mCurrentProfileIds;
1515     }
1516
1517     /**
1518      * Returns whether the given user requires credential entry at this time. This is used to
1519      * intercept activity launches for work apps when the Work Challenge is present.
1520      */
1521     boolean shouldConfirmCredentials(int userId) {
1522         synchronized (mService) {
1523             if (mStartedUsers.get(userId) == null) {
1524                 return false;
1525             }
1526         }
1527         if (!mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
1528             return false;
1529         }
1530         final KeyguardManager km = (KeyguardManager) mService.mContext
1531                 .getSystemService(KEYGUARD_SERVICE);
1532         return km.isDeviceLocked(userId) && km.isDeviceSecure(userId);
1533     }
1534
1535     boolean isLockScreenDisabled(@UserIdInt int userId) {
1536         return mLockPatternUtils.isLockScreenDisabled(userId);
1537     }
1538
1539     private UserManagerInternal getUserManagerInternal() {
1540         if (mUserManagerInternal == null) {
1541             mUserManagerInternal = LocalServices.getService(UserManagerInternal.class);
1542         }
1543         return mUserManagerInternal;
1544     }
1545
1546     void dump(PrintWriter pw, boolean dumpAll) {
1547         pw.println("  mStartedUsers:");
1548         for (int i = 0; i < mStartedUsers.size(); i++) {
1549             UserState uss = mStartedUsers.valueAt(i);
1550             pw.print("    User #"); pw.print(uss.mHandle.getIdentifier());
1551             pw.print(": "); uss.dump("", pw);
1552         }
1553         pw.print("  mStartedUserArray: [");
1554         for (int i = 0; i < mStartedUserArray.length; i++) {
1555             if (i > 0) pw.print(", ");
1556             pw.print(mStartedUserArray[i]);
1557         }
1558         pw.println("]");
1559         pw.print("  mUserLru: [");
1560         for (int i = 0; i < mUserLru.size(); i++) {
1561             if (i > 0) pw.print(", ");
1562             pw.print(mUserLru.get(i));
1563         }
1564         pw.println("]");
1565         if (dumpAll) {
1566             pw.print("  mStartedUserArray: "); pw.println(Arrays.toString(mStartedUserArray));
1567         }
1568         synchronized (mUserProfileGroupIdsSelfLocked) {
1569             if (mUserProfileGroupIdsSelfLocked.size() > 0) {
1570                 pw.println("  mUserProfileGroupIds:");
1571                 for (int i=0; i<mUserProfileGroupIdsSelfLocked.size(); i++) {
1572                     pw.print("    User #");
1573                     pw.print(mUserProfileGroupIdsSelfLocked.keyAt(i));
1574                     pw.print(" -> profile #");
1575                     pw.println(mUserProfileGroupIdsSelfLocked.valueAt(i));
1576                 }
1577             }
1578         }
1579     }
1580 }