Merge "Make "work mode on dialog" show personal challenge in unified work lock" into nyc-dev
diff --git a/core/java/android/os/UserManager.java b/core/java/android/os/UserManager.java
index cd32059..dd53cbb 100644
--- a/core/java/android/os/UserManager.java
+++ b/core/java/android/os/UserManager.java
@@ -1685,6 +1685,7 @@
 
     /**
      * Returns whether the given profile is in quiet mode or not.
+     * Notes: Quiet mode is only supported for managed profiles.
      *
      * @param userHandle The user handle of the profile to be queried.
      * @return true if the profile is in quiet mode, false otherwise.
diff --git a/services/core/java/com/android/server/LockSettingsService.java b/services/core/java/com/android/server/LockSettingsService.java
index bc9f69e..a3ef6b6b 100644
--- a/services/core/java/com/android/server/LockSettingsService.java
+++ b/services/core/java/com/android/server/LockSettingsService.java
@@ -705,9 +705,9 @@
             }
         };
 
-        // Check if the user is currently in quiet mode and start it otherwise
-        if (mUserManager.isQuietModeEnabled(new UserHandle(userId))
-                && mLockPatternUtils.isSeparateProfileChallengeEnabled(userId)) {
+        // Turn off quite mode if it's enabled, only managed profile can return true for now, it
+        // will return false if it is not a managed profile.
+        if (mUserManager.isQuietModeEnabled(new UserHandle(userId))) {
             mUserManager.setQuietModeEnabled(userId, false);
         }
 
@@ -729,6 +729,7 @@
                     // Unlock managed profile with unified lock
                     if (pi.isManagedProfile()
                             && !mLockPatternUtils.isSeparateProfileChallengeEnabled(pi.id)
+                            && !pi.isQuietModeEnabled()
                             && mStorage.hasChildProfileLock(pi.id)) {
                         unlockChildProfile(pi.id);
                     }
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 7ea5919..a085370 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -691,9 +691,9 @@
 
     @Override
     public boolean trySetQuietModeDisabled(int userHandle, IntentSender target) {
+        final int credentialOwnerUserId = getCredentialOwnerProfile(userHandle);
         if (mContext.getSystemService(StorageManager.class).isUserKeyUnlocked(userHandle)
-                || !mLockPatternUtils.isSecure(userHandle)
-                || !mLockPatternUtils.isSeparateProfileChallengeEnabled(userHandle)) {
+                || !mLockPatternUtils.isSecure(credentialOwnerUserId)) {
             // if the user is already unlocked, no need to show a profile challenge
             setQuietModeEnabled(userHandle, false);
             return true;
@@ -704,6 +704,9 @@
             // otherwise, we show a profile challenge to trigger decryption of the user
             final KeyguardManager km = (KeyguardManager) mContext.getSystemService(
                     Context.KEYGUARD_SERVICE);
+            // We should use userHandle not credentialOwnerUserId here, as even if it is unified
+            // lock, confirm screenlock page will know and show personal challenge, and unlock
+            // work profile when personal challenge is correct
             final Intent unlockIntent = km.createConfirmDeviceCredentialIntent(null, null,
                     userHandle);
             if (unlockIntent == null) {