Tradefed: startUser uses new -w flag

Q will introduce a new -w flag to "am start-user", to wait until
the user has started and unlocked before continuing. Tradefed now
supports this call.

Bug: 126263999
Bug: 122305663
Bug: 123038606
Test: m -j tradefed-tests && ./tools/tradefederation/core/tests/run_tradefed_tests.sh
Change-Id: I371b0d73da75566909f51763fdd9ffff4e59fd06
Merged-In: Ic6bc3938bfd1af03d6e9b315749ac5439622678c
diff --git a/src/com/android/tradefed/device/TestDevice.java b/src/com/android/tradefed/device/TestDevice.java
index f78d42a..53ab028 100644
--- a/src/com/android/tradefed/device/TestDevice.java
+++ b/src/com/android/tradefed/device/TestDevice.java
@@ -909,11 +909,30 @@
      */
     @Override
     public boolean startUser(int userId) throws DeviceNotAvailableException {
-        final String output = executeShellCommand(String.format("am start-user %s", userId));
+        return startUser(userId, false);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean startUser(int userId, boolean waitFlag) throws DeviceNotAvailableException {
+        if (waitFlag) {
+            checkApiLevelAgainstNextRelease("start-user -w", 29);
+        }
+        String cmd = "am start-user " + (waitFlag ? "-w " : "") + userId;
+
+        CLog.d("Starting user with command: %s", cmd);
+        final String output = executeShellCommand(cmd);
         if (output.startsWith("Error")) {
             CLog.e("Failed to start user: %s", output);
             return false;
         }
+        if (waitFlag) {
+            String state = executeShellCommand("am get-started-user-state " + userId);
+            if (!state.contains("RUNNING_UNLOCKED")) {
+                CLog.w("User %s is not RUNNING_UNLOCKED after start-user -w. (%s).", userId, state);
+                return false;
+            }
+        }
         return true;
     }