Index: chrome/browser/sync/profile_sync_service.cc |
diff --git a/chrome/browser/sync/profile_sync_service.cc b/chrome/browser/sync/profile_sync_service.cc |
index 061ded400da2a3dee79d8849d884c3ee81d938ed..3344b5fb1e75b39c8ea5ae8c6faac263bc952b39 100644 |
--- a/chrome/browser/sync/profile_sync_service.cc |
+++ b/chrome/browser/sync/profile_sync_service.cc |
@@ -314,6 +314,24 @@ void ProfileSyncService::RegisterPreferences() { |
pref_service->RegisterBooleanPref(prefs::kSyncAutofillProfile, |
enable_by_default, |
PrefService::UNSYNCABLE_PREF); |
+ |
+ // We started prompting people about new data types starting with the |
+ // rollout of TYPED_URLs - all previously launched data types are treated |
+ // as if they are already acknowledged. |
+ syncable::ModelTypeBitSet model_set; |
+ model_set.set(syncable::BOOKMARKS); |
+ model_set.set(syncable::PREFERENCES); |
+ model_set.set(syncable::PASSWORDS); |
+ model_set.set(syncable::AUTOFILL_PROFILE); |
+ model_set.set(syncable::AUTOFILL); |
+ model_set.set(syncable::THEMES); |
+ model_set.set(syncable::EXTENSIONS); |
+ model_set.set(syncable::NIGORI); |
+ model_set.set(syncable::SEARCH_ENGINES); |
+ model_set.set(syncable::APPS); |
+ pref_service->RegisterStringPref(prefs::kAcknowledgedSyncTypes, |
+ syncable::ModelTypeBitSetToString(model_set), |
+ PrefService::UNSYNCABLE_PREF); |
} |
void ProfileSyncService::ClearPreferences() { |
@@ -912,6 +930,7 @@ void ProfileSyncService::OnUserChoseDatatypes(bool sync_everything, |
sync_everything); |
ChangePreferredDataTypes(chosen_types); |
+ AcknowledgeSyncedTypes(); |
profile_->GetPrefs()->ScheduleSavePersistentPrefs(); |
} |
@@ -1376,3 +1395,59 @@ bool ProfileSyncService::ShouldPushChanges() { |
return data_type_manager_->state() == DataTypeManager::CONFIGURED; |
} |
+ |
+void ProfileSyncService::AcknowledgeSyncedTypes() { |
+ syncable::ModelTypeBitSet acknowledged; |
+ CHECK(syncable::ModelTypeBitSetFromString( |
+ profile_->GetPrefs()->GetString(prefs::kAcknowledgedSyncTypes), |
+ &acknowledged)); |
+ syncable::ModelTypeSet registered; |
+ GetRegisteredDataTypes(®istered); |
+ syncable::ModelTypeBitSet registered_bit_set = |
+ syncable::ModelTypeBitSetFromSet(registered); |
+ |
+ // Add the registered types to the current set of acknowledged types, and then |
+ // store the resulting set in prefs. |
+ acknowledged |= registered_bit_set; |
+ profile_->GetPrefs()->SetString( |
+ prefs::kAcknowledgedSyncTypes, |
+ syncable::ModelTypeBitSetToString(acknowledged)); |
+ profile_->GetPrefs()->ScheduleSavePersistentPrefs(); |
+} |
+ |
+string16 ProfileSyncService::GetSyncNotification() const { |
+ string16 promo; |
+ if (HasSyncSetupCompleted() && |
+ profile_->GetPrefs()->GetBoolean(prefs::kKeepEverythingSynced)) { |
+ // User is "syncing everything" - see if we've added any new data types. |
+ syncable::ModelTypeBitSet acknowledged; |
+ CHECK(syncable::ModelTypeBitSetFromString( |
+ profile_->GetPrefs()->GetString(prefs::kAcknowledgedSyncTypes), |
+ &acknowledged)); |
+ syncable::ModelTypeSet registered; |
+ GetRegisteredDataTypes(®istered); |
+ syncable::ModelTypeBitSet registered_bit_set = |
+ syncable::ModelTypeBitSetFromSet(registered); |
+ |
+ syncable::ModelTypeBitSet unacknowledged = |
+ registered_bit_set & ~acknowledged; |
+ // TODO(sync): As we add new data types, we'll probably need some more |
+ // generic string to display to the user, since the method below won't |
+ // scale indefinitely (we'd need N*(N+1)/2 different strings to represent |
+ // all the combinations of unacknowledged types). But for now, we just |
+ // have sessions and typed urls so this is OK. |
+ if (unacknowledged.test(syncable::SESSIONS) && |
+ unacknowledged.test(syncable::TYPED_URLS)) { |
+ return l10n_util::GetStringUTF16(IDS_SYNC_ADDED_SESSIONS_AND_TYPED_URLS); |
+ } else if (unacknowledged.test(syncable::SESSIONS)) { |
+ return l10n_util::GetStringUTF16(IDS_SYNC_ADDED_SESSIONS); |
+ } else if (unacknowledged.test(syncable::TYPED_URLS)) { |
+ return l10n_util::GetStringUTF16(IDS_SYNC_ADDED_TYPED_URLS); |
+ } else { |
+ // Shouldn't be possible for any other types to be unacknowledged. |
+ DCHECK(!unacknowledged.any()); |
+ } |
+ } |
+ return promo; |
+} |
+ |