| Index: chrome/browser/sync/profile_sync_service_android.cc
|
| diff --git a/chrome/browser/sync/profile_sync_service_android.cc b/chrome/browser/sync/profile_sync_service_android.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..974d577d0e84829bbdbc23304916efe5b19c4dd8
|
| --- /dev/null
|
| +++ b/chrome/browser/sync/profile_sync_service_android.cc
|
| @@ -0,0 +1,542 @@
|
| +// Copyright 2013 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "chrome/browser/sync/profile_sync_service_android.h"
|
| +
|
| +#include "base/android/jni_android.h"
|
| +#include "base/android/jni_string.h"
|
| +#include "base/bind.h"
|
| +#include "base/i18n/time_formatting.h"
|
| +#include "base/json/json_writer.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/time.h"
|
| +#include "chrome/browser/browser_process.h"
|
| +#include "chrome/browser/profiles/profile_manager.h"
|
| +#include "chrome/browser/signin/signin_manager.h"
|
| +#include "chrome/browser/signin/signin_manager_factory.h"
|
| +#include "chrome/browser/signin/token_service.h"
|
| +#include "chrome/browser/signin/token_service_factory.h"
|
| +#include "chrome/browser/sync/about_sync_util.h"
|
| +#include "chrome/browser/sync/profile_sync_service.h"
|
| +#include "chrome/browser/sync/profile_sync_service_factory.h"
|
| +#include "chrome/browser/sync/sync_prefs.h"
|
| +#include "chrome/browser/sync/sync_ui_util.h"
|
| +#include "chrome/common/chrome_notification_types.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "content/public/browser/notification_service.h"
|
| +#include "google/cacheinvalidation/types.pb.h"
|
| +#include "google_apis/gaia/gaia_constants.h"
|
| +#include "google_apis/gaia/google_service_auth_error.h"
|
| +#include "grit/generated_resources.h"
|
| +#include "jni/ProfileSyncService_jni.h"
|
| +#include "sync/internal_api/public/base/model_type_invalidation_map.h"
|
| +#include "sync/internal_api/public/read_transaction.h"
|
| +#include "ui/base/l10n/l10n_util.h"
|
| +
|
| +using base::android::AttachCurrentThread;
|
| +using base::android::CheckException;
|
| +using base::android::ConvertJavaStringToUTF8;
|
| +using base::android::ConvertUTF8ToJavaString;
|
| +using base::android::ScopedJavaLocalRef;
|
| +using content::BrowserThread;
|
| +
|
| +namespace {
|
| +const char kSyncDisabledStatus[] = "OFFLINE_DISABLED";
|
| +
|
| +enum {
|
| +#define DEFINE_MODEL_TYPE_SELECTION(name,value) name = value,
|
| +#include "chrome/browser/sync/profile_sync_service_model_type_selection_android.h"
|
| +#undef DEFINE_MODEL_TYPE_SELECTION
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +ProfileSyncServiceAndroid::ProfileSyncServiceAndroid(JNIEnv* env, jobject obj)
|
| + : profile_(NULL),
|
| + sync_service_(NULL),
|
| + weak_java_profile_sync_service_(env, obj) {
|
| + if (g_browser_process == NULL ||
|
| + g_browser_process->profile_manager() == NULL) {
|
| + NOTREACHED() << "Browser process or profile manager not initialized";
|
| + return;
|
| + }
|
| +
|
| + profile_ = g_browser_process->profile_manager()->GetDefaultProfile();
|
| + if (profile_ == NULL) {
|
| + NOTREACHED() << "Sync Init: Profile not found.";
|
| + return;
|
| + }
|
| +
|
| + sync_service_ =
|
| + ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
|
| + DCHECK(sync_service_);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::Init() {
|
| + sync_service_->AddObserver(this);
|
| +
|
| + std::string signed_in_username =
|
| + SigninManagerFactory::GetForProfile(profile_)->GetAuthenticatedUsername();
|
| + if (!signed_in_username.empty()) {
|
| + // If the user is logged in, see if he has a valid token - if not, fetch
|
| + // a new one.
|
| + TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
|
| + if (!token_service->HasTokenForService(GaiaConstants::kSyncService) ||
|
| + (sync_service_->GetAuthError().state() ==
|
| + GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)) {
|
| + DVLOG(2) << "Trying to update token for user " << signed_in_username;
|
| + InvalidateAuthToken();
|
| + }
|
| + }
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::RemoveObserver() {
|
| + if (sync_service_->HasObserver(this)) {
|
| + sync_service_->RemoveObserver(this);
|
| + }
|
| +}
|
| +
|
| +ProfileSyncServiceAndroid::~ProfileSyncServiceAndroid() {
|
| + RemoveObserver();
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SendNudgeNotification(
|
| + const std::string& str_object_id,
|
| + int64 version,
|
| + const std::string& state) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + // TODO(nileshagrawal): Merge this with ChromeInvalidationClient::Invalidate.
|
| + // Construct the ModelTypeStateMap and send it over with the notification.
|
| + syncer::ModelType model_type;
|
| + if (!syncer::NotificationTypeToRealModelType(str_object_id, &model_type)) {
|
| + DVLOG(1) << "Could not get invalidation model type; "
|
| + << "Sending notification with empty state map.";
|
| + syncer::ModelTypeInvalidationMap model_types_with_states;
|
| + content::NotificationService::current()->Notify(
|
| + chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
|
| + content::Source<Profile>(profile_),
|
| + content::Details<const syncer::ModelTypeInvalidationMap>(
|
| + &model_types_with_states));
|
| + return;
|
| + }
|
| +
|
| + if (version != ipc::invalidation::Constants::UNKNOWN) {
|
| + std::map<syncer::ModelType, int64>::const_iterator it =
|
| + max_invalidation_versions_.find(model_type);
|
| + if ((it != max_invalidation_versions_.end()) &&
|
| + (version <= it->second)) {
|
| + DVLOG(1) << "Dropping redundant invalidation with version " << version;
|
| + return;
|
| + }
|
| + max_invalidation_versions_[model_type] = version;
|
| + }
|
| +
|
| + syncer::ModelTypeSet types;
|
| + types.Put(model_type);
|
| + syncer::ModelTypeInvalidationMap model_types_with_states =
|
| + syncer::ModelTypeSetToInvalidationMap(types, state);
|
| +
|
| + content::NotificationService::current()->Notify(
|
| + chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
|
| + content::Source<Profile>(profile_),
|
| + content::Details<const syncer::ModelTypeInvalidationMap>(
|
| + &model_types_with_states));
|
| +}
|
| +
|
| +
|
| +void ProfileSyncServiceAndroid::OnStateChanged() {
|
| + // Check for auth errors.
|
| + const GoogleServiceAuthError& auth_error = sync_service_->GetAuthError();
|
| + if (auth_error.state() == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) {
|
| + DVLOG(2) << "Updating auth token.";
|
| + InvalidateAuthToken();
|
| + }
|
| +
|
| + // Notify the java world that our sync state has changed.
|
| + JNIEnv* env = AttachCurrentThread();
|
| + Java_ProfileSyncService_syncStateChanged(
|
| + env, weak_java_profile_sync_service_.get(env).obj());
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::TokenAvailable(
|
| + JNIEnv* env, jobject, jstring username, jstring auth_token) {
|
| + std::string token = ConvertJavaStringToUTF8(env, auth_token);
|
| + TokenServiceFactory::GetForProfile(profile_)->OnIssueAuthTokenSuccess(
|
| + GaiaConstants::kSyncService, token);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::EnableSync(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + // Don't need to do anything if we're already enabled.
|
| + browser_sync::SyncPrefs prefs(profile_->GetPrefs());
|
| + if (prefs.IsStartSuppressed())
|
| + sync_service_->UnsuppressAndStart();
|
| + else
|
| + DVLOG(2) << "Ignoring call to EnableSync() because sync is already enabled";
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::DisableSync(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + sync_service_->StopAndSuppress();
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SignInSync(
|
| + JNIEnv* env, jobject, jstring username, jstring auth_token) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + // Just return if sync already has everything it needs to start up (sync
|
| + // should start up automatically as long as it has credentials). This can
|
| + // happen normally if (for example) the user closes and reopens the sync
|
| + // settings window quickly during initial startup.
|
| + if (sync_service_->IsSyncEnabledAndLoggedIn() &&
|
| + sync_service_->IsSyncTokenAvailable() &&
|
| + sync_service_->HasSyncSetupCompleted()) {
|
| + return;
|
| + }
|
| +
|
| + if (!sync_service_->IsSyncEnabledAndLoggedIn() ||
|
| + !sync_service_->IsSyncTokenAvailable()) {
|
| + // Set the currently-signed-in username, fetch an auth token if necessary,
|
| + // and enable sync.
|
| + std::string name = ConvertJavaStringToUTF8(env, username);
|
| + SigninManagerFactory::GetForProfile(profile_)->
|
| + SetAuthenticatedUsername(name);
|
| + std::string token = ConvertJavaStringToUTF8(env, auth_token);
|
| + if (token.empty()) {
|
| + // No credentials passed in - request an auth token.
|
| + // If fetching the auth token is successful, this will cause
|
| + // ProfileSyncService to start sync when it receives
|
| + // NOTIFICATION_TOKEN_AVAILABLE.
|
| + DVLOG(2) << "Fetching auth token for " << name;
|
| + InvalidateAuthToken();
|
| + } else {
|
| + // OnIssueAuthTokenSuccess will send out a notification to the sync
|
| + // service that will cause the sync backend to initialize.
|
| + TokenService* token_service =
|
| + TokenServiceFactory::GetForProfile(profile_);
|
| + token_service->OnIssueAuthTokenSuccess(GaiaConstants::kSyncService,
|
| + token);
|
| + }
|
| + }
|
| +
|
| + // Enable sync (if we don't have credentials yet, this will enable sync but
|
| + // will not start it up - sync will start once credentials arrive).
|
| + sync_service_->UnsuppressAndStart();
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SignOutSync(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(profile_);
|
| + sync_service_->DisableForUser();
|
| +
|
| + // Clear the tokens.
|
| + SigninManagerFactory::GetForProfile(profile_)->SignOut();
|
| +
|
| + // Need to clear suppress start flag manually
|
| + browser_sync::SyncPrefs prefs(profile_->GetPrefs());
|
| + prefs.SetStartSuppressed(false);
|
| +}
|
| +
|
| +ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::QuerySyncStatusSummary(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(profile_);
|
| + std::string status(sync_service_->QuerySyncStatusSummary());
|
| + return ConvertUTF8ToJavaString(env, status);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::SetSyncSessionsId(
|
| + JNIEnv* env, jobject obj, jstring tag) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + DCHECK(profile_);
|
| + std::string machine_tag = ConvertJavaStringToUTF8(env, tag);
|
| + browser_sync::SyncPrefs prefs(profile_->GetPrefs());
|
| + prefs.SetSyncSessionsGUID(machine_tag);
|
| + return true;
|
| +}
|
| +
|
| +jint ProfileSyncServiceAndroid::GetAuthError(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->GetAuthError().state();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsEncryptEverythingEnabled(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->EncryptEverythingEnabled();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsSyncInitialized(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->sync_initialized();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsFirstSetupInProgress(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->FirstSetupInProgress();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsPassphraseRequired(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->IsPassphraseRequired();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForDecryption(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + // In case of CUSTOM_PASSPHRASE we always sync passwords. Prompt the user for
|
| + // a passphrase if cryptographer has any pending keys.
|
| + if (sync_service_->GetPassphraseType() == syncer::CUSTOM_PASSPHRASE) {
|
| + return !IsCryptographerReady(env, obj);
|
| + }
|
| + if (sync_service_->IsPassphraseRequiredForDecryption()) {
|
| + // Passwords datatype should never prompt for a passphrase, except when
|
| + // user is using a custom passphrase. Do not prompt for a passphrase if
|
| + // passwords are the only encrypted datatype. This prevents a temporary
|
| + // notification for passphrase when PSS has not completed configuring
|
| + // DataTypeManager, after configuration password datatype shall be disabled.
|
| + const syncer::ModelTypeSet encrypted_types =
|
| + sync_service_->GetEncryptedDataTypes();
|
| + const bool are_passwords_the_only_encrypted_type =
|
| + encrypted_types.Has(syncer::PASSWORDS) && encrypted_types.Size() == 1 &&
|
| + !sync_service_->ShouldEnablePasswordSyncForAndroid();
|
| + return !are_passwords_the_only_encrypted_type;
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForExternalType(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return
|
| + sync_service_->passphrase_required_reason() == syncer::REASON_DECRYPTION;
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsUsingSecondaryPassphrase(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->IsUsingSecondaryPassphrase();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::SetDecryptionPassphrase(
|
| + JNIEnv* env, jobject obj, jstring passphrase) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + std::string key = ConvertJavaStringToUTF8(env, passphrase);
|
| + return sync_service_->SetDecryptionPassphrase(key);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SetEncryptionPassphrase(
|
| + JNIEnv* env, jobject obj, jstring passphrase, jboolean is_gaia) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + std::string key = ConvertJavaStringToUTF8(env, passphrase);
|
| + sync_service_->SetEncryptionPassphrase(
|
| + key,
|
| + is_gaia ? ProfileSyncService::IMPLICIT : ProfileSyncService::EXPLICIT);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsCryptographerReady(JNIEnv* env, jobject) {
|
| + syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
|
| + return sync_service_->IsCryptographerReady(&trans);
|
| +}
|
| +
|
| +jint ProfileSyncServiceAndroid::GetPassphraseType(JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->GetPassphraseType();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::HasExplicitPassphraseTime(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
|
| + return !passphrase_time.is_null();
|
| +}
|
| +
|
| +ScopedJavaLocalRef<jstring>
|
| + ProfileSyncServiceAndroid::GetSyncEnterGooglePassphraseBodyWithDateText(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
|
| + string16 passphrase_time_str = base::TimeFormatShortDate(passphrase_time);
|
| + return base::android::ConvertUTF16ToJavaString(env,
|
| + l10n_util::GetStringFUTF16(
|
| + IDS_SYNC_ENTER_GOOGLE_PASSPHRASE_BODY_WITH_DATE,
|
| + passphrase_time_str));
|
| +}
|
| +
|
| +ScopedJavaLocalRef<jstring>
|
| + ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyWithDateText(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
|
| + string16 passphrase_time_str = base::TimeFormatShortDate(passphrase_time);
|
| + return base::android::ConvertUTF16ToJavaString(env,
|
| + l10n_util::GetStringFUTF16(IDS_SYNC_ENTER_PASSPHRASE_BODY_WITH_DATE,
|
| + passphrase_time_str));
|
| +}
|
| +
|
| +ScopedJavaLocalRef<jstring>
|
| + ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyText(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return ConvertUTF8ToJavaString(
|
| + env, l10n_util::GetStringUTF8(IDS_SYNC_ENTER_PASSPHRASE_BODY));
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsSyncKeystoreMigrationDone(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + syncer::SyncStatus status;
|
| + bool is_status_valid = sync_service_->QueryDetailedSyncStatus(&status);
|
| + return is_status_valid && !status.keystore_migration_time.is_null();
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SetPreferredDataTypes(
|
| + JNIEnv* env, jobject obj,
|
| + jboolean sync_everything,
|
| + jlong model_type_selection) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + syncer::ModelTypeSet types;
|
| + if (model_type_selection & AUTOFILL)
|
| + types.Put(syncer::AUTOFILL);
|
| + if (model_type_selection & BOOKMARK)
|
| + types.Put(syncer::BOOKMARKS);
|
| + if (model_type_selection & PASSWORD)
|
| + types.Put(syncer::PASSWORDS);
|
| + if (model_type_selection & SESSION)
|
| + types.Put(syncer::SESSIONS);
|
| + if (model_type_selection & TYPED_URL)
|
| + types.Put(syncer::TYPED_URLS);
|
| + sync_service_->OnUserChoseDatatypes(sync_everything, types);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SetSetupInProgress(
|
| + JNIEnv* env, jobject obj, jboolean in_progress) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + sync_service_->SetSetupInProgress(in_progress);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::SetSyncSetupCompleted(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + sync_service_->SetSyncSetupCompleted();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::HasSyncSetupCompleted(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->HasSyncSetupCompleted();
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::EnableEncryptEverything(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + sync_service_->EnableEncryptEverything();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::HasKeepEverythingSynced(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + browser_sync::SyncPrefs prefs(profile_->GetPrefs());
|
| + return prefs.HasKeepEverythingSynced();
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsAutofillSyncEnabled(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return HasKeepEverythingSynced(env, obj) ||
|
| + sync_service_->GetPreferredDataTypes().Has(syncer::AUTOFILL);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsBookmarkSyncEnabled(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return HasKeepEverythingSynced(env, obj) ||
|
| + sync_service_->GetPreferredDataTypes().Has(syncer::BOOKMARKS);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsPasswordSyncEnabled(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return HasKeepEverythingSynced(env, obj) ||
|
| + sync_service_->GetPreferredDataTypes().Has(syncer::PASSWORDS);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsTypedUrlSyncEnabled(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return HasKeepEverythingSynced(env, obj) ||
|
| + sync_service_->GetPreferredDataTypes().Has(syncer::TYPED_URLS);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::IsSessionSyncEnabled(
|
| + JNIEnv* env, jobject obj) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return HasKeepEverythingSynced(env, obj) ||
|
| + sync_service_->GetPreferredDataTypes().Has(syncer::SESSIONS);
|
| +}
|
| +
|
| +jboolean ProfileSyncServiceAndroid::HasUnrecoverableError(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + return sync_service_->HasUnrecoverableError();
|
| +}
|
| +
|
| +ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::GetAboutInfoForTest(
|
| + JNIEnv* env, jobject) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| +
|
| + scoped_ptr<DictionaryValue> about_info =
|
| + sync_ui_util::ConstructAboutInformation(sync_service_);
|
| + std::string about_info_json;
|
| + base::JSONWriter::Write(about_info.get(), &about_info_json);
|
| +
|
| + return ConvertUTF8ToJavaString(env, about_info_json);
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::InvalidateAuthToken() {
|
| + // Get the token from token-db. If there's no token yet, this must be the
|
| + // the first time the user is signing in so we don't need to invalidate
|
| + // anything.
|
| + TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
|
| + std::string invalid_token;
|
| + if (token_service->HasTokenForService(GaiaConstants::kSyncService)) {
|
| + invalid_token = token_service->GetTokenForService(
|
| + GaiaConstants::kSyncService);
|
| + }
|
| + const std::string& sync_username =
|
| + SigninManagerFactory::GetForProfile(profile_)->GetAuthenticatedUsername();
|
| + // Call into java to invalidate the current token and get a new one.
|
| + JNIEnv* env = AttachCurrentThread();
|
| + ScopedJavaLocalRef<jstring> j_sync_username =
|
| + ConvertUTF8ToJavaString(env, sync_username);
|
| + ScopedJavaLocalRef<jstring> j_invalid_token =
|
| + ConvertUTF8ToJavaString(env, invalid_token);
|
| + Java_ProfileSyncService_getNewAuthToken(
|
| + env, weak_java_profile_sync_service_.get(env).obj(),
|
| + j_sync_username.obj(), j_invalid_token.obj());
|
| +}
|
| +
|
| +void ProfileSyncServiceAndroid::NudgeSyncer(JNIEnv* env,
|
| + jobject obj,
|
| + jstring objectId,
|
| + jlong version,
|
| + jstring state) {
|
| + DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
| + SendNudgeNotification(ConvertJavaStringToUTF8(env, objectId), version,
|
| + ConvertJavaStringToUTF8(env, state));
|
| +}
|
| +
|
| +static int Init(JNIEnv* env, jobject obj) {
|
| + ProfileSyncServiceAndroid* profile_sync_service_android =
|
| + new ProfileSyncServiceAndroid(env, obj);
|
| + profile_sync_service_android->Init();
|
| + return reinterpret_cast<jint>(profile_sync_service_android);
|
| +}
|
| +
|
| +// static
|
| +bool ProfileSyncServiceAndroid::Register(JNIEnv* env) {
|
| + return RegisterNativesImpl(env);
|
| +}
|
|
|