summaryrefslogtreecommitdiffstats
path: root/sync
diff options
context:
space:
mode:
authornyquist@chromium.org <nyquist@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 16:20:01 +0000
committernyquist@chromium.org <nyquist@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-08-01 16:20:01 +0000
commit6cc5dab2db1834a2b80e70d8d3c26254935cd014 (patch)
tree3afba7bf67c8af0dd21067a858eeb7e44e7dcac8 /sync
parent6788061c49ff424e0a7fa5e2f48d10de8e413aae (diff)
downloadchromium_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')
-rw-r--r--sync/android/java/src/org/chromium/sync/signin/AccountManagerHelper.java58
-rw-r--r--sync/test/android/javatests/src/org/chromium/sync/test/util/AccountHolder.java4
-rw-r--r--sync/test/android/javatests/src/org/chromium/sync/test/util/MockAccountManager.java4
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() +