Chromium Code Reviews| 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..9ececd314daeb40f7e365a35f2d5c2fa7b70c241 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(); |
| } |
| /** |
| @@ -71,14 +69,13 @@ public class AccountTrackerService { |
| */ |
| public boolean isSystemAccountsSeeded() { |
| ThreadUtils.assertOnUiThread(); |
| - if (mSystemAccountsSeedingStatus == SystemAccountsSeedingStatus.SEEDING_DONE) { |
| + if (mSystemAccountsSeedingStatus == SystemAccountsSeedingStatus.SEEDING_DONE |
| + && nativeAreAllAccountsSeeded()) { |
|
gogerald1
2015/10/13 16:34:53
seedSystemAccounts is called on UI thread and Seed
|
| return true; |
| } |
| - |
| if (mSystemAccountsSeedingStatus == SystemAccountsSeedingStatus.SEEDING_NOT_STARTED) { |
| seedSystemAccounts(); |
| } |
| - |
| return false; |
| } |
| @@ -95,44 +92,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 +160,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 +182,6 @@ public class AccountTrackerService { |
| } |
| } |
| - // Native methods. |
| - private native long nativeInit(); |
| - private native void nativeSeedAccountsInfo( |
| - long nativeAccountTrackerServiceAndroid, String[] gaiaIds, String[] accountNames); |
| + private static native boolean nativeAreAllAccountsSeeded(); |
| + private static native void nativeSeedAccountsInfo(String[] gaiaIds, String[] accountNames); |
| } |