blob: b8843b0f49cf4886347da1c004cd3b621ae4b05b [file] [log] [blame]
[email protected]9049a7b2013-03-07 22:22:031// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/sync/profile_sync_service_android.h"
6
avi664c07b2015-12-26 02:18:317#include <stddef.h>
8#include <stdint.h>
9
maxbogue7e006db2016-10-03 19:48:2810#include <string>
11#include <vector>
dcheng0569a0e2016-04-14 17:37:0512
[email protected]9049a7b2013-03-07 22:22:0313#include "base/android/jni_android.h"
maxbogue47c75042015-08-12 18:05:0114#include "base/android/jni_array.h"
[email protected]9049a7b2013-03-07 22:22:0315#include "base/android/jni_string.h"
16#include "base/bind.h"
17#include "base/i18n/time_formatting.h"
18#include "base/json/json_writer.h"
19#include "base/logging.h"
dcheng0569a0e2016-04-14 17:37:0520#include "base/memory/ptr_util.h"
[email protected]e309f312013-06-07 21:50:0821#include "base/strings/utf_string_conversions.h"
[email protected]9049a7b2013-03-07 22:22:0322#include "chrome/browser/browser_process.h"
23#include "chrome/browser/profiles/profile_manager.h"
[email protected]9049a7b2013-03-07 22:22:0324#include "chrome/browser/signin/signin_manager_factory.h"
[email protected]9049a7b2013-03-07 22:22:0325#include "chrome/browser/sync/profile_sync_service_factory.h"
[email protected]9049a7b2013-03-07 22:22:0326#include "chrome/browser/sync/sync_ui_util.h"
maxbogue93150a5d2015-08-31 21:08:3227#include "chrome/common/channel_info.h"
[email protected]af39f002014-08-22 10:18:1828#include "chrome/grit/generated_resources.h"
maxbogue26f40222016-09-16 20:22:1829#include "components/browser_sync/profile_sync_service.h"
brettwb1fc1b82016-02-02 00:19:0830#include "components/prefs/pref_service.h"
[email protected]7fbd3b12014-04-01 11:19:1631#include "components/signin/core/browser/signin_manager.h"
thestig4a2e88e2016-08-27 23:23:5132#include "components/strings/grit/components_strings.h"
maxbogue2f960e52016-10-07 01:24:1533#include "components/sync/base/pref_names.h"
maxbogue455a57e32016-08-14 00:08:3234#include "components/sync/driver/about_sync_util.h"
maxboguef0ab40f52016-10-11 16:12:4035#include "components/sync/engine/net/network_resources.h"
maxbogued7efba42016-10-12 15:32:4536#include "components/sync/syncable/read_transaction.h"
[email protected]dfe6a9b2014-01-31 21:37:5537#include "content/public/browser/browser_thread.h"
[email protected]9049a7b2013-03-07 22:22:0338#include "google/cacheinvalidation/types.pb.h"
39#include "google_apis/gaia/gaia_constants.h"
[email protected]9049a7b2013-03-07 22:22:0340#include "jni/ProfileSyncService_jni.h"
[email protected]9049a7b2013-03-07 22:22:0341#include "ui/base/l10n/l10n_util.h"
42
43using base::android::AttachCurrentThread;
44using base::android::CheckException;
45using base::android::ConvertJavaStringToUTF8;
46using base::android::ConvertUTF8ToJavaString;
torne86560112016-08-04 15:59:0447using base::android::JavaParamRef;
[email protected]9049a7b2013-03-07 22:22:0348using base::android::ScopedJavaLocalRef;
maxbogue0a379452016-09-22 21:35:0549using browser_sync::ProfileSyncService;
[email protected]9049a7b2013-03-07 22:22:0350using content::BrowserThread;
51
52namespace {
[email protected]9049a7b2013-03-07 22:22:0353
pvalenzuelaff27ca202015-05-20 23:34:2154// Native callback for the JNI GetAllNodes method. When
55// ProfileSyncService::GetAllNodes completes, this method is called and the
56// results are sent to the Java callback.
57void NativeGetAllNodesCallback(
58 const base::android::ScopedJavaGlobalRef<jobject>& callback,
dcheng0569a0e2016-04-14 17:37:0559 std::unique_ptr<base::ListValue> result) {
pvalenzuelaff27ca202015-05-20 23:34:2160 JNIEnv* env = base::android::AttachCurrentThread();
61 std::string json_string;
62 if (!result.get() || !base::JSONWriter::Write(*result, &json_string)) {
63 DVLOG(1) << "Writing as JSON failed. Passing empty string to Java code.";
64 json_string = std::string();
65 }
66
67 ScopedJavaLocalRef<jstring> java_json_string =
68 ConvertUTF8ToJavaString(env, json_string);
torne948f3662016-08-16 15:10:4469 Java_ProfileSyncService_onGetAllNodesResult(env, callback, java_json_string);
pvalenzuelaff27ca202015-05-20 23:34:2170}
71
maxbogue28baa962015-10-01 17:21:3872ScopedJavaLocalRef<jintArray> ModelTypeSetToJavaIntArray(
73 JNIEnv* env,
74 syncer::ModelTypeSet types) {
75 std::vector<int> type_vector;
76 for (syncer::ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
77 type_vector.push_back(it.Get());
78 }
79 return base::android::ToJavaIntArray(env, type_vector);
80}
81
[email protected]9049a7b2013-03-07 22:22:0382} // namespace
83
84ProfileSyncServiceAndroid::ProfileSyncServiceAndroid(JNIEnv* env, jobject obj)
maxbogue0a379452016-09-22 21:35:0585 : profile_(nullptr),
86 sync_service_(nullptr),
[email protected]9049a7b2013-03-07 22:22:0387 weak_java_profile_sync_service_(env, obj) {
maxbogue0a379452016-09-22 21:35:0588 if (g_browser_process == nullptr ||
89 g_browser_process->profile_manager() == nullptr) {
[email protected]9049a7b2013-03-07 22:22:0390 NOTREACHED() << "Browser process or profile manager not initialized";
91 return;
92 }
93
[email protected]dd547a22013-12-12 18:37:4194 profile_ = ProfileManager::GetActiveUserProfile();
maxbogue0a379452016-09-22 21:35:0595 if (profile_ == nullptr) {
[email protected]9049a7b2013-03-07 22:22:0396 NOTREACHED() << "Sync Init: Profile not found.";
97 return;
98 }
99
skymdc10e452016-10-17 20:08:21100 sync_prefs_ = base::MakeUnique<syncer::SyncPrefs>(profile_->GetPrefs());
[email protected]aa5b2ece2013-05-17 00:37:36101
[email protected]9049a7b2013-03-07 22:22:03102 sync_service_ =
103 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
[email protected]9049a7b2013-03-07 22:22:03104}
105
cullinan3b803e22015-12-02 01:31:24106bool ProfileSyncServiceAndroid::Init() {
107 if (sync_service_) {
108 sync_service_->AddObserver(this);
maxbogue1a4f00902015-12-15 21:39:40109 sync_service_->SetPlatformSyncAllowedProvider(
110 base::Bind(&ProfileSyncServiceAndroid::IsSyncAllowedByAndroid,
111 base::Unretained(this)));
cullinan3b803e22015-12-02 01:31:24112 return true;
113 } else {
114 return false;
115 }
[email protected]9049a7b2013-03-07 22:22:03116}
117
maxbogue28baa962015-10-01 17:21:38118ProfileSyncServiceAndroid::~ProfileSyncServiceAndroid() {
maxbogue1a4f00902015-12-15 21:39:40119 if (sync_service_) {
[email protected]9049a7b2013-03-07 22:22:03120 sync_service_->RemoveObserver(this);
maxbogue1a4f00902015-12-15 21:39:40121 sync_service_->SetPlatformSyncAllowedProvider(
122 ProfileSyncService::PlatformSyncAllowedProvider());
[email protected]9049a7b2013-03-07 22:22:03123 }
124}
125
[email protected]9049a7b2013-03-07 22:22:03126void ProfileSyncServiceAndroid::OnStateChanged() {
[email protected]9049a7b2013-03-07 22:22:03127 // Notify the java world that our sync state has changed.
128 JNIEnv* env = AttachCurrentThread();
129 Java_ProfileSyncService_syncStateChanged(
torne948f3662016-08-16 15:10:44130 env, weak_java_profile_sync_service_.get(env));
[email protected]9049a7b2013-03-07 22:22:03131}
132
maxbogue1a4f00902015-12-15 21:39:40133bool ProfileSyncServiceAndroid::IsSyncAllowedByAndroid() const {
134 DCHECK_CURRENTLY_ON(BrowserThread::UI);
135 JNIEnv* env = AttachCurrentThread();
136 return Java_ProfileSyncService_isMasterSyncEnabled(
torne948f3662016-08-16 15:10:44137 env, weak_java_profile_sync_service_.get(env));
maxbogue1a4f00902015-12-15 21:39:40138}
139
maxbogue28baa962015-10-01 17:21:38140// Pure ProfileSyncService calls.
zeab1b09b72015-05-01 17:56:40141
maxbogue28baa962015-10-01 17:21:38142jboolean ProfileSyncServiceAndroid::IsSyncRequested(
torne0a4a3ab12015-12-10 19:45:52143 JNIEnv* env,
144 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38145 DCHECK_CURRENTLY_ON(BrowserThread::UI);
146 return sync_service_->IsSyncRequested();
zeab1b09b72015-05-01 17:56:40147}
148
torne0a4a3ab12015-12-10 19:45:52149void ProfileSyncServiceAndroid::RequestStart(JNIEnv* env,
150 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23151 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguecd3fad6b2015-06-09 00:44:53152 sync_service_->RequestStart();
[email protected]9049a7b2013-03-07 22:22:03153}
154
torne0a4a3ab12015-12-10 19:45:52155void ProfileSyncServiceAndroid::RequestStop(JNIEnv* env,
156 const JavaParamRef<jobject>&) {
maxboguef5c53a2d2015-07-08 20:47:29157 DCHECK_CURRENTLY_ON(BrowserThread::UI);
158 sync_service_->RequestStop(ProfileSyncService::KEEP_DATA);
159}
160
torne0a4a3ab12015-12-10 19:45:52161void ProfileSyncServiceAndroid::SignOutSync(JNIEnv* env,
162 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23163 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03164 DCHECK(profile_);
maxbogue699262c92015-06-19 19:24:58165 sync_service_->RequestStop(ProfileSyncService::CLEAR_DATA);
[email protected]9049a7b2013-03-07 22:22:03166}
167
torne0a4a3ab12015-12-10 19:45:52168jboolean ProfileSyncServiceAndroid::IsSyncActive(
169 JNIEnv* env,
170 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38171 DCHECK_CURRENTLY_ON(BrowserThread::UI);
172 return sync_service_->IsSyncActive();
173}
174
maxbogue6b6f9f432016-12-05 23:59:14175jboolean ProfileSyncServiceAndroid::IsEngineInitialized(
torne0a4a3ab12015-12-10 19:45:52176 JNIEnv* env,
177 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38178 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxbogue6b6f9f432016-12-05 23:59:14179 return sync_service_->IsEngineInitialized();
maxbogue28baa962015-10-01 17:21:38180}
181
maxbogue28baa962015-10-01 17:21:38182void ProfileSyncServiceAndroid::SetSetupInProgress(
torne0a4a3ab12015-12-10 19:45:52183 JNIEnv* env,
184 const JavaParamRef<jobject>& obj,
185 jboolean in_progress) {
maxbogue28baa962015-10-01 17:21:38186 DCHECK_CURRENTLY_ON(BrowserThread::UI);
tommyclif3a1551e2016-06-21 18:11:23187 if (in_progress) {
188 sync_blocker_ = sync_service_->GetSetupInProgressHandle();
189 } else {
190 sync_blocker_.reset();
191 }
maxbogue28baa962015-10-01 17:21:38192}
193
maxboguefe00952a2016-01-19 19:02:01194jboolean ProfileSyncServiceAndroid::IsFirstSetupComplete(
torne0a4a3ab12015-12-10 19:45:52195 JNIEnv* env,
196 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38197 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguefe00952a2016-01-19 19:02:01198 return sync_service_->IsFirstSetupComplete();
maxbogue28baa962015-10-01 17:21:38199}
200
maxboguefe00952a2016-01-19 19:02:01201void ProfileSyncServiceAndroid::SetFirstSetupComplete(
torne0a4a3ab12015-12-10 19:45:52202 JNIEnv* env,
203 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38204 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguefe00952a2016-01-19 19:02:01205 sync_service_->SetFirstSetupComplete();
maxbogue28baa962015-10-01 17:21:38206}
207
208ScopedJavaLocalRef<jintArray> ProfileSyncServiceAndroid::GetActiveDataTypes(
torne0a4a3ab12015-12-10 19:45:52209 JNIEnv* env,
210 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38211 syncer::ModelTypeSet types = sync_service_->GetActiveDataTypes();
212 return ModelTypeSetToJavaIntArray(env, types);
213}
214
215ScopedJavaLocalRef<jintArray> ProfileSyncServiceAndroid::GetPreferredDataTypes(
torne0a4a3ab12015-12-10 19:45:52216 JNIEnv* env,
217 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38218 syncer::ModelTypeSet types = sync_service_->GetPreferredDataTypes();
219 return ModelTypeSetToJavaIntArray(env, types);
220}
221
222void ProfileSyncServiceAndroid::SetPreferredDataTypes(
torne0a4a3ab12015-12-10 19:45:52223 JNIEnv* env,
224 const JavaParamRef<jobject>& obj,
maxbogue28baa962015-10-01 17:21:38225 jboolean sync_everything,
torne0a4a3ab12015-12-10 19:45:52226 const JavaParamRef<jintArray>& model_type_array) {
maxbogue28baa962015-10-01 17:21:38227 DCHECK_CURRENTLY_ON(BrowserThread::UI);
228 std::vector<int> types_vector;
229 base::android::JavaIntArrayToIntVector(env, model_type_array, &types_vector);
230 syncer::ModelTypeSet types;
231 for (size_t i = 0; i < types_vector.size(); i++) {
232 types.Put(static_cast<syncer::ModelType>(types_vector[i]));
233 }
234 sync_service_->OnUserChoseDatatypes(sync_everything, types);
235}
236
torne0a4a3ab12015-12-10 19:45:52237jboolean ProfileSyncServiceAndroid::IsCryptographerReady(
238 JNIEnv* env,
239 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38240 syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
241 return sync_service_->IsCryptographerReady(&trans);
242}
243
244jboolean ProfileSyncServiceAndroid::IsEncryptEverythingAllowed(
torne0a4a3ab12015-12-10 19:45:52245 JNIEnv* env,
246 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38247 DCHECK_CURRENTLY_ON(BrowserThread::UI);
248 return sync_service_->IsEncryptEverythingAllowed();
249}
250
251jboolean ProfileSyncServiceAndroid::IsEncryptEverythingEnabled(
torne0a4a3ab12015-12-10 19:45:52252 JNIEnv* env,
253 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38254 DCHECK_CURRENTLY_ON(BrowserThread::UI);
255 return sync_service_->IsEncryptEverythingEnabled();
256}
257
258void ProfileSyncServiceAndroid::EnableEncryptEverything(
torne0a4a3ab12015-12-10 19:45:52259 JNIEnv* env,
260 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38261 DCHECK_CURRENTLY_ON(BrowserThread::UI);
262 sync_service_->EnableEncryptEverything();
263}
264
maxbogue28baa962015-10-01 17:21:38265jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForDecryption(
torne0a4a3ab12015-12-10 19:45:52266 JNIEnv* env,
267 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38268 DCHECK_CURRENTLY_ON(BrowserThread::UI);
269 return sync_service_->IsPassphraseRequiredForDecryption();
270}
271
272jboolean ProfileSyncServiceAndroid::IsUsingSecondaryPassphrase(
torne0a4a3ab12015-12-10 19:45:52273 JNIEnv* env,
274 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38275 DCHECK_CURRENTLY_ON(BrowserThread::UI);
276 return sync_service_->IsUsingSecondaryPassphrase();
277}
278
maxbogue774f3172015-11-18 16:26:58279ScopedJavaLocalRef<jbyteArray>
torne0a4a3ab12015-12-10 19:45:52280ProfileSyncServiceAndroid::GetCustomPassphraseKey(
281 JNIEnv* env,
282 const JavaParamRef<jobject>& obj) {
maxbogue774f3172015-11-18 16:26:58283 std::string key = sync_service_->GetCustomPassphraseKey();
284 return base::android::ToJavaByteArray(
285 env, reinterpret_cast<const uint8_t*>(key.data()), key.size());
286}
287
torne0a4a3ab12015-12-10 19:45:52288jint ProfileSyncServiceAndroid::GetPassphraseType(
289 JNIEnv* env,
290 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38291 DCHECK_CURRENTLY_ON(BrowserThread::UI);
melandory5c441aa2016-08-30 06:09:10292 return static_cast<unsigned>(sync_service_->GetPassphraseType());
maxbogue28baa962015-10-01 17:21:38293}
294
295void ProfileSyncServiceAndroid::SetEncryptionPassphrase(
torne0a4a3ab12015-12-10 19:45:52296 JNIEnv* env,
297 const JavaParamRef<jobject>& obj,
298 const JavaParamRef<jstring>& passphrase) {
maxbogue28baa962015-10-01 17:21:38299 DCHECK_CURRENTLY_ON(BrowserThread::UI);
300 std::string key = ConvertJavaStringToUTF8(env, passphrase);
301 sync_service_->SetEncryptionPassphrase(key, ProfileSyncService::EXPLICIT);
302}
303
304jboolean ProfileSyncServiceAndroid::SetDecryptionPassphrase(
torne0a4a3ab12015-12-10 19:45:52305 JNIEnv* env,
306 const JavaParamRef<jobject>& obj,
307 const JavaParamRef<jstring>& passphrase) {
maxbogue28baa962015-10-01 17:21:38308 DCHECK_CURRENTLY_ON(BrowserThread::UI);
309 std::string key = ConvertJavaStringToUTF8(env, passphrase);
310 return sync_service_->SetDecryptionPassphrase(key);
311}
312
313jboolean ProfileSyncServiceAndroid::HasExplicitPassphraseTime(
torne0a4a3ab12015-12-10 19:45:52314 JNIEnv* env,
315 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38316 DCHECK_CURRENTLY_ON(BrowserThread::UI);
317 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
318 return !passphrase_time.is_null();
319}
320
321jlong ProfileSyncServiceAndroid::GetExplicitPassphraseTime(
torne0a4a3ab12015-12-10 19:45:52322 JNIEnv* env,
323 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38324 DCHECK_CURRENTLY_ON(BrowserThread::UI);
325 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
326 return passphrase_time.ToJavaTime();
327}
328
torne0a4a3ab12015-12-10 19:45:52329void ProfileSyncServiceAndroid::FlushDirectory(JNIEnv* env,
330 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23331 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxbogued4470ca2014-09-30 23:38:11332 sync_service_->FlushDirectory();
333}
334
[email protected]9049a7b2013-03-07 22:22:03335ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::QuerySyncStatusSummary(
torne0a4a3ab12015-12-10 19:45:52336 JNIEnv* env,
337 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23338 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03339 DCHECK(profile_);
[email protected]9e8df052013-09-18 10:47:18340 std::string status(sync_service_->QuerySyncStatusSummaryString());
[email protected]9049a7b2013-03-07 22:22:03341 return ConvertUTF8ToJavaString(env, status);
342}
343
torne0a4a3ab12015-12-10 19:45:52344void ProfileSyncServiceAndroid::GetAllNodes(
345 JNIEnv* env,
346 const JavaParamRef<jobject>& obj,
347 const JavaParamRef<jobject>& callback) {
pvalenzuelaff27ca202015-05-20 23:34:21348 base::android::ScopedJavaGlobalRef<jobject> java_callback;
349 java_callback.Reset(env, callback);
350
dcheng0569a0e2016-04-14 17:37:05351 base::Callback<void(std::unique_ptr<base::ListValue>)> native_callback =
pvalenzuelaff27ca202015-05-20 23:34:21352 base::Bind(&NativeGetAllNodesCallback, java_callback);
353 sync_service_->GetAllNodes(native_callback);
354}
355
torne0a4a3ab12015-12-10 19:45:52356jint ProfileSyncServiceAndroid::GetAuthError(JNIEnv* env,
357 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38358 DCHECK_CURRENTLY_ON(BrowserThread::UI);
359 return sync_service_->GetAuthError().state();
360}
361
362jboolean ProfileSyncServiceAndroid::HasUnrecoverableError(
torne0a4a3ab12015-12-10 19:45:52363 JNIEnv* env,
364 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38365 DCHECK_CURRENTLY_ON(BrowserThread::UI);
366 return sync_service_->HasUnrecoverableError();
367}
368
gogeralda2e00442016-08-17 05:59:06369jint ProfileSyncServiceAndroid::GetProtocolErrorClientAction(
370 JNIEnv* env,
371 const JavaParamRef<jobject>&) {
372 DCHECK_CURRENTLY_ON(BrowserThread::UI);
373 syncer::SyncStatus status;
374 sync_service_->QueryDetailedSyncStatus(&status);
375 return status.sync_protocol_error.action;
376}
377
maxbogue28baa962015-10-01 17:21:38378// Pure SyncPrefs calls.
379
torne0a4a3ab12015-12-10 19:45:52380jboolean ProfileSyncServiceAndroid::IsPassphrasePrompted(
381 JNIEnv* env,
382 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38383 return sync_prefs_->IsPassphrasePrompted();
384}
385
torne0a4a3ab12015-12-10 19:45:52386void ProfileSyncServiceAndroid::SetPassphrasePrompted(
387 JNIEnv* env,
388 const JavaParamRef<jobject>& obj,
389 jboolean prompted) {
maxbogue28baa962015-10-01 17:21:38390 sync_prefs_->SetPassphrasePrompted(prompted);
391}
392
maxboguec7f232d2015-07-29 19:25:40393void ProfileSyncServiceAndroid::SetSyncSessionsId(
torne0a4a3ab12015-12-10 19:45:52394 JNIEnv* env,
395 const JavaParamRef<jobject>& obj,
396 const JavaParamRef<jstring>& tag) {
anujk.sharma86194482015-04-23 06:38:23397 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03398 DCHECK(profile_);
399 std::string machine_tag = ConvertJavaStringToUTF8(env, tag);
[email protected]aa5b2ece2013-05-17 00:37:36400 sync_prefs_->SetSyncSessionsGUID(machine_tag);
[email protected]9049a7b2013-03-07 22:22:03401}
402
maxbogue28baa962015-10-01 17:21:38403jboolean ProfileSyncServiceAndroid::HasKeepEverythingSynced(
torne0a4a3ab12015-12-10 19:45:52404 JNIEnv* env,
405 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23406 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxbogue28baa962015-10-01 17:21:38407 return sync_prefs_->HasKeepEverythingSynced();
[email protected]9049a7b2013-03-07 22:22:03408}
409
maxbogue28baa962015-10-01 17:21:38410// UI string getters.
maxboguec021ddcc2014-10-09 16:21:24411
[email protected]9049a7b2013-03-07 22:22:03412ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52413ProfileSyncServiceAndroid::GetSyncEnterGooglePassphraseBodyWithDateText(
414 JNIEnv* env,
415 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23416 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03417 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
[email protected]a04db822013-12-11 19:14:40418 base::string16 passphrase_time_str =
419 base::TimeFormatShortDate(passphrase_time);
[email protected]9049a7b2013-03-07 22:22:03420 return base::android::ConvertUTF16ToJavaString(env,
421 l10n_util::GetStringFUTF16(
422 IDS_SYNC_ENTER_GOOGLE_PASSPHRASE_BODY_WITH_DATE,
423 passphrase_time_str));
424}
425
426ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52427ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyWithDateText(
428 JNIEnv* env,
429 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23430 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03431 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
[email protected]a04db822013-12-11 19:14:40432 base::string16 passphrase_time_str =
433 base::TimeFormatShortDate(passphrase_time);
[email protected]9049a7b2013-03-07 22:22:03434 return base::android::ConvertUTF16ToJavaString(env,
435 l10n_util::GetStringFUTF16(IDS_SYNC_ENTER_PASSPHRASE_BODY_WITH_DATE,
436 passphrase_time_str));
437}
438
439ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52440ProfileSyncServiceAndroid::GetCurrentSignedInAccountText(
441 JNIEnv* env,
442 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23443 DCHECK_CURRENTLY_ON(BrowserThread::UI);
pavelya550d222016-12-19 15:46:58444 const std::string& sync_username =
445 SigninManagerFactory::GetForProfile(profile_)
446 ->GetAuthenticatedAccountInfo()
447 .email;
448 return base::android::ConvertUTF16ToJavaString(
449 env, l10n_util::GetStringFUTF16(IDS_SYNC_ACCOUNT_INFO,
450 base::ASCIIToUTF16(sync_username)));
[email protected]4faa9de02013-03-26 10:17:20451}
452
453ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52454ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyText(
455 JNIEnv* env,
456 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23457 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03458 return ConvertUTF8ToJavaString(
459 env, l10n_util::GetStringUTF8(IDS_SYNC_ENTER_PASSPHRASE_BODY));
460}
461
maxbogue28baa962015-10-01 17:21:38462// Functionality only available for testing purposes.
[email protected]9049a7b2013-03-07 22:22:03463
464ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::GetAboutInfoForTest(
torne0a4a3ab12015-12-10 19:45:52465 JNIEnv* env,
466 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23467 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03468
dcheng0569a0e2016-04-14 17:37:05469 std::unique_ptr<base::DictionaryValue> about_info =
maxbogue7e006db2016-10-03 19:48:28470 syncer::sync_ui_util::ConstructAboutInformation(
droger5144c432015-09-17 10:53:11471 sync_service_, sync_service_->signin(), chrome::GetChannel());
[email protected]9049a7b2013-03-07 22:22:03472 std::string about_info_json;
estade8d046462015-05-16 01:02:34473 base::JSONWriter::Write(*about_info, &about_info_json);
[email protected]9049a7b2013-03-07 22:22:03474
475 return ConvertUTF8ToJavaString(env, about_info_json);
476}
477
[email protected]ed4d7052013-09-04 19:01:37478jlong ProfileSyncServiceAndroid::GetLastSyncedTimeForTest(
torne0a4a3ab12015-12-10 19:45:52479 JNIEnv* env,
480 const JavaParamRef<jobject>& obj) {
[email protected]ed4d7052013-09-04 19:01:37481 // Use profile preferences here instead of SyncPrefs to avoid an extra
482 // conversion, since SyncPrefs::GetLastSyncedTime() converts the stored value
483 // to to base::Time.
484 return static_cast<jlong>(
maxbogue7e006db2016-10-03 19:48:28485 profile_->GetPrefs()->GetInt64(syncer::prefs::kSyncLastSyncedTime));
[email protected]ed4d7052013-09-04 19:01:37486}
487
[email protected]be21aaa2014-08-21 21:26:38488void ProfileSyncServiceAndroid::OverrideNetworkResourcesForTest(
489 JNIEnv* env,
torne0a4a3ab12015-12-10 19:45:52490 const JavaParamRef<jobject>& obj,
[email protected]be21aaa2014-08-21 21:26:38491 jlong network_resources) {
492 syncer::NetworkResources* resources =
493 reinterpret_cast<syncer::NetworkResources*>(network_resources);
494 sync_service_->OverrideNetworkResourcesForTest(
dcheng0569a0e2016-04-14 17:37:05495 base::WrapUnique<syncer::NetworkResources>(resources));
[email protected]be21aaa2014-08-21 21:26:38496}
497
bauerbdab6c6f2014-08-28 09:20:23498// static
[email protected]332a83362013-03-26 08:45:55499ProfileSyncServiceAndroid*
500 ProfileSyncServiceAndroid::GetProfileSyncServiceAndroid() {
501 return reinterpret_cast<ProfileSyncServiceAndroid*>(
maxbogue89bee1d862015-08-26 21:00:07502 Java_ProfileSyncService_getProfileSyncServiceAndroid(
503 AttachCurrentThread()));
[email protected]332a83362013-03-26 08:45:55504}
505
maxbogue28baa962015-10-01 17:21:38506// static
507bool ProfileSyncServiceAndroid::Register(JNIEnv* env) {
508 return RegisterNativesImpl(env);
509}
510
torne89cc5d92015-09-04 11:16:35511static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
[email protected]9049a7b2013-03-07 22:22:03512 ProfileSyncServiceAndroid* profile_sync_service_android =
513 new ProfileSyncServiceAndroid(env, obj);
cullinan3b803e22015-12-02 01:31:24514 if (profile_sync_service_android->Init()) {
515 return reinterpret_cast<intptr_t>(profile_sync_service_android);
516 } else {
517 delete profile_sync_service_android;
518 return 0;
519 }
[email protected]9049a7b2013-03-07 22:22:03520}