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 } 1581