#ifndef COMPONENTS_SYNC_PREFERENCES_PREF_SERVICE_SYNCABLE_H_
#define COMPONENTS_SYNC_PREFERENCES_PREF_SERVICE_SYNCABLE_H_
#include <stdint.h>
#include <memory>
#include <string>
#include <string_view>
#include <vector>
#include "base/functional/callback_forward.h"
#include "base/functional/callback_helpers.h"
#include "base/observer_list.h"
#include "components/pref_registry/pref_registry_syncable.h"
#include "components/prefs/pref_service.h"
#include "components/sync_preferences/pref_model_associator.h"
class PrefValueStore;
namespace syncer {
class SyncableService;
class SyncService;
}
namespace sync_preferences {
class DualLayerUserPrefStore;
class PrefModelAssociatorClient;
class PrefServiceSyncableObserver;
class SyncedPrefObserver;
class PrefServiceSyncable : public PrefService,
public PrefServiceForAssociator {
public:
PrefServiceSyncable(
std::unique_ptr<PrefNotifierImpl> pref_notifier,
std::unique_ptr<PrefValueStore> pref_value_store,
scoped_refptr<PersistentPrefStore> user_prefs,
scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry,
scoped_refptr<PrefModelAssociatorClient> pref_model_associator_client,
base::RepeatingCallback<void(PersistentPrefStore::PrefReadError)>
read_error_callback,
bool async);
PrefServiceSyncable(
std::unique_ptr<PrefNotifierImpl> pref_notifier,
std::unique_ptr<PrefValueStore> pref_value_store,
scoped_refptr<DualLayerUserPrefStore> dual_layer_user_prefs,
scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry,
scoped_refptr<PrefModelAssociatorClient> pref_model_associator_client,
base::RepeatingCallback<void(PersistentPrefStore::PrefReadError)>
read_error_callback,
bool async);
PrefServiceSyncable(const PrefServiceSyncable&) = delete;
PrefServiceSyncable& operator=(const PrefServiceSyncable&) = delete;
~PrefServiceSyncable() override;
std::unique_ptr<PrefServiceSyncable> CreateIncognitoPrefService(
PrefStore* incognito_extension_pref_store,
const std::vector<const char*>& persistent_pref_names);
bool IsSyncing();
bool IsPrioritySyncing();
#if BUILDFLAG(IS_CHROMEOS)
bool AreOsPrefsSyncing();
bool AreOsPriorityPrefsSyncing();
#endif
void AddObserver(PrefServiceSyncableObserver* observer);
void RemoveObserver(PrefServiceSyncableObserver* observer);
syncer::SyncableService* GetSyncableService(const syncer::DataType& type);
#if BUILDFLAG(ARKWEB_PREFS)
user_prefs::PrefRegistrySyncable* GetPrefRegistrySyncable();
#endif
void UpdateCommandLinePrefStore(PrefStore* cmd_line_store) override;
void AddSyncedPrefObserver(const std::string& name,
SyncedPrefObserver* observer);
void RemoveSyncedPrefObserver(const std::string& name,
SyncedPrefObserver* observer);
void OnSyncServiceInitialized(syncer::SyncService* sync_service);
private:
class DemographicsPrefsClearer;
void ConnectAssociatorsAndRegisterPreferences();
void AddRegisteredSyncablePreference(std::string_view path, uint32_t flags);
base::Value::Type GetRegisteredPrefType(
std::string_view pref_name) const override;
void OnIsSyncingChanged() override;
uint32_t GetWriteFlags(std::string_view pref_name) const override;
bool pref_service_forked_ = false;
PrefModelAssociator pref_sync_associator_;
PrefModelAssociator priority_pref_sync_associator_;
#if BUILDFLAG(IS_CHROMEOS)
PrefModelAssociator os_pref_sync_associator_;
PrefModelAssociator os_priority_pref_sync_associator_;
#endif
const scoped_refptr<user_prefs::PrefRegistrySyncable> pref_registry_;
base::ObserverList<PrefServiceSyncableObserver>::Unchecked observer_list_;
scoped_refptr<DualLayerUserPrefStore> dual_layer_user_prefs_;
std::unique_ptr<DemographicsPrefsClearer> demographics_prefs_clearer_;
};
}
#endif