| Index: chrome/browser/signin/oauth2_token_service_delegate_android.cc
|
| diff --git a/chrome/browser/signin/oauth2_token_service_delegate_android.cc b/chrome/browser/signin/oauth2_token_service_delegate_android.cc
|
| index 8bd13bcd5224c6f838b5e26aedb4bc5d4474f0aa..028512510aabcc88f44223060902fd77c282e2fe 100644
|
| --- a/chrome/browser/signin/oauth2_token_service_delegate_android.cc
|
| +++ b/chrome/browser/signin/oauth2_token_service_delegate_android.cc
|
| @@ -138,12 +138,38 @@ OAuth2TokenServiceDelegateAndroid::ErrorInfo::ErrorInfo(
|
| const GoogleServiceAuthError& error)
|
| : error(error) {}
|
|
|
| -OAuth2TokenServiceDelegateAndroid::OAuth2TokenServiceDelegateAndroid() {
|
| +OAuth2TokenServiceDelegateAndroid::OAuth2TokenServiceDelegateAndroid(
|
| + AccountTrackerService* account_tracker_service)
|
| + : account_tracker_service_(account_tracker_service),
|
| + fire_refresh_token_loaded_(RT_LOAD_NOT_START) {
|
| DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::ctor";
|
| + DCHECK(account_tracker_service_);
|
| JNIEnv* env = AttachCurrentThread();
|
| base::android::ScopedJavaLocalRef<jobject> local_java_ref =
|
| Java_OAuth2TokenService_create(env, reinterpret_cast<intptr_t>(this));
|
| java_ref_.Reset(env, local_java_ref.obj());
|
| +
|
| + if (account_tracker_service_->GetMigrationState() ==
|
| + AccountTrackerService::MIGRATION_IN_PROGRESS) {
|
| + std::vector<std::string> accounts = GetAccounts();
|
| + std::vector<std::string> accounts_id;
|
| + for (auto account_name : accounts) {
|
| + AccountTrackerService::AccountInfo account_info =
|
| + account_tracker_service_->FindAccountInfoByEmail(account_name);
|
| + DCHECK(!account_info.gaia.empty());
|
| + accounts_id.push_back(account_info.gaia);
|
| + }
|
| + ScopedJavaLocalRef<jobjectArray> java_accounts(
|
| + base::android::ToJavaArrayOfStrings(env, accounts_id));
|
| + Java_OAuth2TokenService_saveStoredAccounts(
|
| + env, base::android::GetApplicationContext(), java_accounts.obj());
|
| + }
|
| +
|
| + if (!is_testing_profile_) {
|
| + Java_OAuth2TokenService_validateAccounts(
|
| + AttachCurrentThread(), java_ref_.obj(),
|
| + base::android::GetApplicationContext(), JNI_TRUE);
|
| + }
|
| }
|
|
|
| OAuth2TokenServiceDelegateAndroid::~OAuth2TokenServiceDelegateAndroid() {
|
| @@ -169,20 +195,12 @@ static jobject GetForProfile(JNIEnv* env,
|
| j_profile_android);
|
| }
|
|
|
| -void OAuth2TokenServiceDelegateAndroid::Initialize() {
|
| - DVLOG(1) << "OAuth2TokenServiceDelegateAndroid::Initialize";
|
| - if (!is_testing_profile_) {
|
| - Java_OAuth2TokenService_validateAccounts(
|
| - AttachCurrentThread(), java_ref_.obj(),
|
| - base::android::GetApplicationContext(), JNI_TRUE);
|
| - }
|
| -}
|
| -
|
| bool OAuth2TokenServiceDelegateAndroid::RefreshTokenIsAvailable(
|
| const std::string& account_id) const {
|
| + std::string account_name = MapAccountIdToAccountName(account_id);
|
| JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jstring> j_account_id =
|
| - ConvertUTF8ToJavaString(env, account_id);
|
| + ConvertUTF8ToJavaString(env, account_name);
|
| jboolean refresh_token_is_available =
|
| Java_OAuth2TokenService_hasOAuth2RefreshToken(
|
| env, base::android::GetApplicationContext(), j_account_id.obj());
|
| @@ -220,15 +238,15 @@ std::vector<std::string> OAuth2TokenServiceDelegateAndroid::GetAccounts() {
|
| }
|
|
|
| std::vector<std::string>
|
| -OAuth2TokenServiceDelegateAndroid::GetSystemAccounts() {
|
| - std::vector<std::string> accounts;
|
| +OAuth2TokenServiceDelegateAndroid::GetSystemAccountNames() {
|
| + std::vector<std::string> account_names;
|
| JNIEnv* env = AttachCurrentThread();
|
| ScopedJavaLocalRef<jobjectArray> j_accounts =
|
| - Java_OAuth2TokenService_getSystemAccounts(
|
| + Java_OAuth2TokenService_getSystemAccountNames(
|
| env, base::android::GetApplicationContext());
|
| base::android::AppendJavaStringArrayToStringVector(env, j_accounts.obj(),
|
| - &accounts);
|
| - return accounts;
|
| + &account_names);
|
| + return account_names;
|
| }
|
|
|
| OAuth2AccessTokenFetcher*
|
| @@ -237,7 +255,8 @@ OAuth2TokenServiceDelegateAndroid::CreateAccessTokenFetcher(
|
| net::URLRequestContextGetter* getter,
|
| OAuth2AccessTokenConsumer* consumer) {
|
| ValidateAccountId(account_id);
|
| - return new AndroidAccessTokenFetcher(consumer, account_id);
|
| + return new AndroidAccessTokenFetcher(consumer,
|
| + MapAccountIdToAccountName(account_id));
|
| }
|
|
|
| void OAuth2TokenServiceDelegateAndroid::InvalidateAccessToken(
|
| @@ -264,20 +283,21 @@ void OAuth2TokenServiceDelegateAndroid::ValidateAccounts(
|
| signed_in_account = ConvertJavaStringToUTF8(env, j_current_acc);
|
| if (!signed_in_account.empty())
|
| signed_in_account = gaia::CanonicalizeEmail(signed_in_account);
|
| - ValidateAccounts(signed_in_account, j_force_notifications != JNI_FALSE);
|
| + ValidateAccounts(MapAccountNameToAccountId(signed_in_account),
|
| + j_force_notifications != JNI_FALSE);
|
| }
|
|
|
| void OAuth2TokenServiceDelegateAndroid::ValidateAccounts(
|
| const std::string& signed_in_account,
|
| bool force_notifications) {
|
| std::vector<std::string> prev_ids = GetAccounts();
|
| - std::vector<std::string> curr_ids = GetSystemAccounts();
|
| + std::vector<std::string> curr_ids = GetSystemAccountNames();
|
| std::vector<std::string> refreshed_ids;
|
| std::vector<std::string> revoked_ids;
|
|
|
| - // Canonicalize system accounts. |prev_ids| is already done.
|
| for (size_t i = 0; i < curr_ids.size(); ++i)
|
| - curr_ids[i] = gaia::CanonicalizeEmail(curr_ids[i]);
|
| + curr_ids[i] = MapAccountNameToAccountId(curr_ids[i]);
|
| +
|
| for (size_t i = 0; i < prev_ids.size(); ++i)
|
| ValidateAccountId(prev_ids[i]);
|
|
|
| @@ -308,6 +328,13 @@ void OAuth2TokenServiceDelegateAndroid::ValidateAccounts(
|
| it != revoked_ids.end(); it++) {
|
| FireRefreshTokenRevoked(*it);
|
| }
|
| +
|
| + if (fire_refresh_token_loaded_ == RT_WAIT_FOR_VALIDATION) {
|
| + fire_refresh_token_loaded_ = RT_LOADED;
|
| + FireRefreshTokensLoaded();
|
| + } else if (fire_refresh_token_loaded_ == RT_LOAD_NOT_START) {
|
| + fire_refresh_token_loaded_ = RT_HAS_BEEN_VALIDATED;
|
| + }
|
| }
|
|
|
| bool OAuth2TokenServiceDelegateAndroid::ValidateAccounts(
|
| @@ -451,6 +478,32 @@ void OAuth2TokenServiceDelegateAndroid::RevokeAllCredentials() {
|
| env, base::android::GetApplicationContext(), java_accounts.obj());
|
| }
|
|
|
| +void OAuth2TokenServiceDelegateAndroid::LoadCredentials(
|
| + const std::string& primary_account_id) {
|
| + if (fire_refresh_token_loaded_ == RT_HAS_BEEN_VALIDATED) {
|
| + fire_refresh_token_loaded_ = RT_LOADED;
|
| + FireRefreshTokensLoaded();
|
| + } else if (fire_refresh_token_loaded_ == RT_LOAD_NOT_START) {
|
| + fire_refresh_token_loaded_ = RT_WAIT_FOR_VALIDATION;
|
| + }
|
| +}
|
| +
|
| +std::string OAuth2TokenServiceDelegateAndroid::MapAccountIdToAccountName(
|
| + const std::string& account_id) const {
|
| + std::string account_name =
|
| + account_tracker_service_->GetAccountInfo(account_id).email;
|
| + DCHECK(!account_name.empty() || account_id.empty());
|
| + return account_name;
|
| +}
|
| +
|
| +std::string OAuth2TokenServiceDelegateAndroid::MapAccountNameToAccountId(
|
| + const std::string& account_name) const {
|
| + std::string account_id =
|
| + account_tracker_service_->FindAccountInfoByEmail(account_name).account_id;
|
| + DCHECK(!account_id.empty() || account_name.empty());
|
| + return account_id;
|
| +}
|
| +
|
| // Called from Java when fetching of an OAuth2 token is finished. The
|
| // |authToken| param is only valid when |result| is true.
|
| void OAuth2TokenFetched(JNIEnv* env,
|
|
|