Merge "WM: Move WindowManagerPolicy, DisplayFrames and WindowManagerInternal into services"
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 94a4dc8..60f451a 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -2099,7 +2099,7 @@
 
             long handle = getSyntheticPasswordHandleLocked(userId);
             authResult = mSpManager.unwrapPasswordBasedSyntheticPassword(
-                    getGateKeeperService(), handle, userCredential, userId);
+                    getGateKeeperService(), handle, userCredential, userId, progressCallback);
 
             if (authResult.credentialType != credentialType) {
                 Slog.e(TAG, "Credential type mismatch.");
@@ -2122,9 +2122,6 @@
         }
 
         if (response.getResponseCode() == VerifyCredentialResponse.RESPONSE_OK) {
-            if (progressCallback != null) {
-                progressCallback.onCredentialVerified();
-            }
             notifyActivePasswordMetricsAvailable(userCredential, userId);
             unlockKeystore(authResult.authToken.deriveKeyStorePassword(), userId);
 
@@ -2223,7 +2220,7 @@
         }
         long handle = getSyntheticPasswordHandleLocked(userId);
         AuthenticationResult authResult = mSpManager.unwrapPasswordBasedSyntheticPassword(
-                getGateKeeperService(), handle, savedCredential, userId);
+                getGateKeeperService(), handle, savedCredential, userId, null);
         VerifyCredentialResponse response = authResult.gkResponse;
         AuthenticationToken auth = authResult.authToken;
 
@@ -2277,7 +2274,7 @@
                 } else /* isSyntheticPasswordBasedCredentialLocked(userId) */ {
                     long pwdHandle = getSyntheticPasswordHandleLocked(userId);
                     auth = mSpManager.unwrapPasswordBasedSyntheticPassword(getGateKeeperService(),
-                            pwdHandle, null, userId).authToken;
+                            pwdHandle, null, userId, null).authToken;
                 }
             }
             if (isSyntheticPasswordBasedCredentialLocked(userId)) {
diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
index 1a1aa56..7a3a746 100644
--- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
+++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java
@@ -781,7 +781,8 @@
      * unknown. Caller might choose to validate it by examining AuthenticationResult.credentialType
      */
     public AuthenticationResult unwrapPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper,
-            long handle, String credential, int userId) throws RemoteException {
+            long handle, String credential, int userId,
+            ICheckCredentialProgressCallback progressCallback) throws RemoteException {
         if (credential == null) {
             credential = DEFAULT_PASSWORD;
         }
@@ -841,7 +842,11 @@
             applicationId = transformUnderSecdiscardable(pwdToken,
                     loadSecdiscardable(handle, userId));
         }
-
+        // Supplied credential passes first stage weaver/gatekeeper check so it should be correct.
+        // Notify the callback so the keyguard UI can proceed immediately.
+        if (progressCallback != null) {
+            progressCallback.onCredentialVerified();
+        }
         result.authToken = unwrapSyntheticPasswordBlob(handle, SYNTHETIC_PASSWORD_PASSWORD_BASED,
                 applicationId, sid, userId);
 
diff --git a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
index 4b98d9d..2358695 100644
--- a/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
+++ b/services/core/java/com/android/server/wm/WindowManagerShellCommand.java
@@ -16,6 +16,8 @@
 
 package com.android.server.wm;
 
+import static android.os.Build.IS_USER;
+
 import android.os.ShellCommand;
 
 import java.io.PrintWriter;
@@ -50,8 +52,10 @@
         pw.println("  help");
         pw.println("    Print this help text.");
         pw.println();
-        pw.println("  tracing (start | stop)");
-        pw.println("    start or stop window tracing");
-        pw.println();
+        if (!IS_USER){
+            pw.println("  tracing (start | stop)");
+            pw.println("    start or stop window tracing");
+            pw.println();
+        }
     }
 }
diff --git a/services/core/java/com/android/server/wm/WindowTracing.java b/services/core/java/com/android/server/wm/WindowTracing.java
index 6aa5101..c858b19 100644
--- a/services/core/java/com/android/server/wm/WindowTracing.java
+++ b/services/core/java/com/android/server/wm/WindowTracing.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.os.Build.IS_USER;
 import static com.android.server.wm.proto.WindowManagerTraceFileProto.ENTRY;
 import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER;
 import static com.android.server.wm.proto.WindowManagerTraceFileProto.MAGIC_NUMBER_H;
@@ -62,6 +63,10 @@
     }
 
     void startTrace(PrintWriter pw) throws IOException {
+        if (IS_USER){
+            logAndPrintln(pw, "Error: Tracing is not supported on user builds.");
+            return;
+        }
         synchronized (mLock) {
             logAndPrintln(pw, "Start tracing to " + mTraceFile + ".");
             mWriteQueue.clear();
@@ -83,6 +88,10 @@
     }
 
     void stopTrace(PrintWriter pw) {
+        if (IS_USER){
+            logAndPrintln(pw, "Error: Tracing is not supported on user builds.");
+            return;
+        }
         synchronized (mLock) {
             logAndPrintln(pw, "Stop tracing to " + mTraceFile + ". Waiting for traces to flush.");
             mEnabled = mEnabledLockFree = false;
@@ -150,7 +159,9 @@
     static WindowTracing createDefaultAndStartLooper(Context context) {
         File file = new File("/data/misc/wmtrace/wm_trace.pb");
         WindowTracing windowTracing = new WindowTracing(file);
-        new Thread(windowTracing::loop, "window_tracing").start();
+        if (!IS_USER){
+            new Thread(windowTracing::loop, "window_tracing").start();
+        }
         return windowTracing;
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
index 2ad0580..ff25172 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/SyntheticPasswordTests.java
@@ -66,10 +66,12 @@
                 LockPatternUtils.CREDENTIAL_TYPE_PASSWORD, authToken, PASSWORD_QUALITY_ALPHABETIC,
                 USER_ID);
 
-        AuthenticationResult result = manager.unwrapPasswordBasedSyntheticPassword(mGateKeeperService, handle, PASSWORD, USER_ID);
+        AuthenticationResult result = manager.unwrapPasswordBasedSyntheticPassword(
+                mGateKeeperService, handle, PASSWORD, USER_ID, null);
         assertEquals(result.authToken.deriveKeyStorePassword(), authToken.deriveKeyStorePassword());
 
-        result = manager.unwrapPasswordBasedSyntheticPassword(mGateKeeperService, handle, BADPASSWORD, USER_ID);
+        result = manager.unwrapPasswordBasedSyntheticPassword(mGateKeeperService, handle,
+                BADPASSWORD, USER_ID, null);
         assertNull(result.authToken);
     }