From 9950e5a81d37f49a72c88a2e0e6e2e3b14c88e65 Mon Sep 17 00:00:00 2001 From: jovanak Date: Fri, 21 Feb 2020 14:45:49 -0800 Subject: [PATCH] Fixes switch-user -w command. We handle failures better and exit early if already switched to a current user. Fixes: 150019926 Test: manual verification Change-Id: Ib3d70d21cc379f136983f9ddcda31f5bab3f045e Merged-In: Ib3d70d21cc379f136983f9ddcda31f5bab3f045e --- .../server/am/ActivityManagerShellCommand.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java index 7118899d37fa7..af582c42855fe 100644 --- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java +++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java @@ -1710,6 +1710,12 @@ final class ActivityManagerShellCommand extends ShellCommand { } private boolean switchUserAndWaitForComplete(int userId) throws RemoteException { + UserInfo currentUser = mInterface.getCurrentUser(); + if (currentUser != null && userId == currentUser.id) { + // Already switched to the correct user, exit early. + return true; + } + // Register switch observer. final CountDownLatch switchLatch = new CountDownLatch(1); mInterface.registerUserSwitchObserver( @@ -1724,13 +1730,18 @@ final class ActivityManagerShellCommand extends ShellCommand { // Switch. boolean switched = mInterface.switchUser(userId); + if (!switched) { + // Switching failed, don't wait for the user switch observer. + return false; + } // Wait. try { - switchLatch.await(USER_OPERATION_TIMEOUT_MS, TimeUnit.MILLISECONDS); + switched = switchLatch.await(USER_OPERATION_TIMEOUT_MS, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { - getErrPrintWriter().println("Thread interrupted unexpectedly."); + getErrPrintWriter().println("Error: Thread interrupted unexpectedly."); } + return switched; } @@ -1762,7 +1773,7 @@ final class ActivityManagerShellCommand extends ShellCommand { if (switched) { return 0; } else { - pw.printf("Failed to switch to user %d\n", userId); + pw.printf("Error: Failed to switch to user %d\n", userId); return 1; } }