diff options
author | nyquist@chromium.org <nyquist@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 16:20:01 +0000 |
---|---|---|
committer | nyquist@chromium.org <nyquist@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-01 16:20:01 +0000 |
commit | 6cc5dab2db1834a2b80e70d8d3c26254935cd014 (patch) | |
tree | 3afba7bf67c8af0dd21067a858eeb7e44e7dcac8 /sync | |
parent | 6788061c49ff424e0a7fa5e2f48d10de8e413aae (diff) | |
download | chromium_src-6cc5dab2db1834a2b80e70d8d3c26254935cd014.zip chromium_src-6cc5dab2db1834a2b80e70d8d3c26254935cd014.tar.gz chromium_src-6cc5dab2db1834a2b80e70d8d3c26254935cd014.tar.bz2 |
Fix issue with null-value OAuth2 tokens for Android.
Currently, AndroidProfileOAuth2TokenServiceHelper crashes if the auth
token returned from the account manager is null. This CL makes it
possible to get null tokens back.
A test is also added, and the test harness is improved to support adding
null auth-tokens.
This is try 2. Original CL reviewed in:
https://chromiumcodereview.appspot.com/20692003
BUG=239491
NOTRY=true
Review URL: https://chromiumcodereview.appspot.com/21436002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@215048 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'sync')
3 files changed, 44 insertions, 22 deletions
diff --git a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java index 3ed9a22..01ad162 100644 --- a/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java +++ b/sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java @@ -20,6 +20,7 @@ import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; +import org.chromium.base.ThreadUtils; import org.chromium.net.NetworkChangeNotifier; import java.io.IOException; @@ -250,29 +251,44 @@ public class AccountManagerHelper { } final AccountManagerFuture<Bundle> finalFuture = future; errorEncountered.set(false); - new AsyncTask<Void, Void, String>() { - @Override - public String doInBackground(Void... params) { - return getAuthTokenInner(finalFuture, errorEncountered); - } - @Override - public void onPostExecute(String authToken) { - if (authToken != null || !errorEncountered.get() || - numTries.incrementAndGet() == MAX_TRIES || - !NetworkChangeNotifier.isInitialized()) { - callback.tokenAvailable(authToken); - return; - } - if (retry == null) { - ConnectionRetry newRetry = new ConnectionRetry(account, authTokenType, callback, - numTries, errorEncountered); - NetworkChangeNotifier.addConnectionTypeObserver(newRetry); + + // On ICS onPostExecute is never called when running an AsyncTask from a different thread + // than the UI thread. + if (ThreadUtils.runningOnUiThread()) { + new AsyncTask<Void, Void, String>() { + @Override + public String doInBackground(Void... params) { + return getAuthTokenInner(finalFuture, errorEncountered); } - else { - NetworkChangeNotifier.addConnectionTypeObserver(retry); + @Override + public void onPostExecute(String authToken) { + onGotAuthTokenResult(account, authTokenType, authToken, callback, numTries, + errorEncountered, retry); } - } - }.execute(); + }.execute(); + } else { + String authToken = getAuthTokenInner(finalFuture, errorEncountered); + onGotAuthTokenResult(account, authTokenType, authToken, callback, numTries, + errorEncountered, retry); + } + } + + private void onGotAuthTokenResult(Account account, String authTokenType, String authToken, + GetAuthTokenCallback callback, AtomicInteger numTries, AtomicBoolean errorEncountered, + ConnectionRetry retry) { + if (authToken != null || !errorEncountered.get() || + numTries.incrementAndGet() == MAX_TRIES || + !NetworkChangeNotifier.isInitialized()) { + callback.tokenAvailable(authToken); + return; + } + if (retry == null) { + ConnectionRetry newRetry = new ConnectionRetry(account, authTokenType, callback, + numTries, errorEncountered); + NetworkChangeNotifier.addConnectionTypeObserver(newRetry); + } else { + NetworkChangeNotifier.addConnectionTypeObserver(retry); + } } /** diff --git a/sync/test/android/javatests/src/org/chromium/sync/test/util/AccountHolder.java b/sync/test/android/javatests/src/org/chromium/sync/test/util/AccountHolder.java index 1b346a1..cff504c 100644 --- a/sync/test/android/javatests/src/org/chromium/sync/test/util/AccountHolder.java +++ b/sync/test/android/javatests/src/org/chromium/sync/test/util/AccountHolder.java @@ -48,6 +48,10 @@ public class AccountHolder { return mPassword; } + public boolean hasAuthTokenRegistered(String authTokenType) { + return mAuthTokens.containsKey(authTokenType); + } + public String getAuthToken(String authTokenType) { return mAuthTokens.get(authTokenType); } diff --git a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java b/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java index da16fae..cb330b8 100644 --- a/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java +++ b/sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java @@ -264,7 +264,9 @@ public class MockAccountManager implements AccountManagerDelegate { private String internalGenerateAndStoreAuthToken(AccountHolder ah, String authTokenType) { synchronized (mAccounts) { - if (ah.getAuthToken(authTokenType) == null) { + // Some tests register auth tokens with value null, and those should be preserved. + if (!ah.hasAuthTokenRegistered(authTokenType) && + ah.getAuthToken(authTokenType) == null) { // No authtoken registered. Need to create one. String authToken = UUID.randomUUID().toString(); Log.d(TAG, "Created new auth token for " + ah.getAccount() + |