blob: 0b8bf4448453ffb4ca29f82af89f918e46330702 [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
dcheng0569a0e2016-04-14 17:37:0510#include <memory>
11
[email protected]9049a7b2013-03-07 22:22:0312#include "base/android/jni_android.h"
maxbogue47c75042015-08-12 18:05:0113#include "base/android/jni_array.h"
[email protected]9049a7b2013-03-07 22:22:0314#include "base/android/jni_string.h"
15#include "base/bind.h"
16#include "base/i18n/time_formatting.h"
17#include "base/json/json_writer.h"
18#include "base/logging.h"
dcheng0569a0e2016-04-14 17:37:0519#include "base/memory/ptr_util.h"
[email protected]e309f312013-06-07 21:50:0820#include "base/strings/utf_string_conversions.h"
[email protected]cc86ccfe2013-06-28 00:10:5021#include "base/time/time.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"
blundell7282b512015-11-09 07:21:1129#include "components/browser_sync/browser/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"
Max Boguefef332d2016-07-28 22:09:0932#include "components/sync/core/network_resources.h"
33#include "components/sync/core/read_transaction.h"
maxbogue93150a5d2015-08-31 21:08:3234#include "components/sync_driver/about_sync_util.h"
[email protected]34f54052014-03-20 21:33:4035#include "components/sync_driver/pref_names.h"
36#include "components/sync_driver/sync_prefs.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"
40#include "google_apis/gaia/google_service_auth_error.h"
sdefresne78b2e912016-01-12 08:46:2341#include "grit/components_strings.h"
[email protected]9049a7b2013-03-07 22:22:0342#include "jni/ProfileSyncService_jni.h"
[email protected]9049a7b2013-03-07 22:22:0343#include "ui/base/l10n/l10n_util.h"
44
45using base::android::AttachCurrentThread;
46using base::android::CheckException;
47using base::android::ConvertJavaStringToUTF8;
48using base::android::ConvertUTF8ToJavaString;
49using base::android::ScopedJavaLocalRef;
50using 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);
69 Java_ProfileSyncService_onGetAllNodesResult(env,
70 callback.obj(),
71 java_json_string.obj());
72}
73
maxbogue28baa962015-10-01 17:21:3874ScopedJavaLocalRef<jintArray> ModelTypeSetToJavaIntArray(
75 JNIEnv* env,
76 syncer::ModelTypeSet types) {
77 std::vector<int> type_vector;
78 for (syncer::ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
79 type_vector.push_back(it.Get());
80 }
81 return base::android::ToJavaIntArray(env, type_vector);
82}
83
[email protected]9049a7b2013-03-07 22:22:0384} // namespace
85
86ProfileSyncServiceAndroid::ProfileSyncServiceAndroid(JNIEnv* env, jobject obj)
87 : profile_(NULL),
88 sync_service_(NULL),
89 weak_java_profile_sync_service_(env, obj) {
90 if (g_browser_process == NULL ||
91 g_browser_process->profile_manager() == NULL) {
92 NOTREACHED() << "Browser process or profile manager not initialized";
93 return;
94 }
95
[email protected]dd547a22013-12-12 18:37:4196 profile_ = ProfileManager::GetActiveUserProfile();
[email protected]9049a7b2013-03-07 22:22:0397 if (profile_ == NULL) {
98 NOTREACHED() << "Sync Init: Profile not found.";
99 return;
100 }
101
[email protected]34f54052014-03-20 21:33:40102 sync_prefs_.reset(new sync_driver::SyncPrefs(profile_->GetPrefs()));
[email protected]aa5b2ece2013-05-17 00:37:36103
[email protected]9049a7b2013-03-07 22:22:03104 sync_service_ =
105 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
[email protected]9049a7b2013-03-07 22:22:03106}
107
cullinan3b803e22015-12-02 01:31:24108bool ProfileSyncServiceAndroid::Init() {
109 if (sync_service_) {
110 sync_service_->AddObserver(this);
maxbogue1a4f00902015-12-15 21:39:40111 sync_service_->SetPlatformSyncAllowedProvider(
112 base::Bind(&ProfileSyncServiceAndroid::IsSyncAllowedByAndroid,
113 base::Unretained(this)));
cullinan3b803e22015-12-02 01:31:24114 return true;
115 } else {
116 return false;
117 }
[email protected]9049a7b2013-03-07 22:22:03118}
119
maxbogue28baa962015-10-01 17:21:38120ProfileSyncServiceAndroid::~ProfileSyncServiceAndroid() {
maxbogue1a4f00902015-12-15 21:39:40121 if (sync_service_) {
[email protected]9049a7b2013-03-07 22:22:03122 sync_service_->RemoveObserver(this);
maxbogue1a4f00902015-12-15 21:39:40123 sync_service_->SetPlatformSyncAllowedProvider(
124 ProfileSyncService::PlatformSyncAllowedProvider());
[email protected]9049a7b2013-03-07 22:22:03125 }
126}
127
[email protected]9049a7b2013-03-07 22:22:03128void ProfileSyncServiceAndroid::OnStateChanged() {
[email protected]9049a7b2013-03-07 22:22:03129 // Notify the java world that our sync state has changed.
130 JNIEnv* env = AttachCurrentThread();
131 Java_ProfileSyncService_syncStateChanged(
132 env, weak_java_profile_sync_service_.get(env).obj());
133}
134
maxbogue1a4f00902015-12-15 21:39:40135bool ProfileSyncServiceAndroid::IsSyncAllowedByAndroid() const {
136 DCHECK_CURRENTLY_ON(BrowserThread::UI);
137 JNIEnv* env = AttachCurrentThread();
138 return Java_ProfileSyncService_isMasterSyncEnabled(
139 env, weak_java_profile_sync_service_.get(env).obj());
140}
141
maxbogue28baa962015-10-01 17:21:38142// Pure ProfileSyncService calls.
zeab1b09b72015-05-01 17:56:40143
maxbogue28baa962015-10-01 17:21:38144jboolean ProfileSyncServiceAndroid::IsSyncRequested(
torne0a4a3ab12015-12-10 19:45:52145 JNIEnv* env,
146 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38147 DCHECK_CURRENTLY_ON(BrowserThread::UI);
148 return sync_service_->IsSyncRequested();
zeab1b09b72015-05-01 17:56:40149}
150
torne0a4a3ab12015-12-10 19:45:52151void ProfileSyncServiceAndroid::RequestStart(JNIEnv* env,
152 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23153 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguecd3fad6b2015-06-09 00:44:53154 sync_service_->RequestStart();
[email protected]9049a7b2013-03-07 22:22:03155}
156
torne0a4a3ab12015-12-10 19:45:52157void ProfileSyncServiceAndroid::RequestStop(JNIEnv* env,
158 const JavaParamRef<jobject>&) {
maxboguef5c53a2d2015-07-08 20:47:29159 DCHECK_CURRENTLY_ON(BrowserThread::UI);
160 sync_service_->RequestStop(ProfileSyncService::KEEP_DATA);
161}
162
torne0a4a3ab12015-12-10 19:45:52163void ProfileSyncServiceAndroid::SignOutSync(JNIEnv* env,
164 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23165 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03166 DCHECK(profile_);
maxbogue699262c92015-06-19 19:24:58167 sync_service_->RequestStop(ProfileSyncService::CLEAR_DATA);
[email protected]9049a7b2013-03-07 22:22:03168}
169
torne0a4a3ab12015-12-10 19:45:52170jboolean ProfileSyncServiceAndroid::IsSyncActive(
171 JNIEnv* env,
172 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38173 DCHECK_CURRENTLY_ON(BrowserThread::UI);
174 return sync_service_->IsSyncActive();
175}
176
torne0a4a3ab12015-12-10 19:45:52177jboolean ProfileSyncServiceAndroid::IsBackendInitialized(
178 JNIEnv* env,
179 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38180 DCHECK_CURRENTLY_ON(BrowserThread::UI);
181 return sync_service_->IsBackendInitialized();
182}
183
maxbogue28baa962015-10-01 17:21:38184void ProfileSyncServiceAndroid::SetSetupInProgress(
torne0a4a3ab12015-12-10 19:45:52185 JNIEnv* env,
186 const JavaParamRef<jobject>& obj,
187 jboolean in_progress) {
maxbogue28baa962015-10-01 17:21:38188 DCHECK_CURRENTLY_ON(BrowserThread::UI);
tommyclif3a1551e2016-06-21 18:11:23189 if (in_progress) {
190 sync_blocker_ = sync_service_->GetSetupInProgressHandle();
191 } else {
192 sync_blocker_.reset();
193 }
maxbogue28baa962015-10-01 17:21:38194}
195
maxboguefe00952a2016-01-19 19:02:01196jboolean ProfileSyncServiceAndroid::IsFirstSetupComplete(
torne0a4a3ab12015-12-10 19:45:52197 JNIEnv* env,
198 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38199 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguefe00952a2016-01-19 19:02:01200 return sync_service_->IsFirstSetupComplete();
maxbogue28baa962015-10-01 17:21:38201}
202
maxboguefe00952a2016-01-19 19:02:01203void ProfileSyncServiceAndroid::SetFirstSetupComplete(
torne0a4a3ab12015-12-10 19:45:52204 JNIEnv* env,
205 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38206 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxboguefe00952a2016-01-19 19:02:01207 sync_service_->SetFirstSetupComplete();
maxbogue28baa962015-10-01 17:21:38208}
209
210ScopedJavaLocalRef<jintArray> ProfileSyncServiceAndroid::GetActiveDataTypes(
torne0a4a3ab12015-12-10 19:45:52211 JNIEnv* env,
212 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38213 syncer::ModelTypeSet types = sync_service_->GetActiveDataTypes();
214 return ModelTypeSetToJavaIntArray(env, types);
215}
216
217ScopedJavaLocalRef<jintArray> ProfileSyncServiceAndroid::GetPreferredDataTypes(
torne0a4a3ab12015-12-10 19:45:52218 JNIEnv* env,
219 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38220 syncer::ModelTypeSet types = sync_service_->GetPreferredDataTypes();
221 return ModelTypeSetToJavaIntArray(env, types);
222}
223
224void ProfileSyncServiceAndroid::SetPreferredDataTypes(
torne0a4a3ab12015-12-10 19:45:52225 JNIEnv* env,
226 const JavaParamRef<jobject>& obj,
maxbogue28baa962015-10-01 17:21:38227 jboolean sync_everything,
torne0a4a3ab12015-12-10 19:45:52228 const JavaParamRef<jintArray>& model_type_array) {
maxbogue28baa962015-10-01 17:21:38229 DCHECK_CURRENTLY_ON(BrowserThread::UI);
230 std::vector<int> types_vector;
231 base::android::JavaIntArrayToIntVector(env, model_type_array, &types_vector);
232 syncer::ModelTypeSet types;
233 for (size_t i = 0; i < types_vector.size(); i++) {
234 types.Put(static_cast<syncer::ModelType>(types_vector[i]));
235 }
236 sync_service_->OnUserChoseDatatypes(sync_everything, types);
237}
238
torne0a4a3ab12015-12-10 19:45:52239jboolean ProfileSyncServiceAndroid::IsCryptographerReady(
240 JNIEnv* env,
241 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38242 syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
243 return sync_service_->IsCryptographerReady(&trans);
244}
245
246jboolean ProfileSyncServiceAndroid::IsEncryptEverythingAllowed(
torne0a4a3ab12015-12-10 19:45:52247 JNIEnv* env,
248 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38249 DCHECK_CURRENTLY_ON(BrowserThread::UI);
250 return sync_service_->IsEncryptEverythingAllowed();
251}
252
253jboolean ProfileSyncServiceAndroid::IsEncryptEverythingEnabled(
torne0a4a3ab12015-12-10 19:45:52254 JNIEnv* env,
255 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38256 DCHECK_CURRENTLY_ON(BrowserThread::UI);
257 return sync_service_->IsEncryptEverythingEnabled();
258}
259
260void ProfileSyncServiceAndroid::EnableEncryptEverything(
torne0a4a3ab12015-12-10 19:45:52261 JNIEnv* env,
262 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38263 DCHECK_CURRENTLY_ON(BrowserThread::UI);
264 sync_service_->EnableEncryptEverything();
265}
266
maxbogue28baa962015-10-01 17:21:38267jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForDecryption(
torne0a4a3ab12015-12-10 19:45:52268 JNIEnv* env,
269 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38270 DCHECK_CURRENTLY_ON(BrowserThread::UI);
271 return sync_service_->IsPassphraseRequiredForDecryption();
272}
273
274jboolean ProfileSyncServiceAndroid::IsUsingSecondaryPassphrase(
torne0a4a3ab12015-12-10 19:45:52275 JNIEnv* env,
276 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38277 DCHECK_CURRENTLY_ON(BrowserThread::UI);
278 return sync_service_->IsUsingSecondaryPassphrase();
279}
280
maxbogue774f3172015-11-18 16:26:58281ScopedJavaLocalRef<jbyteArray>
torne0a4a3ab12015-12-10 19:45:52282ProfileSyncServiceAndroid::GetCustomPassphraseKey(
283 JNIEnv* env,
284 const JavaParamRef<jobject>& obj) {
maxbogue774f3172015-11-18 16:26:58285 std::string key = sync_service_->GetCustomPassphraseKey();
286 return base::android::ToJavaByteArray(
287 env, reinterpret_cast<const uint8_t*>(key.data()), key.size());
288}
289
torne0a4a3ab12015-12-10 19:45:52290jint ProfileSyncServiceAndroid::GetPassphraseType(
291 JNIEnv* env,
292 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38293 DCHECK_CURRENTLY_ON(BrowserThread::UI);
294 return sync_service_->GetPassphraseType();
295}
296
297void ProfileSyncServiceAndroid::SetEncryptionPassphrase(
torne0a4a3ab12015-12-10 19:45:52298 JNIEnv* env,
299 const JavaParamRef<jobject>& obj,
300 const JavaParamRef<jstring>& passphrase) {
maxbogue28baa962015-10-01 17:21:38301 DCHECK_CURRENTLY_ON(BrowserThread::UI);
302 std::string key = ConvertJavaStringToUTF8(env, passphrase);
303 sync_service_->SetEncryptionPassphrase(key, ProfileSyncService::EXPLICIT);
304}
305
306jboolean ProfileSyncServiceAndroid::SetDecryptionPassphrase(
torne0a4a3ab12015-12-10 19:45:52307 JNIEnv* env,
308 const JavaParamRef<jobject>& obj,
309 const JavaParamRef<jstring>& passphrase) {
maxbogue28baa962015-10-01 17:21:38310 DCHECK_CURRENTLY_ON(BrowserThread::UI);
311 std::string key = ConvertJavaStringToUTF8(env, passphrase);
312 return sync_service_->SetDecryptionPassphrase(key);
313}
314
315jboolean ProfileSyncServiceAndroid::HasExplicitPassphraseTime(
torne0a4a3ab12015-12-10 19:45:52316 JNIEnv* env,
317 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38318 DCHECK_CURRENTLY_ON(BrowserThread::UI);
319 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
320 return !passphrase_time.is_null();
321}
322
323jlong ProfileSyncServiceAndroid::GetExplicitPassphraseTime(
torne0a4a3ab12015-12-10 19:45:52324 JNIEnv* env,
325 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38326 DCHECK_CURRENTLY_ON(BrowserThread::UI);
327 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
328 return passphrase_time.ToJavaTime();
329}
330
torne0a4a3ab12015-12-10 19:45:52331void ProfileSyncServiceAndroid::FlushDirectory(JNIEnv* env,
332 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23333 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxbogued4470ca2014-09-30 23:38:11334 sync_service_->FlushDirectory();
335}
336
[email protected]9049a7b2013-03-07 22:22:03337ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::QuerySyncStatusSummary(
torne0a4a3ab12015-12-10 19:45:52338 JNIEnv* env,
339 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23340 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03341 DCHECK(profile_);
[email protected]9e8df052013-09-18 10:47:18342 std::string status(sync_service_->QuerySyncStatusSummaryString());
[email protected]9049a7b2013-03-07 22:22:03343 return ConvertUTF8ToJavaString(env, status);
344}
345
torne0a4a3ab12015-12-10 19:45:52346void ProfileSyncServiceAndroid::GetAllNodes(
347 JNIEnv* env,
348 const JavaParamRef<jobject>& obj,
349 const JavaParamRef<jobject>& callback) {
pvalenzuelaff27ca202015-05-20 23:34:21350 base::android::ScopedJavaGlobalRef<jobject> java_callback;
351 java_callback.Reset(env, callback);
352
dcheng0569a0e2016-04-14 17:37:05353 base::Callback<void(std::unique_ptr<base::ListValue>)> native_callback =
pvalenzuelaff27ca202015-05-20 23:34:21354 base::Bind(&NativeGetAllNodesCallback, java_callback);
355 sync_service_->GetAllNodes(native_callback);
356}
357
torne0a4a3ab12015-12-10 19:45:52358jint ProfileSyncServiceAndroid::GetAuthError(JNIEnv* env,
359 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38360 DCHECK_CURRENTLY_ON(BrowserThread::UI);
361 return sync_service_->GetAuthError().state();
362}
363
364jboolean ProfileSyncServiceAndroid::HasUnrecoverableError(
torne0a4a3ab12015-12-10 19:45:52365 JNIEnv* env,
366 const JavaParamRef<jobject>&) {
maxbogue28baa962015-10-01 17:21:38367 DCHECK_CURRENTLY_ON(BrowserThread::UI);
368 return sync_service_->HasUnrecoverableError();
369}
370
371// Pure SyncPrefs calls.
372
torne0a4a3ab12015-12-10 19:45:52373jboolean ProfileSyncServiceAndroid::IsPassphrasePrompted(
374 JNIEnv* env,
375 const JavaParamRef<jobject>& obj) {
maxbogue28baa962015-10-01 17:21:38376 return sync_prefs_->IsPassphrasePrompted();
377}
378
torne0a4a3ab12015-12-10 19:45:52379void ProfileSyncServiceAndroid::SetPassphrasePrompted(
380 JNIEnv* env,
381 const JavaParamRef<jobject>& obj,
382 jboolean prompted) {
maxbogue28baa962015-10-01 17:21:38383 sync_prefs_->SetPassphrasePrompted(prompted);
384}
385
maxboguec7f232d2015-07-29 19:25:40386void ProfileSyncServiceAndroid::SetSyncSessionsId(
torne0a4a3ab12015-12-10 19:45:52387 JNIEnv* env,
388 const JavaParamRef<jobject>& obj,
389 const JavaParamRef<jstring>& tag) {
anujk.sharma86194482015-04-23 06:38:23390 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03391 DCHECK(profile_);
392 std::string machine_tag = ConvertJavaStringToUTF8(env, tag);
[email protected]aa5b2ece2013-05-17 00:37:36393 sync_prefs_->SetSyncSessionsGUID(machine_tag);
[email protected]9049a7b2013-03-07 22:22:03394}
395
maxbogue28baa962015-10-01 17:21:38396jboolean ProfileSyncServiceAndroid::HasKeepEverythingSynced(
torne0a4a3ab12015-12-10 19:45:52397 JNIEnv* env,
398 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23399 DCHECK_CURRENTLY_ON(BrowserThread::UI);
maxbogue28baa962015-10-01 17:21:38400 return sync_prefs_->HasKeepEverythingSynced();
[email protected]9049a7b2013-03-07 22:22:03401}
402
maxbogue28baa962015-10-01 17:21:38403// UI string getters.
maxboguec021ddcc2014-10-09 16:21:24404
[email protected]9049a7b2013-03-07 22:22:03405ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52406ProfileSyncServiceAndroid::GetSyncEnterGooglePassphraseBodyWithDateText(
407 JNIEnv* env,
408 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23409 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03410 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
[email protected]a04db822013-12-11 19:14:40411 base::string16 passphrase_time_str =
412 base::TimeFormatShortDate(passphrase_time);
[email protected]9049a7b2013-03-07 22:22:03413 return base::android::ConvertUTF16ToJavaString(env,
414 l10n_util::GetStringFUTF16(
415 IDS_SYNC_ENTER_GOOGLE_PASSPHRASE_BODY_WITH_DATE,
416 passphrase_time_str));
417}
418
419ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52420ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyWithDateText(
421 JNIEnv* env,
422 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23423 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03424 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
[email protected]a04db822013-12-11 19:14:40425 base::string16 passphrase_time_str =
426 base::TimeFormatShortDate(passphrase_time);
[email protected]9049a7b2013-03-07 22:22:03427 return base::android::ConvertUTF16ToJavaString(env,
428 l10n_util::GetStringFUTF16(IDS_SYNC_ENTER_PASSPHRASE_BODY_WITH_DATE,
429 passphrase_time_str));
430}
431
432ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52433ProfileSyncServiceAndroid::GetCurrentSignedInAccountText(
434 JNIEnv* env,
435 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23436 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]4faa9de02013-03-26 10:17:20437 const std::string& sync_username =
bzanotti1b5be292015-08-31 12:10:05438 SigninManagerFactory::GetForProfile(profile_)
439 ->GetAuthenticatedAccountInfo()
440 .email;
[email protected]4faa9de02013-03-26 10:17:20441 return base::android::ConvertUTF16ToJavaString(env,
442 l10n_util::GetStringFUTF16(
443 IDS_SYNC_ACCOUNT_SYNCING_TO_USER,
[email protected]f911df52013-12-24 23:24:23444 base::ASCIIToUTF16(sync_username)));
[email protected]4faa9de02013-03-26 10:17:20445}
446
447ScopedJavaLocalRef<jstring>
torne0a4a3ab12015-12-10 19:45:52448ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyText(
449 JNIEnv* env,
450 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23451 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03452 return ConvertUTF8ToJavaString(
453 env, l10n_util::GetStringUTF8(IDS_SYNC_ENTER_PASSPHRASE_BODY));
454}
455
maxbogue28baa962015-10-01 17:21:38456// Functionality only available for testing purposes.
[email protected]9049a7b2013-03-07 22:22:03457
458ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::GetAboutInfoForTest(
torne0a4a3ab12015-12-10 19:45:52459 JNIEnv* env,
460 const JavaParamRef<jobject>&) {
anujk.sharma86194482015-04-23 06:38:23461 DCHECK_CURRENTLY_ON(BrowserThread::UI);
[email protected]9049a7b2013-03-07 22:22:03462
dcheng0569a0e2016-04-14 17:37:05463 std::unique_ptr<base::DictionaryValue> about_info =
droger5144c432015-09-17 10:53:11464 sync_driver::sync_ui_util::ConstructAboutInformation(
465 sync_service_, sync_service_->signin(), chrome::GetChannel());
[email protected]9049a7b2013-03-07 22:22:03466 std::string about_info_json;
estade8d046462015-05-16 01:02:34467 base::JSONWriter::Write(*about_info, &about_info_json);
[email protected]9049a7b2013-03-07 22:22:03468
469 return ConvertUTF8ToJavaString(env, about_info_json);
470}
471
[email protected]ed4d7052013-09-04 19:01:37472jlong ProfileSyncServiceAndroid::GetLastSyncedTimeForTest(
torne0a4a3ab12015-12-10 19:45:52473 JNIEnv* env,
474 const JavaParamRef<jobject>& obj) {
[email protected]ed4d7052013-09-04 19:01:37475 // Use profile preferences here instead of SyncPrefs to avoid an extra
476 // conversion, since SyncPrefs::GetLastSyncedTime() converts the stored value
477 // to to base::Time.
478 return static_cast<jlong>(
[email protected]34f54052014-03-20 21:33:40479 profile_->GetPrefs()->GetInt64(sync_driver::prefs::kSyncLastSyncedTime));
[email protected]ed4d7052013-09-04 19:01:37480}
481
[email protected]be21aaa2014-08-21 21:26:38482void ProfileSyncServiceAndroid::OverrideNetworkResourcesForTest(
483 JNIEnv* env,
torne0a4a3ab12015-12-10 19:45:52484 const JavaParamRef<jobject>& obj,
[email protected]be21aaa2014-08-21 21:26:38485 jlong network_resources) {
486 syncer::NetworkResources* resources =
487 reinterpret_cast<syncer::NetworkResources*>(network_resources);
488 sync_service_->OverrideNetworkResourcesForTest(
dcheng0569a0e2016-04-14 17:37:05489 base::WrapUnique<syncer::NetworkResources>(resources));
[email protected]be21aaa2014-08-21 21:26:38490}
491
bauerbdab6c6f2014-08-28 09:20:23492// static
[email protected]332a83362013-03-26 08:45:55493ProfileSyncServiceAndroid*
494 ProfileSyncServiceAndroid::GetProfileSyncServiceAndroid() {
495 return reinterpret_cast<ProfileSyncServiceAndroid*>(
maxbogue89bee1d862015-08-26 21:00:07496 Java_ProfileSyncService_getProfileSyncServiceAndroid(
497 AttachCurrentThread()));
[email protected]332a83362013-03-26 08:45:55498}
499
maxbogue28baa962015-10-01 17:21:38500// static
501bool ProfileSyncServiceAndroid::Register(JNIEnv* env) {
502 return RegisterNativesImpl(env);
503}
504
torne89cc5d92015-09-04 11:16:35505static jlong Init(JNIEnv* env, const JavaParamRef<jobject>& obj) {
[email protected]9049a7b2013-03-07 22:22:03506 ProfileSyncServiceAndroid* profile_sync_service_android =
507 new ProfileSyncServiceAndroid(env, obj);
cullinan3b803e22015-12-02 01:31:24508 if (profile_sync_service_android->Init()) {
509 return reinterpret_cast<intptr_t>(profile_sync_service_android);
510 } else {
511 delete profile_sync_service_android;
512 return 0;
513 }
[email protected]9049a7b2013-03-07 22:22:03514}