15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/sync_prefs.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "build/build_config.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "components/sync_driver/pref_names.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace sync_driver {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncPrefObserver::~SyncPrefObserver() {}
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)SyncPrefs::SyncPrefs(PrefService* pref_service) : pref_service_(pref_service) {
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(pref_service);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterPrefGroups();
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Watch the preference that indicates sync is managed so we can take
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // appropriate action.
2523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pref_sync_managed_.Init(
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      prefs::kSyncManaged,
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      pref_service_,
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      base::Bind(&SyncPrefs::OnSyncManagedPrefChanged, base::Unretained(this)));
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)SyncPrefs::SyncPrefs() : pref_service_(NULL) {}
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)SyncPrefs::~SyncPrefs() { DCHECK(CalledOnValidThread()); }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid SyncPrefs::RegisterProfilePrefs(
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    user_prefs::PrefRegistrySyncable* registry) {
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncHasSetupCompleted,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncSuppressStart,
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterInt64Pref(
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncLastSyncedTime,
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      0,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry->RegisterInt64Pref(
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      prefs::kSyncFirstSyncTime,
5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      0,
5346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All datatypes are on by default, but this gets set explicitly
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // when you configure sync (when turning it on), in
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // ProfileSyncService::OnUserChoseDatatypes.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncKeepEverythingSynced,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::ModelTypeSet user_types = syncer::UserTypes();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Include proxy types as well, as they can be individually selected,
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // although they don't have sync representations.
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_types.PutAll(syncer::ProxyTypes());
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
69e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // Treat bookmarks and device info specially.
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterDataTypePreferredPref(registry, syncer::BOOKMARKS, true);
71e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  RegisterDataTypePreferredPref(registry, syncer::DEVICE_INFO, true);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  user_types.Remove(syncer::BOOKMARKS);
73e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  user_types.Remove(syncer::DEVICE_INFO);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // These two prefs are set from sync experiment to enable enhanced bookmarks.
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  registry->RegisterIntegerPref(
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kEnhancedBookmarksExperimentEnabled,
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      0,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterStringPref(
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      prefs::kEnhancedBookmarksExtensionId,
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      std::string(),
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All types are set to off by default, which forces a configuration to
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // explicitly enable them. GetPreferredTypes() will ensure that any new
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // implicit types are enabled when their pref group is, or via
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // KeepEverythingSynced.
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (syncer::ModelTypeSet::Iterator it = user_types.First(); it.Good();
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       it.Inc()) {
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RegisterDataTypePreferredPref(registry, it.Get(), false);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncManaged,
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncEncryptionBootstrapToken,
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncKeystoreEncryptionBootstrapToken,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_CHROMEOS)
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncSpareBootstrapToken,
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  registry->RegisterBooleanPref(
115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      prefs::kSyncHasAuthError,
116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      false,
117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kSyncSessionsGUID,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // We will start prompting people about new data types after the launch of
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SESSIONS - all previously launched data types are treated as if they are
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // already acknowledged.
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  syncer::ModelTypeSet model_set;
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::BOOKMARKS);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::PREFERENCES);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::PASSWORDS);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::AUTOFILL_PROFILE);
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::AUTOFILL);
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::THEMES);
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::EXTENSIONS);
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::NIGORI);
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::SEARCH_ENGINES);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::APPS);
1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  model_set.Put(syncer::APP_LIST);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::TYPED_URLS);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  model_set.Put(syncer::SESSIONS);
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  model_set.Put(syncer::ARTICLES);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterListPref(prefs::kSyncAcknowledgedSyncTypes,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             syncer::ModelTypeSetToValue(model_set),
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                             user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  registry->RegisterIntegerPref(
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      prefs::kSyncRemainingRollbackTries, 0,
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::AddSyncPrefObserver(SyncPrefObserver* sync_pref_observer) {
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pref_observers_.AddObserver(sync_pref_observer);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::RemoveSyncPrefObserver(SyncPrefObserver* sync_pref_observer) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_pref_observers_.RemoveObserver(sync_pref_observer);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::ClearPreferences() {
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->ClearPref(prefs::kSyncLastSyncedTime);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->ClearPref(prefs::kSyncHasSetupCompleted);
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->ClearPref(prefs::kSyncEncryptionBootstrapToken);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->ClearPref(prefs::kSyncKeystoreEncryptionBootstrapToken);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(nick): The current behavior does not clear
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // e.g. prefs::kSyncBookmarks.  Is that really what we want?
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPrefs::HasSyncSetupCompleted() const {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetBoolean(prefs::kSyncHasSetupCompleted);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetSyncSetupCompleted() {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetBoolean(prefs::kSyncHasSetupCompleted, true);
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetStartSuppressed(false);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool SyncPrefs::SyncHasAuthError() const {
184f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(CalledOnValidThread());
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetBoolean(prefs::kSyncHasAuthError);
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void SyncPrefs::SetSyncAuthError(bool error) {
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  DCHECK(CalledOnValidThread());
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  pref_service_->SetBoolean(prefs::kSyncHasAuthError, error);
191f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
192f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPrefs::IsStartSuppressed() const {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetBoolean(prefs::kSyncSuppressStart);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetStartSuppressed(bool is_suppressed) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetBoolean(prefs::kSyncSuppressStart, is_suppressed);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::Time SyncPrefs::GetLastSyncedTime() const {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return base::Time::FromInternalValue(
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      pref_service_->GetInt64(prefs::kSyncLastSyncedTime));
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetLastSyncedTime(base::Time time) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetInt64(prefs::kSyncLastSyncedTime, time.ToInternalValue());
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPrefs::HasKeepEverythingSynced() const {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetKeepEverythingSynced(bool keep_everything_synced) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetBoolean(prefs::kSyncKeepEverythingSynced,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            keep_everything_synced);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet SyncPrefs::GetPreferredDataTypes(
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelTypeSet registered_types) const {
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pref_service_->GetBoolean(prefs::kSyncKeepEverythingSynced)) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return registered_types;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet preferred_types;
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (syncer::ModelTypeSet::Iterator it = registered_types.First(); it.Good();
23523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       it.Inc()) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (GetDataTypePreferred(it.Get())) {
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      preferred_types.Put(it.Get());
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ResolvePrefGroups(registered_types, preferred_types);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
24323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void SyncPrefs::SetPreferredDataTypes(syncer::ModelTypeSet registered_types,
24423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                      syncer::ModelTypeSet preferred_types) {
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(registered_types.HasAll(preferred_types));
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  preferred_types = ResolvePrefGroups(registered_types, preferred_types);
24823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  for (syncer::ModelTypeSet::Iterator i = registered_types.First(); i.Good();
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       i.Inc()) {
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetDataTypePreferred(i.Get(), preferred_types.Has(i.Get()));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPrefs::IsManaged() const {
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetBoolean(prefs::kSyncManaged);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncPrefs::GetEncryptionBootstrapToken() const {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
261f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetString(prefs::kSyncEncryptionBootstrapToken);
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetEncryptionBootstrapToken(const std::string& token) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetString(prefs::kSyncEncryptionBootstrapToken, token);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncPrefs::GetKeystoreEncryptionBootstrapToken() const {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
27123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return pref_service_->GetString(prefs::kSyncKeystoreEncryptionBootstrapToken);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetKeystoreEncryptionBootstrapToken(const std::string& token) {
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetString(prefs::kSyncKeystoreEncryptionBootstrapToken, token);
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string SyncPrefs::GetSyncSessionsGUID() const {
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetString(prefs::kSyncSessionsGUID);
2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncPrefs::SetSyncSessionsGUID(const std::string& guid) {
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(CalledOnValidThread());
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_service_->SetString(prefs::kSyncSessionsGUID, guid);
2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* SyncPrefs::GetPrefNameForDataType(syncer::ModelType data_type) {
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (data_type) {
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::BOOKMARKS:
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncBookmarks;
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::PASSWORDS:
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncPasswords;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::PREFERENCES:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncPreferences;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::AUTOFILL:
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncAutofill;
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::AUTOFILL_PROFILE:
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncAutofillProfile;
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::THEMES:
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncThemes;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::TYPED_URLS:
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncTypedUrls;
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSION_SETTINGS:
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncExtensionSettings;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::EXTENSIONS:
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncExtensions;
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case syncer::APP_LIST:
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return prefs::kSyncAppList;
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APP_SETTINGS:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncAppSettings;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APPS:
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncApps;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::SEARCH_ENGINES:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncSearchEngines;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::SESSIONS:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncSessions;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::APP_NOTIFICATIONS:
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncAppNotifications;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case syncer::HISTORY_DELETE_DIRECTIVES:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return prefs::kSyncHistoryDeleteDirectives;
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::SYNCED_NOTIFICATIONS:
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return prefs::kSyncSyncedNotifications;
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    case syncer::SYNCED_NOTIFICATION_APP_INFO:
3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return prefs::kSyncSyncedNotificationAppInfo;
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::DICTIONARY:
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return prefs::kSyncDictionary;
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::FAVICON_IMAGES:
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return prefs::kSyncFaviconImages;
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::FAVICON_TRACKING:
3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return prefs::kSyncFaviconTracking;
334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USER_SETTINGS:
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kSyncSupervisedUserSettings;
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case syncer::PROXY_TABS:
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return prefs::kSyncTabs;
338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    case syncer::PRIORITY_PREFERENCES:
339c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return prefs::kSyncPriorityPreferences;
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USERS:
341f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kSyncSupervisedUsers;
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    case syncer::ARTICLES:
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      return prefs::kSyncArticles;
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case syncer::SUPERVISED_USER_SHARED_SETTINGS:
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kSyncSupervisedUserSharedSettings;
3461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case syncer::DEVICE_INFO:
3471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      return prefs::kSyncDeviceInfo;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
351e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  NOTREACHED() << "Type is " << data_type;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string SyncPrefs::GetSpareBootstrapToken() const {
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
358f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  return pref_service_->GetString(prefs::kSyncSpareBootstrapToken);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetSpareBootstrapToken(const std::string& token) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetString(prefs::kSyncSpareBootstrapToken, token);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::AcknowledgeSyncedTypes(syncer::ModelTypeSet types) {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Add the types to the current set of acknowledged
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // types, and then store the resulting set in prefs.
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const syncer::ModelTypeSet acknowledged_types =
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Union(types,
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            syncer::ModelTypeSetFromValue(
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                *pref_service_->GetList(prefs::kSyncAcknowledgedSyncTypes)));
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<base::ListValue> value(
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      syncer::ModelTypeSetToValue(acknowledged_types));
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->Set(prefs::kSyncAcknowledgedSyncTypes, *value);
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int SyncPrefs::GetRemainingRollbackTries() const {
382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return pref_service_->GetInteger(prefs::kSyncRemainingRollbackTries);
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void SyncPrefs::SetRemainingRollbackTries(int times) {
386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  pref_service_->SetInteger(prefs::kSyncRemainingRollbackTries, times);
387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void SyncPrefs::OnSyncManagedPrefChanged() {
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
39123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  FOR_EACH_OBSERVER(SyncPrefObserver,
39223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                    sync_pref_observers_,
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                    OnSyncManagedPrefChange(*pref_sync_managed_));
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::SetManagedForTest(bool is_managed) {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetBoolean(prefs::kSyncManaged, is_managed);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet SyncPrefs::GetAcknowledgeSyncedTypesForTest() const {
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return syncer::ModelTypeSetFromValue(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *pref_service_->GetList(prefs::kSyncAcknowledgedSyncTypes));
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SyncPrefs::RegisterPrefGroups() {
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_groups_[syncer::APPS].Put(syncer::APP_NOTIFICATIONS);
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_groups_[syncer::APPS].Put(syncer::APP_SETTINGS);
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  pref_groups_[syncer::APPS].Put(syncer::APP_LIST);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_groups_[syncer::AUTOFILL].Put(syncer::AUTOFILL_PROFILE);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_groups_[syncer::EXTENSIONS].Put(syncer::EXTENSION_SETTINGS);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_groups_[syncer::PREFERENCES].Put(syncer::DICTIONARY);
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pref_groups_[syncer::PREFERENCES].Put(syncer::PRIORITY_PREFERENCES);
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_groups_[syncer::PREFERENCES].Put(syncer::SEARCH_ENGINES);
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_groups_[syncer::TYPED_URLS].Put(syncer::HISTORY_DELETE_DIRECTIVES);
42123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pref_groups_[syncer::TYPED_URLS].Put(syncer::SESSIONS);
42223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pref_groups_[syncer::TYPED_URLS].Put(syncer::FAVICON_IMAGES);
42323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  pref_groups_[syncer::TYPED_URLS].Put(syncer::FAVICON_TRACKING);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_groups_[syncer::PROXY_TABS].Put(syncer::SESSIONS);
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_groups_[syncer::PROXY_TABS].Put(syncer::FAVICON_IMAGES);
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  pref_groups_[syncer::PROXY_TABS].Put(syncer::FAVICON_TRACKING);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(zea): put favicons in the bookmarks group as well once it handles
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // those favicons.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
434c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void SyncPrefs::RegisterDataTypePreferredPref(
435c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry,
436c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    syncer::ModelType type,
437c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool is_preferred) {
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pref_name = GetPrefNameForDataType(type);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pref_name) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
443c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
444c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_name,
445c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      is_preferred,
446c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SyncPrefs::GetDataTypePreferred(syncer::ModelType type) const {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pref_name = GetPrefNameForDataType(type);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pref_name) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
456e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch
457e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // Device info is always enabled.
458e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  if (pref_name == prefs::kSyncDeviceInfo)
459e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    return true;
460e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type == syncer::PROXY_TABS &&
4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->GetUserPrefValue(pref_name) == NULL &&
4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service_->IsUserModifiablePreference(pref_name)) {
4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // If there is no tab sync preference yet (i.e. newly enabled type),
4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // default to the session sync preference value.
4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_name = GetPrefNameForDataType(syncer::SESSIONS);
4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return pref_service_->GetBoolean(pref_name);
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void SyncPrefs::SetDataTypePreferred(syncer::ModelType type,
47323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                     bool is_preferred) {
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(CalledOnValidThread());
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pref_name = GetPrefNameForDataType(type);
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!pref_name) {
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED();
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
480e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch
481e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  // Device info is always preferred.
482e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch  if (type == syncer::DEVICE_INFO)
483e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch    return;
484e4256316f8b5e8d1ec0df1f7762771622a53fa63Ben Murdoch
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_service_->SetBoolean(pref_name, is_preferred);
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)syncer::ModelTypeSet SyncPrefs::ResolvePrefGroups(
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelTypeSet registered_types,
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    syncer::ModelTypeSet types) const {
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(registered_types.HasAll(types));
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet types_with_groups = types;
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (PrefGroupsMap::const_iterator i = pref_groups_.begin();
49423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       i != pref_groups_.end();
49523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)       ++i) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (types.Has(i->first))
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      types_with_groups.PutAll(i->second);
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  types_with_groups.RetainAll(registered_types);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return types_with_groups;
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)base::Time SyncPrefs::GetFirstSyncTime() const {
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return base::Time::FromInternalValue(
50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      pref_service_->GetInt64(prefs::kSyncFirstSyncTime));
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SyncPrefs::SetFirstSyncTime(base::Time time) {
50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pref_service_->SetInt64(prefs::kSyncFirstSyncTime, time.ToInternalValue());
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void SyncPrefs::ClearFirstSyncTime() {
51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  pref_service_->ClearPref(prefs::kSyncFirstSyncTime);
51446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace sync_driver
517