Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(657)

Side by Side Diff: chrome/browser/sync/profile_sync_service_android.cc

Issue 12313075: [sync] Upstream the Android ProfileSyncService (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Addressed comments Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // 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
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/bind.h"
10 #include "base/i18n/time_formatting.h"
11 #include "base/json/json_writer.h"
12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time.h"
15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/profiles/profile_manager.h"
17 #include "chrome/browser/signin/signin_manager.h"
18 #include "chrome/browser/signin/signin_manager_factory.h"
19 #include "chrome/browser/signin/token_service.h"
20 #include "chrome/browser/signin/token_service_factory.h"
21 #include "chrome/browser/sync/about_sync_util.h"
22 #include "chrome/browser/sync/profile_sync_service.h"
23 #include "chrome/browser/sync/profile_sync_service_factory.h"
24 #include "chrome/browser/sync/sync_prefs.h"
25 #include "chrome/browser/sync/sync_ui_util.h"
26 #include "chrome/common/chrome_notification_types.h"
27 #include "chrome/common/pref_names.h"
28 #include "content/public/browser/notification_service.h"
29 #include "google/cacheinvalidation/types.pb.h"
30 #include "google_apis/gaia/gaia_constants.h"
31 #include "google_apis/gaia/google_service_auth_error.h"
32 #include "grit/generated_resources.h"
33 #include "jni/ProfileSyncService_jni.h"
34 #include "sync/internal_api/public/base/model_type_invalidation_map.h"
35 #include "sync/internal_api/public/read_transaction.h"
36 #include "ui/base/l10n/l10n_util.h"
37
38 using base::android::AttachCurrentThread;
39 using base::android::CheckException;
40 using base::android::ConvertJavaStringToUTF8;
41 using base::android::ConvertUTF8ToJavaString;
42 using base::android::ScopedJavaLocalRef;
43 using content::BrowserThread;
44
45 namespace {
46 const char kSyncDisabledStatus[] = "OFFLINE_DISABLED";
47 } // namespace
48
49 ProfileSyncServiceAndroid::ProfileSyncServiceAndroid(JNIEnv* env, jobject obj)
50 : weak_java_profile_sync_service_(env, obj) {
51 profile_ = NULL;
52 sync_service_ = NULL;
53 if (g_browser_process == NULL ||
54 g_browser_process->profile_manager() == NULL) {
55 NOTREACHED() << "Browser process or profile manager not initialized";
56 return;
57 }
58
59 profile_ = g_browser_process->profile_manager()->GetDefaultProfile();
60 if (profile_ == NULL) {
61 NOTREACHED() << "Sync Init: Profile not found.";
62 return;
63 }
64
65 sync_service_ =
66 ProfileSyncServiceFactory::GetInstance()->GetForProfile(profile_);
67 DCHECK(sync_service_);
68 AddObserver();
69 }
70
71 void ProfileSyncServiceAndroid::AddObserver() {
72 if (!sync_service_->HasObserver(this)) {
Yaron 2013/02/27 23:10:25 only called in ctor, remove guard. Also, the other
nyquist 2013/02/28 22:38:50 Done.
73 sync_service_->AddObserver(this);
74 }
75
76 std::string signed_in_username =
77 SigninManagerFactory::GetForProfile(profile_)->GetAuthenticatedUsername();
78 if (!signed_in_username.empty()) {
79 // If the user is logged in, see if he has a valid token - if not, fetch
80 // a new one.
81 TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
82 if (!token_service->HasTokenForService(GaiaConstants::kSyncService) ||
83 (sync_service_->GetAuthError().state() ==
84 GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)) {
85 DVLOG(2) << "Trying to update token for user " << signed_in_username;
86 InvalidateAuthToken();
87 }
88 }
89 }
90
91 void ProfileSyncServiceAndroid::RemoveObserver() {
92 if (sync_service_->HasObserver(this)) {
93 sync_service_->RemoveObserver(this);
94 }
95 }
96
97 ProfileSyncServiceAndroid::~ProfileSyncServiceAndroid() {
98 RemoveObserver();
99 }
100
101 void ProfileSyncServiceAndroid::Destroy(JNIEnv* env, jobject obj) {
102 delete this;
103 }
104
105 // Must be called on the UI thread.
Yaron 2013/02/27 23:10:25 remove comment (asserted on first line)
nyquist 2013/02/28 22:38:50 Done.
106 void ProfileSyncServiceAndroid::SendNudgeNotification(
107 const std::string& str_object_id,
108 int64 version,
109 const std::string& state) {
110 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
111
112 // TODO(nileshagrawal): Merge this with ChromeInvalidationClient::Invalidate.
113 // Construct the ModelTypeStateMap and send it over with the notification.
114 syncer::ModelType model_type;
115 if (!syncer::NotificationTypeToRealModelType(str_object_id, &model_type)) {
116 DVLOG(1) << "Could not get invalidation model type; "
117 << "Sending notification with empty state map.";
118 syncer::ModelTypeInvalidationMap model_types_with_states;
119 content::NotificationService::current()->Notify(
120 chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
121 content::Source<Profile>(profile_),
122 content::Details<const syncer::ModelTypeInvalidationMap>(
123 &model_types_with_states));
124 return;
125 }
126
127 if (version != ipc::invalidation::Constants::UNKNOWN) {
128 std::map<syncer::ModelType, int64>::const_iterator it =
129 max_invalidation_versions_.find(model_type);
130 if ((it != max_invalidation_versions_.end()) &&
131 (version <= it->second)) {
132 DVLOG(1) << "Dropping redundant invalidation with version " << version;
133 return;
134 }
135 max_invalidation_versions_[model_type] = version;
136 }
137
138 syncer::ModelTypeSet types;
139 types.Put(model_type);
140 syncer::ModelTypeInvalidationMap model_types_with_states =
141 syncer::ModelTypeSetToInvalidationMap(types, state);
142
143 content::NotificationService::current()->Notify(
144 chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
145 content::Source<Profile>(profile_),
146 content::Details<const syncer::ModelTypeInvalidationMap>(
147 &model_types_with_states));
148 }
149
150
151 void ProfileSyncServiceAndroid::OnStateChanged() {
152 // Check for auth errors.
153 const GoogleServiceAuthError& auth_error = sync_service_->GetAuthError();
154 if (auth_error.state() == GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS) {
155 DVLOG(2) << "Updating auth token.";
156 InvalidateAuthToken();
157 }
158
159 // Notify the java world that our sync state has changed.
160 JNIEnv* env = AttachCurrentThread();
161 Java_ProfileSyncService_syncStateChanged(
162 env, weak_java_profile_sync_service_.get(env).obj());
163 }
164
165 void ProfileSyncServiceAndroid::TokenAvailable(
166 JNIEnv* env, jobject, jstring username, jstring auth_token) {
167 std::string token = ConvertJavaStringToUTF8(env, auth_token);
168 TokenServiceFactory::GetForProfile(profile_)->OnIssueAuthTokenSuccess(
169 GaiaConstants::kSyncService, token);
170 }
171
172 void ProfileSyncServiceAndroid::EnableSync(JNIEnv* env, jobject) {
173 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
174 // Don't need to do anything if we're already enabled.
175 browser_sync::SyncPrefs prefs(profile_->GetPrefs());
176 if (prefs.IsStartSuppressed())
177 sync_service_->UnsuppressAndStart();
178 else
179 DVLOG(2) << "Ignoring call to EnableSync() because sync is already enabled";
180 }
181
182 void ProfileSyncServiceAndroid::DisableSync(JNIEnv* env, jobject) {
183 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
184 sync_service_->StopAndSuppress();
185 }
186
187 void ProfileSyncServiceAndroid::SignInSync(
188 JNIEnv* env, jobject, jstring username, jstring auth_token) {
189 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
190 // Just return if sync already has everything it needs to start up (sync
191 // should start up automatically as long as it has credentials). This can
192 // happen normally if (for example) the user closes and reopens the sync
193 // settings window quickly during initial startup.
194 if (sync_service_->IsSyncEnabledAndLoggedIn() &&
195 sync_service_->IsSyncTokenAvailable() &&
196 sync_service_->HasSyncSetupCompleted())
197 return;
198
199 if (!sync_service_->IsSyncEnabledAndLoggedIn() ||
200 !sync_service_->IsSyncTokenAvailable()) {
201 // Set the currently-signed-in username, fetch an auth token if necessary,
202 // and enable sync.
203 std::string name = ConvertJavaStringToUTF8(env, username);
204 SigninManagerFactory::GetForProfile(profile_)->
205 SetAuthenticatedUsername(name);
206 std::string token = ConvertJavaStringToUTF8(env, auth_token);
207 if (token.empty()) {
208 // No credentials passed in - request an auth token.
209 // If fetching the auth token is successful, this will cause
210 // ProfileSyncService to start sync when it receives
211 // NOTIFICATION_TOKEN_AVAILABLE.
212 DVLOG(2) << "Fetching auth token for " << name;
213 InvalidateAuthToken();
214 } else {
215 // OnIssueAuthTokenSuccess will send out a notification to the sync
216 // service that will cause the sync backend to initialize.
217 TokenService* token_service =
218 TokenServiceFactory::GetForProfile(profile_);
219 token_service->OnIssueAuthTokenSuccess(GaiaConstants::kSyncService,
220 token);
221 }
222 }
223
224 // Enable sync (if we don't have credentials yet, this will enable sync but
225 // will not start it up - sync will start once credentials arrive).
226 sync_service_->UnsuppressAndStart();
227 }
228
229 void ProfileSyncServiceAndroid::SignOutSync(JNIEnv* env, jobject) {
230 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
231 DCHECK(profile_);
232 sync_service_->DisableForUser();
233
234 // Clear the tokens.
235 SigninManagerFactory::GetForProfile(profile_)->SignOut();
236
237 // Need to clear suppress start flag manually
238 browser_sync::SyncPrefs prefs(profile_->GetPrefs());
239 prefs.SetStartSuppressed(false);
240 }
241
242 ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::QuerySyncStatusSummary(
243 JNIEnv* env, jobject) {
244 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
245 DCHECK(profile_);
246 std::string status(sync_service_->QuerySyncStatusSummary());
247 return ConvertUTF8ToJavaString(env, status);
248 }
249
250 jboolean ProfileSyncServiceAndroid::SetSyncSessionsId(
251 JNIEnv* env, jobject obj, jstring tag) {
252 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
253 DCHECK(profile_);
254 std::string machine_tag = ConvertJavaStringToUTF8(env, tag);
255 browser_sync::SyncPrefs prefs(profile_->GetPrefs());
256 prefs.SetSyncSessionsGUID(machine_tag);
257 return true;
258 }
259
260 jint ProfileSyncServiceAndroid::GetAuthError(JNIEnv* env, jobject) {
261 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
262 return sync_service_->GetAuthError().state();
263 }
264
265 jboolean ProfileSyncServiceAndroid::IsEncryptEverythingEnabled(
266 JNIEnv* env, jobject) {
267 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
268 return sync_service_->EncryptEverythingEnabled();
269 }
270
271 jboolean ProfileSyncServiceAndroid::IsSyncInitialized(JNIEnv* env, jobject) {
272 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
273 return sync_service_->sync_initialized();
274 }
275
276 jboolean ProfileSyncServiceAndroid::IsFirstSetupInProgress(
277 JNIEnv* env, jobject) {
278 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
279 return sync_service_->FirstSetupInProgress();
280 }
281
282 jboolean ProfileSyncServiceAndroid::IsPassphraseRequired(JNIEnv* env, jobject) {
283 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
284 return sync_service_->IsPassphraseRequired();
285 }
286
287 jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForDecryption(
288 JNIEnv* env, jobject obj) {
289 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
290 // In case of CUSTOM_PASSPHRASE we always sync passwords. Prompt the user for
291 // a passphrase if cryptographer has any pending keys.
292 if (sync_service_->GetPassphraseType() == syncer::CUSTOM_PASSPHRASE) {
293 return !IsCryptographerReady(env, obj);
294 }
295 if (sync_service_->IsPassphraseRequiredForDecryption()) {
296 // Passwords datatype should never prompt for a passphrase, except when
297 // user is using a custom passphrase. Do not prompt for a passphrase if
298 // passwords are the only encrypted datatype. This prevents a temporary
299 // notification for passphrase when PSS has not completed configuring
300 // DataTypeManager, after configuration password datatype shall be disabled.
301 const syncer::ModelTypeSet encrypted_types =
302 sync_service_->GetEncryptedDataTypes();
303 const bool are_passwords_the_only_encrypted_type =
304 encrypted_types.Has(syncer::PASSWORDS) && encrypted_types.Size() == 1 &&
305 !sync_service_->ShouldEnablePasswordSyncForAndroid();
306 return !are_passwords_the_only_encrypted_type;
307 }
308 return false;
309 }
310
311 jboolean ProfileSyncServiceAndroid::IsPassphraseRequiredForExternalType(
312 JNIEnv* env, jobject) {
313 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
314 return
315 sync_service_->passphrase_required_reason() == syncer::REASON_DECRYPTION;
316 }
317
318 jboolean ProfileSyncServiceAndroid::IsUsingSecondaryPassphrase(
319 JNIEnv* env, jobject) {
320 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
321 return sync_service_->IsUsingSecondaryPassphrase();
322 }
323
324 jboolean ProfileSyncServiceAndroid::SetDecryptionPassphrase(
325 JNIEnv* env, jobject obj, jstring passphrase) {
326 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
327 std::string key = ConvertJavaStringToUTF8(env, passphrase);
328 return sync_service_->SetDecryptionPassphrase(key);
329 }
330
331 void ProfileSyncServiceAndroid::SetEncryptionPassphrase(
332 JNIEnv* env, jobject obj, jstring passphrase, jboolean is_gaia) {
333 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
334 std::string key = ConvertJavaStringToUTF8(env, passphrase);
335 sync_service_->SetEncryptionPassphrase(
336 key,
337 is_gaia ? ProfileSyncService::IMPLICIT : ProfileSyncService::EXPLICIT);
338 }
339
340 jboolean ProfileSyncServiceAndroid::IsCryptographerReady(JNIEnv* env, jobject) {
341 syncer::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
342 return sync_service_->IsCryptographerReady(&trans);
343 }
344
345 jint ProfileSyncServiceAndroid::GetPassphraseType(JNIEnv* env, jobject) {
346 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
347 return sync_service_->GetPassphraseType();
348 }
349
350 jboolean ProfileSyncServiceAndroid::HasExplicitPassphraseTime(
351 JNIEnv* env, jobject) {
352 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
353 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
354 return !passphrase_time.is_null();
355 }
356
357 ScopedJavaLocalRef<jstring>
358 ProfileSyncServiceAndroid::GetSyncEnterGooglePassphraseBodyWithDateText(
359 JNIEnv* env, jobject) {
360 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
361 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
362 string16 passphrase_time_str = base::TimeFormatShortDate(passphrase_time);
363 return base::android::ConvertUTF16ToJavaString(env,
364 l10n_util::GetStringFUTF16(
365 IDS_SYNC_ENTER_GOOGLE_PASSPHRASE_BODY_WITH_DATE,
366 passphrase_time_str));
367 }
368
369 ScopedJavaLocalRef<jstring>
370 ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyWithDateText(
371 JNIEnv* env, jobject) {
372 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
373 base::Time passphrase_time = sync_service_->GetExplicitPassphraseTime();
374 string16 passphrase_time_str = base::TimeFormatShortDate(passphrase_time);
375 return base::android::ConvertUTF16ToJavaString(env,
376 l10n_util::GetStringFUTF16(IDS_SYNC_ENTER_PASSPHRASE_BODY_WITH_DATE,
377 passphrase_time_str));
378 }
379
380 static jstring GetSyncEnterCustomPassphraseBodyText(JNIEnv* env, jclass clazz) {
Yaron 2013/02/27 23:10:25 Nit: convert to member function (this becomes a sc
381 return ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyText(
382 env, clazz).Release();
383 }
384
385 ScopedJavaLocalRef<jstring>
386 ProfileSyncServiceAndroid::GetSyncEnterCustomPassphraseBodyText(
387 JNIEnv* env, jclass) {
388 return ConvertUTF8ToJavaString(
389 env, l10n_util::GetStringUTF8(IDS_SYNC_ENTER_PASSPHRASE_BODY));
390 }
391
392 jboolean ProfileSyncServiceAndroid::IsMigrated(JNIEnv* env, jobject) {
393 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
394 syncer::SyncStatus status;
395 bool is_status_valid = sync_service_->QueryDetailedSyncStatus(&status);
396 return is_status_valid && !status.keystore_migration_time.is_null();
397 }
398
399 void ProfileSyncServiceAndroid::SetPreferredDataTypes(
400 JNIEnv* env, jobject obj,
401 jboolean sync_everything,
402 jboolean sync_autofill,
403 jboolean sync_bookmarks,
404 jboolean sync_passwords,
405 jboolean sync_sessions,
406 jboolean sync_typed_urls) {
407 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
408 syncer::ModelTypeSet types;
409 if (sync_autofill)
410 types.Put(syncer::AUTOFILL);
411 if (sync_bookmarks)
412 types.Put(syncer::BOOKMARKS);
413 if (sync_passwords)
414 types.Put(syncer::PASSWORDS);
415 if (sync_sessions)
416 types.Put(syncer::SESSIONS);
417 if (sync_typed_urls)
418 types.Put(syncer::TYPED_URLS);
419 sync_service_->OnUserChoseDatatypes(sync_everything, types);
420 }
421
422 void ProfileSyncServiceAndroid::SetSetupInProgress(
423 JNIEnv* env, jobject obj, jboolean in_progress) {
424 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
425 sync_service_->SetSetupInProgress(in_progress);
426 }
427
428 void ProfileSyncServiceAndroid::SetSyncSetupCompleted(
429 JNIEnv* env, jobject obj) {
430 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
431 sync_service_->SetSyncSetupCompleted();
432 }
433
434 jboolean ProfileSyncServiceAndroid::HasSyncSetupCompleted(
435 JNIEnv* env, jobject obj) {
436 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
437 return sync_service_->HasSyncSetupCompleted();
438 }
439
440 void ProfileSyncServiceAndroid::EnableEncryptEverything(
441 JNIEnv* env, jobject obj) {
442 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
443 sync_service_->EnableEncryptEverything();
444 }
445
446 jboolean ProfileSyncServiceAndroid::HasKeepEverythingSynced(
447 JNIEnv* env, jobject) {
448 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
449 browser_sync::SyncPrefs prefs(profile_->GetPrefs());
450 return prefs.HasKeepEverythingSynced();
451 }
452
453 jboolean ProfileSyncServiceAndroid::IsAutofillSyncEnabled(
454 JNIEnv* env, jobject obj) {
455 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
456 return HasKeepEverythingSynced(env, obj) ||
457 sync_service_->GetPreferredDataTypes().Has(syncer::AUTOFILL);
458 }
459
460 jboolean ProfileSyncServiceAndroid::IsBookmarkSyncEnabled(
461 JNIEnv* env, jobject obj) {
462 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
463 return HasKeepEverythingSynced(env, obj) ||
464 sync_service_->GetPreferredDataTypes().Has(syncer::BOOKMARKS);
465 }
466
467 jboolean ProfileSyncServiceAndroid::IsPasswordSyncEnabled(
468 JNIEnv* env, jobject obj) {
469 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
470 return HasKeepEverythingSynced(env, obj) ||
471 sync_service_->GetPreferredDataTypes().Has(syncer::PASSWORDS);
472 }
473
474 jboolean ProfileSyncServiceAndroid::IsTypedUrlSyncEnabled(
475 JNIEnv* env, jobject obj) {
476 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
477 return HasKeepEverythingSynced(env, obj) ||
478 sync_service_->GetPreferredDataTypes().Has(syncer::TYPED_URLS);
479 }
480
481 jboolean ProfileSyncServiceAndroid::IsSessionSyncEnabled(
482 JNIEnv* env, jobject obj) {
483 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
484 return HasKeepEverythingSynced(env, obj) ||
485 sync_service_->GetPreferredDataTypes().Has(syncer::SESSIONS);
486 }
487
488 jboolean ProfileSyncServiceAndroid::HasUnrecoverableError(
489 JNIEnv* env, jobject) {
490 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
491 return sync_service_->HasUnrecoverableError();
492 }
493
494 ScopedJavaLocalRef<jstring> ProfileSyncServiceAndroid::GetAboutInfoForTest(
495 JNIEnv* env, jobject) {
496 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
497
498 scoped_ptr<DictionaryValue> about_info =
499 sync_ui_util::ConstructAboutInformation(sync_service_);
500 std::string about_info_json;
501 base::JSONWriter::Write(about_info.get(), &about_info_json);
502
503 return ConvertUTF8ToJavaString(env, about_info_json);
504 }
505
506 void ProfileSyncServiceAndroid::InvalidateAuthToken() {
Yaron 2013/02/27 23:10:25 In theory this could be moved to TokenServiceAndro
nyquist 2013/02/28 22:38:50 Yes, we should move auth token and possibly part o
507 // Get the token from token-db. If there's no token yet, this must be the
508 // the first time the user is signing in so we don't need to invalidate
509 // anything.
510 TokenService* token_service = TokenServiceFactory::GetForProfile(profile_);
511 std::string invalid_token;
512 if (token_service->HasTokenForService(GaiaConstants::kSyncService)) {
513 invalid_token = token_service->GetTokenForService(
514 GaiaConstants::kSyncService);
515 }
516 const std::string& sync_username =
517 SigninManagerFactory::GetForProfile(profile_)->GetAuthenticatedUsername();
518 // Call into java to invalidate the current token and get a new one.
519 JNIEnv* env = AttachCurrentThread();
520 ScopedJavaLocalRef<jstring> j_sync_username =
521 ConvertUTF8ToJavaString(env, sync_username);
522 ScopedJavaLocalRef<jstring> j_invalid_token =
523 ConvertUTF8ToJavaString(env, invalid_token);
524 Java_ProfileSyncService_getNewAuthToken(
525 env, weak_java_profile_sync_service_.get(env).obj(),
526 j_sync_username.obj(), j_invalid_token.obj());
527 }
528
529 void ProfileSyncServiceAndroid::NudgeSyncer(JNIEnv* env,
530 jobject obj,
Yaron 2013/02/27 23:10:25 nit: indentation off
nyquist 2013/02/28 22:38:50 Done.
531 jstring objectId,
532 jlong version,
533 jstring state) {
534 if (BrowserThread::CurrentlyOn(BrowserThread::UI)) {
535 SendNudgeNotification(ConvertJavaStringToUTF8(env, objectId), version,
536 ConvertJavaStringToUTF8(env, state));
537 } else {
538 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
539 base::Bind(&ProfileSyncServiceAndroid::SendNudgeNotification,
540 base::Unretained(this), /* this will not go away. */
541 ConvertJavaStringToUTF8(env, objectId), version,
542 ConvertJavaStringToUTF8(env, state)));
543 }
544 }
545
546 static int Init(JNIEnv* env, jobject obj) {
547 ProfileSyncServiceAndroid* profile_sync_service_android =
548 new ProfileSyncServiceAndroid(env, obj);
549 return reinterpret_cast<jint>(profile_sync_service_android);
550 }
551
552 // static
553 bool ProfileSyncServiceAndroid::Register(JNIEnv* env) {
554 return RegisterNativesImpl(env);
555 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698