blob: 8fa9d121878ce47dc7b3d1f02c6115dcddf5bbf3 [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;
class PrefValueMap;
namespace syncer {
class SyncPrefObserver {
public:
virtual void OnSyncManagedPrefChange(bool is_sync_managed) = 0;
virtual void OnFirstSetupCompletePrefChange(bool is_first_setup_complete) = 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();
// Whether the user wants Sync to run. This is false by default, but gets set
// to true early in the Sync setup flow, after the user has pressed "turn on
// Sync" but before they have actually confirmed the settings (that's
// IsFirstSetupComplete()). After Sync is enabled, this can get set to false
// via signout (which also clears IsFirstSetupComplete) or, on ChromeOS Ash,
// when Sync gets reset from the dashboard.
bool IsSyncRequested() const;
void SetSyncRequested(bool is_requested);
bool IsSyncRequestedSetExplicitly() const;
// Whether the "Sync everything" toggle is enabled. Note that even if this is
// true, some types may be disabled e.g. due to enterprise policy.
bool HasKeepEverythingSynced() const;
// Returns UserSelectableTypeSet::All() if HasKeepEverythingSynced() is true
// (except if some types are force-disabled by policy).
UserSelectableTypeSet GetSelectedTypes() const;
// Returns whether `type` is "managed" i.e. controlled by enterprise policy.
bool IsTypeManagedByPolicy(UserSelectableType type) 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_IOS)
// Sets the transport bookmarks & reading list pref on opt in/out.
void SetBookmarksAndReadingListAccountStorageOptIn(bool value);
// Gets the transport bookmarks & reading list pref.
bool IsOptedInForBookmarksAndReadingListAccountStorage();
#endif // BUILDFLAG(IS_IOS)
#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;
bool IsOsTypeManagedByPolicy(UserSelectableOsType type) const;
void SetSelectedOsTypes(bool sync_all_os_types,
UserSelectableOsTypeSet registered_types,
UserSelectableOsTypeSet selected_types);
// Maps |type| to its corresponding preference name.
static const char* GetPrefNameForOsTypeForTesting(UserSelectableOsType type);
// Sets |type| as disabled in the given |policy_prefs|, which should
// correspond to the "managed" (aka policy-controlled) pref store.
static void SetOsTypeDisabledByPolicy(PrefValueMap* policy_prefs,
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* GetPrefNameForTypeForTesting(UserSelectableType type);
// Sets |type| as disabled in the given |policy_prefs|, which should
// correspond to the "managed" (aka policy-controlled) pref store.
static void SetTypeDisabledByPolicy(PrefValueMap* policy_prefs,
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();
#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
static void MigrateSyncRequestedPrefPostMice(PrefService* pref_service);
#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
private:
static void RegisterTypeSelectedPref(PrefRegistrySimple* prefs,
UserSelectableType type);
static const char* GetPrefNameForType(UserSelectableType type);
#if BUILDFLAG(IS_CHROMEOS_ASH)
static const char* GetPrefNameForOsType(UserSelectableOsType type);
#endif
void OnSyncManagedPrefChanged();
void OnFirstSetupCompletePrefChange();
// 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_;
bool local_sync_enabled_;
SEQUENCE_CHECKER(sequence_checker_);
};
} // namespace syncer
#endif // COMPONENTS_SYNC_BASE_SYNC_PREFS_H_