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