From 4cce2aae7de11f9f5a84a69e93e2bb9dc7269907 Mon Sep 17 00:00:00 2001
From: Hikari-no-Tenshi <kyryljan.serhij@gmail.com>
Date: Sat, 24 Oct 2020 22:45:11 +0300
Subject: [PATCH] Make Quick Unlock compatible with long PIN/Password [1/2]

Idea from OnePlus Oxygen OS.

* Use AsyncTask for PIN/Password check.
* Restore call on main thread check.

@neobuddy89: Adapted for Android 12

Signed-off-by: Pranav Vashi <neobuddy89@gmail.com>
Change-Id: I87d0d783d45b9cadc6d397eba2bba08564b7599c
---

diff --git a/core/java/com/android/internal/widget/LockPatternUtils.java b/core/java/com/android/internal/widget/LockPatternUtils.java
index f015314..f573ea4 100644
--- a/core/java/com/android/internal/widget/LockPatternUtils.java
+++ b/core/java/com/android/internal/widget/LockPatternUtils.java
@@ -423,6 +423,7 @@
     @NonNull
     public VerifyCredentialResponse verifyCredential(@NonNull LockscreenCredential credential,
             int userId, @VerifyFlag int flags) {
+        throwIfCalledOnMainThread();
         try {
             final VerifyCredentialResponse response = getLockSettings().verifyCredential(
                     credential, userId, flags);
@@ -480,6 +481,7 @@
     public boolean checkCredential(@NonNull LockscreenCredential credential, int userId,
             @Nullable CheckCredentialProgressCallback progressCallback)
             throws RequestThrottledException {
+        throwIfCalledOnMainThread();
         try {
             VerifyCredentialResponse response = getLockSettings().checkCredential(
                     credential, userId, wrapCallback(progressCallback));
@@ -513,6 +515,7 @@
     @NonNull
     public VerifyCredentialResponse verifyTiedProfileChallenge(
             @NonNull LockscreenCredential credential, int userId, @VerifyFlag int flags) {
+        throwIfCalledOnMainThread();
         try {
             final VerifyCredentialResponse response = getLockSettings()
                     .verifyTiedProfileChallenge(credential, userId, flags);
@@ -1228,6 +1231,12 @@
         }
     }
 
+    private void throwIfCalledOnMainThread() {
+        if (Looper.getMainLooper().isCurrentThread()) {
+            throw new IllegalStateException("should not be called from the main thread.");
+        }
+    }
+
     public void registerStrongAuthTracker(final StrongAuthTracker strongAuthTracker) {
         try {
             getLockSettings().registerStrongAuthTracker(strongAuthTracker.getStub());
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java
index c883b80..75a5128 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordViewController.java
@@ -20,6 +20,7 @@
 
 import android.content.res.ColorStateList;
 import android.content.res.Resources;
+import android.os.AsyncTask;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.text.Editable;
@@ -104,12 +105,10 @@
                 onUserInput();
                 if (quickUnlock) {
                     LockscreenCredential entry = mView.getEnteredCredential();
-                    if (entry.size() > MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT
-                            && kpvCheckPassword(entry)) {
-                        mKeyguardSecurityCallback.reportUnlockAttempt(userId, true, 0);
-                        mKeyguardSecurityCallback.dismiss(true, userId);
-                        mView.resetPasswordText(true, true);
+                    if (entry.size() == keyguardPinPasswordLength()) {
+                        validateQuickUnlock(mLockPatternUtils, entry, userId);
                     }
+
                 }
             }
         }
@@ -345,11 +344,44 @@
                 || imm.getEnabledInputMethodSubtypeList(null, false).size() > 1;
     }
 
-    private boolean kpvCheckPassword(LockscreenCredential entry) {
-        try {
-            return mLockPatternUtils.checkCredential(entry, userId, null);
-        } catch (RequestThrottledException ex) {
-            return false;
+    private AsyncTask<?, ?, ?> validateQuickUnlock(final LockPatternUtils utils,
+            final LockscreenCredential password,
+            final int userId) {
+        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
+
+            @Override
+            protected Boolean doInBackground(Void... args) {
+                try {
+                    return utils.checkCredential(password, userId, null);
+                } catch (RequestThrottledException ex) {
+                    return false;
+                }
+            }
+
+            @Override
+            protected void onPostExecute(Boolean result) {
+                runQuickUnlock(result);
+            }
+        };
+        task.execute();
+        return task;
+    }
+
+    private void runQuickUnlock(Boolean matched) {
+        if (matched) {
+            mKeyguardSecurityCallback.reportUnlockAttempt(userId, true, 0);
+            mKeyguardSecurityCallback.dismiss(true, userId);
+            mView.resetPasswordText(true, true);
         }
     }
+
+    private int keyguardPinPasswordLength() {
+        int pinPasswordLength = -1;
+        try {
+            pinPasswordLength = (int) mLockPatternUtils.getLockSettings().getLong("lockscreen.pin_password_length", 0, userId);
+        } catch (Exception e) {
+            // do nothing
+        }
+        return pinPasswordLength >= 4 ? pinPasswordLength : -1;
+    }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index 1044e8d..1b5189d 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -18,6 +18,7 @@
 
 import static com.android.keyguard.KeyguardAbsKeyInputView.MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT;
 
+import android.os.AsyncTask;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.view.View;
@@ -50,6 +51,8 @@
 
     private LockPatternUtils mLockPatternUtils;
 
+    private KeyguardSecurityCallback mKeyguardSecurityCallback;
+
     private static List<Integer> sNumbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 0);
 
     protected KeyguardPinViewController(KeyguardPINView view,
@@ -67,6 +70,7 @@
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mPostureController = postureController;
         mLockPatternUtils = lockPatternUtils;
+        mKeyguardSecurityCallback = keyguardSecurityCallback;
     }
 
     @Override
@@ -76,8 +80,8 @@
         View cancelBtn = mView.findViewById(R.id.cancel_button);
         if (cancelBtn != null) {
             cancelBtn.setOnClickListener(view -> {
-                getKeyguardSecurityCallback().reset();
-                getKeyguardSecurityCallback().onCancelClicked();
+                mKeyguardSecurityCallback.reset();
+                mKeyguardSecurityCallback.onCancelClicked();
             });
         }
 
@@ -111,7 +115,9 @@
         if (quickUnlock) {
             mPasswordEntry.setQuickUnlockListener(new QuickUnlockListener() {
                 public void onValidateQuickUnlock(String password) {
-                    validateQuickUnlock(password);
+                    if (password != null && password.length() == keyguardPinPasswordLength()) {
+                        validateQuickUnlock(mLockPatternUtils, password, userId);
+                    }
                 }
             });
         } else {
@@ -145,24 +151,47 @@
                 mKeyguardUpdateMonitor.needsSlowUnlockTransition(), finishRunnable);
     }
 
-    private void validateQuickUnlock(String password) {
-        if (password != null) {
-            if (password.length() > MINIMUM_PASSWORD_LENGTH_BEFORE_REPORT
-                    && kpvCheckPassword(password)) {
-                mPasswordEntry.setEnabled(false);
-                getKeyguardSecurityCallback().reportUnlockAttempt(userId, true, 0);
-                getKeyguardSecurityCallback().dismiss(true, userId);
-                mView.resetPasswordText(true, true);
+    private AsyncTask<?, ?, ?> validateQuickUnlock(final LockPatternUtils utils,
+            final String password,
+            final int userId) {
+        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
+
+            @Override
+            protected Boolean doInBackground(Void... args) {
+                try {
+                    return utils.checkCredential(
+                           LockscreenCredential.createPinOrNone(password),
+                                                userId, null);
+                } catch (RequestThrottledException ex) {
+                    return false;
+                }
             }
+
+            @Override
+            protected void onPostExecute(Boolean result) {
+                runQuickUnlock(result);
+            }
+        };
+        task.execute();
+        return task;
+    }
+
+    private void runQuickUnlock(Boolean matched) {
+        if (matched) {
+            mPasswordEntry.setEnabled(false);
+            mKeyguardSecurityCallback.reportUnlockAttempt(userId, true, 0);
+            mKeyguardSecurityCallback.dismiss(true, userId);
+            mView.resetPasswordText(true, true);
         }
     }
 
-    private boolean kpvCheckPassword(String password) {
+    private int keyguardPinPasswordLength() {
+        int pinPasswordLength = -1;
         try {
-            return mLockPatternUtils.checkCredential(
-                    LockscreenCredential.createPinOrNone(password), userId, null);
-        } catch (RequestThrottledException ex) {
-            return false;
+            pinPasswordLength = (int) mLockPatternUtils.getLockSettings().getLong("lockscreen.pin_password_length", -1, userId);
+        } catch (Exception e) {
+            // do nothing
         }
+        return pinPasswordLength >= 4 ? pinPasswordLength : -1;
     }
 }
