16e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiapackage com.android.internal.widget;
26e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
36e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiaimport android.os.AsyncTask;
46e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
52397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Moralesimport com.android.internal.widget.LockPatternUtils.RequestThrottledException;
62397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales
79475460e6627351d267450793b67c383089b551bNancy Zhengimport java.util.ArrayList;
86e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiaimport java.util.List;
96e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
106e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia/**
116e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia * Helper class to check/verify PIN/Password/Pattern asynchronously.
126e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia */
136e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xiapublic final class LockPatternChecker {
146e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
156e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Interface for a callback to be invoked after security check.
166e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
176e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public interface OnCheckCallback {
18e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi
19e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        /**
20e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi         * Invoked as soon as possible we know that the credentials match. This will be called
21e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi         * earlier than {@link #onChecked} but only if the credentials match.
22e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi         */
23e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi        default void onEarlyMatched() {}
24e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi
256e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        /**
266e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         * Invoked when a security check is finished.
276e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         *
286e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         * @param matched Whether the PIN/Password/Pattern matches the stored one.
292397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales         * @param throttleTimeoutMs The amount of time in ms to wait before reattempting
302397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales         * the call. Only non-0 if matched is false.
316e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         */
322397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales        void onChecked(boolean matched, int throttleTimeoutMs);
336e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
346e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
356e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
366e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Interface for a callback to be invoked after security verification.
376e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
386e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public interface OnVerifyCallback {
396e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        /**
406e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         * Invoked when a security verification is finished.
416e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         *
426e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         * @param attestation The attestation that the challenge was verified, or null.
432397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales         * @param throttleTimeoutMs The amount of time in ms to wait before reattempting
442397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales         * the call. Only non-0 if attestation is null.
456e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia         */
462397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales        void onVerified(byte[] attestation, int throttleTimeoutMs);
476e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
486e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
496e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
506e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Verify a pattern asynchronously.
516e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     *
526e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param utils The LockPatternUtils instance to use.
536e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param pattern The pattern to check.
546e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param challenge The challenge to verify against the pattern.
556e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param userId The user to check against the pattern.
566e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param callback The callback to be invoked with the verification result.
576e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
586e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public static AsyncTask<?, ?, ?> verifyPattern(final LockPatternUtils utils,
596e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final List<LockPatternView.Cell> pattern,
606e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final long challenge,
616e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final int userId,
626e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final OnVerifyCallback callback) {
636e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        AsyncTask<Void, Void, byte[]> task = new AsyncTask<Void, Void, byte[]>() {
642397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales            private int mThrottleTimeout;
659475460e6627351d267450793b67c383089b551bNancy Zheng            private List<LockPatternView.Cell> patternCopy;
669475460e6627351d267450793b67c383089b551bNancy Zheng
679475460e6627351d267450793b67c383089b551bNancy Zheng            @Override
689475460e6627351d267450793b67c383089b551bNancy Zheng            protected void onPreExecute() {
699475460e6627351d267450793b67c383089b551bNancy Zheng                // Make a copy of the pattern to prevent race conditions.
709475460e6627351d267450793b67c383089b551bNancy Zheng                // No need to clone the individual cells because they are immutable.
719475460e6627351d267450793b67c383089b551bNancy Zheng                patternCopy = new ArrayList(pattern);
729475460e6627351d267450793b67c383089b551bNancy Zheng            }
732397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales
746e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
756e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected byte[] doInBackground(Void... args) {
762397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                try {
779475460e6627351d267450793b67c383089b551bNancy Zheng                    return utils.verifyPattern(patternCopy, challenge, userId);
782397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                } catch (RequestThrottledException ex) {
792397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    mThrottleTimeout = ex.getTimeoutMs();
802397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    return null;
812397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                }
826e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
836e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
846e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
856e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected void onPostExecute(byte[] result) {
862397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                callback.onVerified(result, mThrottleTimeout);
876e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
886e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        };
896e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        task.execute();
906e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        return task;
916e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
926e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
936e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
946e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Checks a pattern asynchronously.
956e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     *
966e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param utils The LockPatternUtils instance to use.
976e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param pattern The pattern to check.
986e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param userId The user to check against the pattern.
996e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param callback The callback to be invoked with the check result.
1006e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
1016e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public static AsyncTask<?, ?, ?> checkPattern(final LockPatternUtils utils,
1026e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final List<LockPatternView.Cell> pattern,
1036e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final int userId,
1046e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final OnCheckCallback callback) {
1056e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
1062397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales            private int mThrottleTimeout;
1079475460e6627351d267450793b67c383089b551bNancy Zheng            private List<LockPatternView.Cell> patternCopy;
1089475460e6627351d267450793b67c383089b551bNancy Zheng
1099475460e6627351d267450793b67c383089b551bNancy Zheng            @Override
1109475460e6627351d267450793b67c383089b551bNancy Zheng            protected void onPreExecute() {
1119475460e6627351d267450793b67c383089b551bNancy Zheng                // Make a copy of the pattern to prevent race conditions.
1129475460e6627351d267450793b67c383089b551bNancy Zheng                // No need to clone the individual cells because they are immutable.
1139475460e6627351d267450793b67c383089b551bNancy Zheng                patternCopy = new ArrayList(pattern);
1149475460e6627351d267450793b67c383089b551bNancy Zheng            }
1152397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales
1166e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
1176e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected Boolean doInBackground(Void... args) {
1182397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                try {
1199475460e6627351d267450793b67c383089b551bNancy Zheng                    return utils.checkPattern(patternCopy, userId, callback::onEarlyMatched);
1202397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                } catch (RequestThrottledException ex) {
1212397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    mThrottleTimeout = ex.getTimeoutMs();
1222397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    return false;
1232397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                }
1246e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
1256e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
1266e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
1276e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected void onPostExecute(Boolean result) {
1282397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                callback.onChecked(result, mThrottleTimeout);
1296e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
1306e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        };
1316e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        task.execute();
1326e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        return task;
1336e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
1346e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
1356e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
1366e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Verify a password asynchronously.
1376e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     *
1386e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param utils The LockPatternUtils instance to use.
1396e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param password The password to check.
1406e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param challenge The challenge to verify against the pattern.
1416e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param userId The user to check against the pattern.
1426e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param callback The callback to be invoked with the verification result.
1436e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
1446e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public static AsyncTask<?, ?, ?> verifyPassword(final LockPatternUtils utils,
1456e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final String password,
1466e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final long challenge,
1476e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final int userId,
1486e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final OnVerifyCallback callback) {
1496e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        AsyncTask<Void, Void, byte[]> task = new AsyncTask<Void, Void, byte[]>() {
1502397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales            private int mThrottleTimeout;
1512397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales
1526e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
1536e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected byte[] doInBackground(Void... args) {
1542397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                try {
1552397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    return utils.verifyPassword(password, challenge, userId);
1562397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                } catch (RequestThrottledException ex) {
1572397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    mThrottleTimeout = ex.getTimeoutMs();
1582397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    return null;
1592397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                }
1606e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
1616e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
1626e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
1636e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected void onPostExecute(byte[] result) {
1642397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                callback.onVerified(result, mThrottleTimeout);
1656e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
1666e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        };
1676e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        task.execute();
1686e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        return task;
1696e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
1706e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
1716e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    /**
17253940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * Verify a password asynchronously.
17353940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     *
17453940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * @param utils The LockPatternUtils instance to use.
17553940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * @param password The password to check.
17653940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * @param challenge The challenge to verify against the pattern.
17753940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * @param userId The user to check against the pattern.
17853940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     * @param callback The callback to be invoked with the verification result.
17953940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai     */
18053940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai    public static AsyncTask<?, ?, ?> verifyTiedProfileChallenge(final LockPatternUtils utils,
18153940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            final String password,
18253940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            final boolean isPattern,
18353940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            final long challenge,
18453940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            final int userId,
18553940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            final OnVerifyCallback callback) {
18653940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai        AsyncTask<Void, Void, byte[]> task = new AsyncTask<Void, Void, byte[]>() {
18753940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            private int mThrottleTimeout;
18853940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai
18953940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            @Override
19053940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            protected byte[] doInBackground(Void... args) {
19153940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                try {
19253940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                    return utils.verifyTiedProfileChallenge(password, isPattern, challenge, userId);
19353940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                } catch (RequestThrottledException ex) {
19453940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                    mThrottleTimeout = ex.getTimeoutMs();
19553940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                    return null;
19653940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                }
19753940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            }
19853940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai
19953940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            @Override
20053940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            protected void onPostExecute(byte[] result) {
20153940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai                callback.onVerified(result, mThrottleTimeout);
20253940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai            }
20353940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai        };
20453940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai        task.execute();
20553940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai        return task;
20653940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai    }
20753940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai
20853940d4c7f45a26d8b571982a1f8f4b8094aa5e0Ricky Wai    /**
2096e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * Checks a password asynchronously.
2106e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     *
2116e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param utils The LockPatternUtils instance to use.
2126e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param password The password to check.
2136e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param userId The user to check against the pattern.
2146e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     * @param callback The callback to be invoked with the check result.
2156e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia     */
2166e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    public static AsyncTask<?, ?, ?> checkPassword(final LockPatternUtils utils,
2176e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final String password,
2186e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final int userId,
2196e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            final OnCheckCallback callback) {
2206e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        AsyncTask<Void, Void, Boolean> task = new AsyncTask<Void, Void, Boolean>() {
2212397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales            private int mThrottleTimeout;
2222397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales
2236e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
2246e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected Boolean doInBackground(Void... args) {
2252397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                try {
226e8fde5d9666eea10307cbc27f4b1a94d3cbb4ec9Jorim Jaggi                    return utils.checkPassword(password, userId, callback::onEarlyMatched);
2272397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                } catch (RequestThrottledException ex) {
2282397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    mThrottleTimeout = ex.getTimeoutMs();
2292397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                    return false;
2302397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                }
2316e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
2326e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia
2336e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            @Override
2346e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            protected void onPostExecute(Boolean result) {
2352397427cb1a0bad8a42e6a342dcf29b31e40a234Andres Morales                callback.onChecked(result, mThrottleTimeout);
2366e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia            }
2376e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        };
2386e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        task.execute();
2396e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia        return task;
2406e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia    }
2416e38058908d6e49a241e384cd7023d9ac0927afbXiyuan Xia}
242