Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package org.chromium.sync.signin; | 5 package org.chromium.sync.signin; |
| 6 | 6 |
| 7 | 7 |
| 8 import android.Manifest; | 8 import android.Manifest; |
| 9 import android.accounts.Account; | 9 import android.accounts.Account; |
| 10 import android.accounts.AccountManager; | |
| 11 import android.accounts.AccountManagerFuture; | |
| 12 import android.accounts.AuthenticatorDescription; | 10 import android.accounts.AuthenticatorDescription; |
| 13 import android.accounts.AuthenticatorException; | |
| 14 import android.accounts.OperationCanceledException; | |
| 15 import android.content.Context; | 11 import android.content.Context; |
| 16 import android.content.pm.PackageManager; | 12 import android.content.pm.PackageManager; |
| 17 import android.os.AsyncTask; | 13 import android.os.AsyncTask; |
| 18 import android.os.Build; | 14 import android.os.Build; |
| 19 import android.os.Bundle; | |
| 20 import android.os.Process; | 15 import android.os.Process; |
| 21 import android.util.Log; | |
| 22 | 16 |
| 23 import org.chromium.base.Callback; | 17 import org.chromium.base.Callback; |
| 24 import org.chromium.base.ThreadUtils; | |
| 25 import org.chromium.base.VisibleForTesting; | 18 import org.chromium.base.VisibleForTesting; |
| 26 import org.chromium.net.NetworkChangeNotifier; | 19 import org.chromium.net.NetworkChangeNotifier; |
| 27 | 20 |
| 28 import java.io.IOException; | |
| 29 import java.util.ArrayList; | 21 import java.util.ArrayList; |
| 30 import java.util.List; | 22 import java.util.List; |
| 31 import java.util.Locale; | 23 import java.util.Locale; |
| 32 import java.util.concurrent.atomic.AtomicBoolean; | 24 import java.util.concurrent.atomic.AtomicBoolean; |
| 33 import java.util.concurrent.atomic.AtomicInteger; | 25 import java.util.concurrent.atomic.AtomicInteger; |
| 34 import java.util.regex.Pattern; | 26 import java.util.regex.Pattern; |
| 35 | 27 |
| 36 /** | 28 /** |
| 37 * AccountManagerHelper wraps our access of AccountManager in Android. | 29 * AccountManagerHelper wraps our access of AccountManager in Android. |
| 38 * | 30 * |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 348 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M | 340 return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M |
| 349 || mApplicationContext.checkPermission("android.permission.USE_C REDENTIALS", | 341 || mApplicationContext.checkPermission("android.permission.USE_C REDENTIALS", |
| 350 Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_G RANTED; | 342 Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_G RANTED; |
| 351 } | 343 } |
| 352 | 344 |
| 353 public boolean hasGetAccountsPermission() { | 345 public boolean hasGetAccountsPermission() { |
| 354 return mApplicationContext.checkPermission(Manifest.permission.GET_ACCOU NTS, | 346 return mApplicationContext.checkPermission(Manifest.permission.GET_ACCOU NTS, |
| 355 Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_G RANTED; | 347 Process.myPid(), Process.myUid()) == PackageManager.PERMISSION_G RANTED; |
| 356 } | 348 } |
| 357 | 349 |
| 358 // Gets the auth token synchronously | |
| 359 private String getAuthTokenInner(AccountManagerFuture<Bundle> future, | |
| 360 AtomicBoolean isTransientError) { | |
| 361 try { | |
| 362 Bundle result = future.getResult(); | |
| 363 if (result != null) { | |
| 364 return result.getString(AccountManager.KEY_AUTHTOKEN); | |
| 365 } else { | |
| 366 Log.w(TAG, "Auth token - getAuthToken returned null"); | |
| 367 } | |
| 368 } catch (OperationCanceledException e) { | |
| 369 Log.w(TAG, "Auth token - operation cancelled", e); | |
| 370 } catch (AuthenticatorException e) { | |
| 371 Log.w(TAG, "Auth token - authenticator exception", e); | |
| 372 } catch (IOException e) { | |
| 373 Log.w(TAG, "Auth token - IO exception", e); | |
| 374 isTransientError.set(true); | |
| 375 } | |
| 376 return null; | |
| 377 } | |
| 378 | |
| 379 private void getAuthTokenAsynchronously(final Account account, final String authTokenType, | 350 private void getAuthTokenAsynchronously(final Account account, final String authTokenType, |
| 380 final GetAuthTokenCallback callback, final AtomicInteger numTries, | 351 final GetAuthTokenCallback callback, final AtomicInteger numTries, |
| 381 final AtomicBoolean isTransientError, final ConnectionRetry retry) { | 352 final AtomicBoolean isTransientError, final ConnectionRetry retry) { |
| 382 // Return null token for no USE_CREDENTIALS permission. | |
| 383 if (!hasUseCredentialsPermission()) { | |
| 384 ThreadUtils.runOnUiThread(new Runnable() { | |
| 385 @Override | |
| 386 public void run() { | |
| 387 callback.tokenUnavailable(false); | |
| 388 } | |
| 389 }); | |
| 390 return; | |
| 391 } | |
| 392 final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken ( | |
| 393 account, authTokenType, true, null, null); | |
| 394 isTransientError.set(false); | 353 isTransientError.set(false); |
| 395 | |
| 396 new AsyncTask<Void, Void, String>() { | 354 new AsyncTask<Void, Void, String>() { |
| 397 @Override | 355 @Override |
| 398 public String doInBackground(Void... params) { | 356 public String doInBackground(Void... params) { |
| 399 return getAuthTokenInner(future, isTransientError); | 357 try { |
| 358 return mAccountManager.getAuthToken(account, authTokenType); | |
| 359 } catch (AuthException ex) { | |
| 360 isTransientError.set(ex.isTransientError()); | |
|
Bernhard Bauer
2015/11/19 15:23:33
Can you add a TODO here to handle the recovery int
knn
2015/11/19 16:09:25
Done.
| |
| 361 } | |
| 362 return null; | |
| 400 } | 363 } |
| 401 @Override | 364 @Override |
| 402 public void onPostExecute(String authToken) { | 365 public void onPostExecute(String authToken) { |
| 403 onGotAuthTokenResult(account, authTokenType, authToken, callback , numTries, | 366 onGotAuthTokenResult(account, authTokenType, authToken, callback , numTries, |
| 404 isTransientError, retry); | 367 isTransientError, retry); |
| 405 } | 368 } |
| 406 }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); | 369 }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
| 407 } | 370 } |
| 408 | 371 |
| 409 private void onGotAuthTokenResult(Account account, String authTokenType, Str ing authToken, | 372 private void onGotAuthTokenResult(Account account, String authTokenType, Str ing authToken, |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 452 if (authToken != null && !authToken.isEmpty()) { | 415 if (authToken != null && !authToken.isEmpty()) { |
| 453 mAccountManager.invalidateAuthToken(GOOGLE_ACCOUNT_TYPE, authToken); | 416 mAccountManager.invalidateAuthToken(GOOGLE_ACCOUNT_TYPE, authToken); |
| 454 } | 417 } |
| 455 } | 418 } |
| 456 | 419 |
| 457 public void checkChildAccount(Account account, Callback<Boolean> callback) { | 420 public void checkChildAccount(Account account, Callback<Boolean> callback) { |
| 458 String[] features = {FEATURE_IS_CHILD_ACCOUNT_KEY}; | 421 String[] features = {FEATURE_IS_CHILD_ACCOUNT_KEY}; |
| 459 mAccountManager.hasFeatures(account, features, callback); | 422 mAccountManager.hasFeatures(account, features, callback); |
| 460 } | 423 } |
| 461 } | 424 } |
| OLD | NEW |