Index: chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java |
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java |
index 9aec4c566a0302a5830f6fd5d47c56bcdfb446eb..097272e6149a3c2ff277655e0bcc3be6f670e115 100644 |
--- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java |
+++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AccountTrackerService.java |
@@ -4,6 +4,7 @@ |
package org.chromium.chrome.browser.signin; |
+import android.accounts.Account; |
import android.content.Context; |
import android.os.AsyncTask; |
@@ -11,26 +12,25 @@ import org.chromium.base.Log; |
import org.chromium.base.ObserverList; |
import org.chromium.base.ThreadUtils; |
import org.chromium.base.VisibleForTesting; |
+import org.chromium.base.annotations.JNINamespace; |
+import org.chromium.sync.signin.AccountManagerDelegate.Callback; |
import org.chromium.sync.signin.AccountManagerHelper; |
-import java.util.List; |
- |
/** |
* Android wrapper of AccountTrackerService which provides access from the java layer. |
* It offers the capability of fetching and seeding system accounts into AccountTrackerService in C++ |
* layer, and notifies observers when it is complete. |
*/ |
+@JNINamespace("signin::android") |
public class AccountTrackerService { |
- private static final String TAG = "cr.AccountService"; |
+ private static final String TAG = "AccountService"; |
private static AccountTrackerService sAccountTrackerService; |
- private static AccountIdProvider sAccountIdProvider; |
private SystemAccountsSeedingStatus mSystemAccountsSeedingStatus = |
SystemAccountsSeedingStatus.SEEDING_NOT_STARTED; |
private boolean mForceRefresh; |
private boolean mSyncForceRefreshedForTest; |
private final Context mContext; |
- private final long mNativeAccountTrackerService; |
private enum SystemAccountsSeedingStatus { |
SEEDING_NOT_STARTED, |
@@ -56,14 +56,12 @@ public class AccountTrackerService { |
ThreadUtils.assertOnUiThread(); |
if (sAccountTrackerService == null) { |
sAccountTrackerService = new AccountTrackerService(context); |
- sAccountIdProvider = AccountIdProvider.getInstance(); |
} |
return sAccountTrackerService; |
} |
private AccountTrackerService(Context context) { |
mContext = context; |
- mNativeAccountTrackerService = nativeInit(); |
} |
/** |
@@ -74,11 +72,9 @@ public class AccountTrackerService { |
if (mSystemAccountsSeedingStatus == SystemAccountsSeedingStatus.SEEDING_DONE) { |
return true; |
} |
- |
if (mSystemAccountsSeedingStatus == SystemAccountsSeedingStatus.SEEDING_NOT_STARTED) { |
seedSystemAccounts(); |
} |
- |
return false; |
} |
@@ -95,44 +91,50 @@ public class AccountTrackerService { |
private void seedSystemAccounts() { |
ThreadUtils.assertOnUiThread(); |
- mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_IN_PROGRESS; |
mForceRefresh = false; |
mSyncForceRefreshedForTest = false; |
- AccountManagerHelper accountManagerHelper = AccountManagerHelper.get(mContext); |
- List<String> accountNamesList = accountManagerHelper.getGoogleAccountNames(); |
- final String[] accountNames = accountNamesList.toArray(new String[accountNamesList.size()]); |
- new AsyncTask<Void, Void, String[]>() { |
- @Override |
- public String[] doInBackground(Void... params) { |
- Log.d(TAG, "Getting id/email mapping"); |
- String[] accountIds = new String[accountNames.length]; |
- for (int i = 0; i < accountIds.length; ++i) { |
- accountIds[i] = sAccountIdProvider.getAccountId(mContext, accountNames[i]); |
- } |
- return accountIds; |
- } |
+ final AccountIdProvider accountIdProvider = AccountIdProvider.getInstance(); |
+ if (accountIdProvider.canBeUsed(mContext, null)) { |
+ mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_IN_PROGRESS; |
+ } else { |
+ mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_NOT_STARTED; |
+ notifyObserversOnForceRefreshed(); |
+ return; |
+ } |
+ AccountManagerHelper.get(mContext).getGoogleAccounts(new Callback<Account[]>() { |
@Override |
- public void onPostExecute(String[] accountIds) { |
- if (mSyncForceRefreshedForTest) return; |
- if (mForceRefresh) { |
- seedSystemAccounts(); |
- return; |
- } |
- if (areAccountIdsValid(accountIds)) { |
- nativeSeedAccountsInfo(mNativeAccountTrackerService, accountIds, accountNames); |
- mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_DONE; |
- notifyObserversOnSeedingComplete(); |
- } else { |
- Log.w(TAG, "Invalid mapping of id/email"); |
- if (sAccountIdProvider.canBeUsed(mContext, null)) { |
- seedSystemAccounts(); |
- return; |
+ public void gotResult(final Account[] accounts) { |
+ new AsyncTask<Void, Void, String[][]>() { |
+ @Override |
+ public String[][] doInBackground(Void... params) { |
+ Log.d(TAG, "Getting id/email mapping"); |
+ String[][] accountIdNameMap = new String[2][accounts.length]; |
+ for (int i = 0; i < accounts.length; ++i) { |
+ accountIdNameMap[0][i] = |
+ accountIdProvider.getAccountId(mContext, accounts[i].name); |
+ accountIdNameMap[1][i] = accounts[i].name; |
+ } |
+ return accountIdNameMap; |
+ } |
+ @Override |
+ public void onPostExecute(String[][] accountIdNameMap) { |
+ if (mSyncForceRefreshedForTest) return; |
+ if (mForceRefresh) { |
+ seedSystemAccounts(); |
+ return; |
+ } |
+ if (areAccountIdsValid(accountIdNameMap[0])) { |
+ nativeSeedAccountsInfo(accountIdNameMap[0], accountIdNameMap[1]); |
+ mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_DONE; |
+ notifyObserversOnSeedingComplete(); |
+ } else { |
+ Log.w(TAG, "Invalid mapping of id/email"); |
+ seedSystemAccounts(); |
+ } |
} |
- mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_NOT_STARTED; |
- notifyObserversOnForceRefreshed(); |
- } |
+ }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); |
} |
- }.executeOnExecutor(AsyncTask.SERIAL_EXECUTOR); |
+ }); |
} |
private boolean areAccountIdsValid(String[] accountIds) { |
@@ -157,7 +159,7 @@ public class AccountTrackerService { |
mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_IN_PROGRESS; |
mForceRefresh = false; |
mSyncForceRefreshedForTest = true; |
- nativeSeedAccountsInfo(mNativeAccountTrackerService, accountIds, accountNames); |
+ nativeSeedAccountsInfo(accountIds, accountNames); |
mSystemAccountsSeedingStatus = SystemAccountsSeedingStatus.SEEDING_DONE; |
} |
@@ -179,8 +181,5 @@ public class AccountTrackerService { |
} |
} |
- // Native methods. |
- private native long nativeInit(); |
- private native void nativeSeedAccountsInfo( |
- long nativeAccountTrackerServiceAndroid, String[] gaiaIds, String[] accountNames); |
+ private static native void nativeSeedAccountsInfo(String[] gaiaIds, String[] accountNames); |
} |