Chromium Code Reviews| Index: remoting/android/java/src/org/chromium/chromoting/Chromoting.java |
| diff --git a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java |
| index f21efccb8eeda585a3eafaf16852bed1517fe911..be378904553fec2c44085415258644ed5443d4a1 100644 |
| --- a/remoting/android/java/src/org/chromium/chromoting/Chromoting.java |
| +++ b/remoting/android/java/src/org/chromium/chromoting/Chromoting.java |
| @@ -96,6 +96,13 @@ public class Chromoting extends Activity implements JniInterface.ConnectionListe |
| */ |
| boolean mTriedNewAuthToken; |
| + /** |
| + * Flag to track whether a call to AccountManager.getAuthToken() is currently pending. |
| + * This avoids infinitely-nested calls in case onStart() gets triggered a second time |
| + * while a token is being fetched. |
| + */ |
| + private boolean mWaitingForAuthToken = false; |
| + |
| /** Shows a warning explaining that a Google account is required, then closes the activity. */ |
| private void showNoAccountsDialog() { |
| AlertDialog.Builder builder = new AlertDialog.Builder(this); |
| @@ -292,16 +299,27 @@ public class Chromoting extends Activity implements JniInterface.ConnectionListe |
| } |
| private void refreshHostList() { |
| + if (mWaitingForAuthToken) { |
| + return; |
| + } |
| + |
| mTriedNewAuthToken = false; |
| setHostListProgressVisible(true); |
| // The refresh button simply makes use of the currently-chosen account. |
| + requestAuthToken(); |
| + } |
| + |
| + private void requestAuthToken() { |
| AccountManager.get(this).getAuthToken(mAccount, TOKEN_SCOPE, null, this, this, null); |
| + mWaitingForAuthToken = true; |
| } |
| @Override |
| public void run(AccountManagerFuture<Bundle> future) { |
| Log.i("auth", "User finished with auth dialogs"); |
| + mWaitingForAuthToken = false; |
| + |
| Bundle result = null; |
| String explanation = null; |
| try { |
| @@ -316,6 +334,7 @@ public class Chromoting extends Activity implements JniInterface.ConnectionListe |
| } |
| if (result == null) { |
| + setHostListProgressVisible(false); |
| if (explanation != null) { |
| Toast.makeText(this, explanation, Toast.LENGTH_LONG).show(); |
| } |
| @@ -387,7 +406,7 @@ public class Chromoting extends Activity implements JniInterface.ConnectionListe |
| Log.w("auth", "Requesting renewal of rejected auth token"); |
| authenticator.invalidateAuthToken(mAccount.type, mToken); |
| mToken = null; |
| - authenticator.getAuthToken(mAccount, TOKEN_SCOPE, null, this, this, null); |
| + requestAuthToken(); |
|
Jamie
2014/09/26 21:31:17
Does this not also need to be guarded against reen
Lambros
2014/09/26 22:36:34
No, because we've got the token at this point, so
|
| // We're not in an error state *yet*. |
| return; |