blob: 615f61c2318559374bdbede1c9a5f89004889af7 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef COMPONENTS_SYNC_BASE_SYNC_PREFS_H_
#define COMPONENTS_SYNC_BASE_SYNC_PREFS_H_
#include <stdint.h>
#include <memory>
#include <string>
#include "base/compiler_specific.h"
#include "base/memory/raw_ptr.h"
#include "base/observer_list.h"
#include "base/sequence_checker.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "components/prefs/pref_member.h"
#include "components/sync/base/user_selectable_type.h"
class PrefRegistrySimple;
class PrefService;
namespace syncer {
class SyncPrefObserver {
public:
virtual void OnSyncManagedPrefChange(bool is_sync_managed) = 0;
virtual void OnFirstSetupCompletePrefChange(bool is_first_setup_complete) = 0;
virtual void OnSyncRequestedPrefChange(bool is_sync_requested) = 0;
virtual void OnPreferredDataTypesPrefChange() = 0;
protected:
virtual ~SyncPrefObserver();
};
// SyncPrefs is a helper class that manages getting, setting, and persisting
// global sync preferences. It is not thread-safe, and lives on the UI thread.
class SyncPrefs {
public:
// |pref_service| must not be null and must outlive this object.
explicit SyncPrefs(PrefService* pref_service);
SyncPrefs(const SyncPrefs&) = delete;
SyncPrefs& operator=(const SyncPrefs&) = delete;
~SyncPrefs();
static void RegisterProfilePrefs(PrefRegistrySimple* registry);
void AddSyncPrefObserver(SyncPrefObserver* sync_pref_observer);
void RemoveSyncPrefObserver(SyncPrefObserver* sync_pref_observer);
// Getters and setters for global sync prefs.
// First-Setup-Complete is conceptually similar to the user's consent to
// enable sync-the-feature.
bool IsFirstSetupComplete() const;
void SetFirstSetupComplete();
void ClearFirstSetupComplete();
bool IsSyncRequested() const;
void SetSyncRequested(bool is_requested);
void SetSyncRequestedIfNotSetExplicitly();
bool HasKeepEverythingSynced() const;
// Returns UserSelectableTypeSet::All() if HasKeepEverythingSynced() is true.
UserSelectableTypeSet GetSelectedTypes() const;
// Sets the selection state for all |registered_types| and "keep everything
// synced" flag.
// |keep_everything_synced| indicates that all current and future types
// should be synced. If this is set to true, then GetSelectedTypes() will
// always return UserSelectableTypeSet::All(), even if not all of them are
// registered or individually marked as selected.
// Changes are still made to the individual selectable type prefs even if
// |keep_everything_synced| is true, but won't be visible until it's set to
// false.
void SetSelectedTypes(bool keep_everything_synced,
UserSelectableTypeSet registered_types,
UserSelectableTypeSet selected_types);
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Chrome OS provides a separate settings UI surface for sync of OS types,
// including a separate "Sync All" toggle for OS types.
bool IsSyncAllOsTypesEnabled() const;
UserSelectableOsTypeSet GetSelectedOsTypes() const;
void SetSelectedOsTypes(bool sync_all_os_types,
UserSelectableOsTypeSet registered_types,
UserSelectableOsTypeSet selected_types);
// Maps |type| to its corresponding preference name. Returns nullptr if |type|
// isn't an OS type.
static const char* GetPrefNameForOsType(UserSelectableOsType type);
#endif
#if BUILDFLAG(IS_CHROMEOS_LACROS)
bool IsAppsSyncEnabledByOs() const;
void SetAppsSyncEnabledByOs(bool apps_sync_enabled);
#endif
// Whether Sync is disabled on the client for all profiles and accounts.
bool IsSyncClientDisabledByPolicy() const;
// Maps |type| to its corresponding preference name.
static const char* GetPrefNameForType(UserSelectableType type);
// Gets the local sync backend enabled state.
bool IsLocalSyncEnabled() const;
// The encryption bootstrap token is used for explicit passphrase users
// (usually custom passphrase) and represents a user-entered passphrase.
std::string GetEncryptionBootstrapToken() const;
void SetEncryptionBootstrapToken(const std::string& token);
void ClearEncryptionBootstrapToken();
// Muting mechanism for passphrase prompts, used on Android.
int GetPassphrasePromptMutedProductVersion() const;
void SetPassphrasePromptMutedProductVersion(int major_version);
void ClearPassphrasePromptMutedProductVersion();
private:
static void RegisterTypeSelectedPref(PrefRegistrySimple* prefs,
UserSelectableType type);
void OnSyncManagedPrefChanged();
void OnFirstSetupCompletePrefChange();
void OnSyncRequestedPrefChange();
// Never null.
const raw_ptr<PrefService> pref_service_;
base::ObserverList<SyncPrefObserver>::Unchecked sync_pref_observers_;
// The preference that controls whether sync is under control by
// configuration management.
BooleanPrefMember pref_sync_managed_;
BooleanPrefMember pref_first_setup_complete_;
BooleanPrefMember pref_sync_requested_;
bool local_sync_enabled_;
SEQUENCE_CHECKER(sequence_checker_);
};
#if BUILDFLAG(IS_ANDROID)
void ClearObsoleteSyncDecoupledFromAndroidMasterSync(PrefService* pref_service);
#endif // BUILDFLAG(IS_ANDROID)
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
void MigrateSyncRequestedPrefPostMice(PrefService* pref_service);
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
} // namespace syncer
#endif // COMPONENTS_SYNC_BASE_SYNC_PREFS_H_