xref: /aosp_15_r20/external/cronet/components/prefs/pref_change_registrar.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2010 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #ifndef COMPONENTS_PREFS_PREF_CHANGE_REGISTRAR_H_
6*6777b538SAndroid Build Coastguard Worker #define COMPONENTS_PREFS_PREF_CHANGE_REGISTRAR_H_
7*6777b538SAndroid Build Coastguard Worker 
8*6777b538SAndroid Build Coastguard Worker #include <map>
9*6777b538SAndroid Build Coastguard Worker #include <string>
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback.h"
12*6777b538SAndroid Build Coastguard Worker #include "base/memory/raw_ptr.h"
13*6777b538SAndroid Build Coastguard Worker #include "components/prefs/pref_observer.h"
14*6777b538SAndroid Build Coastguard Worker #include "components/prefs/prefs_export.h"
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker class PrefService;
17*6777b538SAndroid Build Coastguard Worker 
18*6777b538SAndroid Build Coastguard Worker // Automatically manages the registration of one or more pref change observers
19*6777b538SAndroid Build Coastguard Worker // with a PrefStore. Functions much like NotificationRegistrar, but specifically
20*6777b538SAndroid Build Coastguard Worker // manages observers of preference changes. When the Registrar is destroyed,
21*6777b538SAndroid Build Coastguard Worker // all registered observers are automatically unregistered with the PrefStore.
22*6777b538SAndroid Build Coastguard Worker class COMPONENTS_PREFS_EXPORT PrefChangeRegistrar final : public PrefObserver {
23*6777b538SAndroid Build Coastguard Worker  public:
24*6777b538SAndroid Build Coastguard Worker   // You can register this type of callback if you need to know the
25*6777b538SAndroid Build Coastguard Worker   // path of the preference that is changing.
26*6777b538SAndroid Build Coastguard Worker   using NamedChangeCallback = base::RepeatingCallback<void(const std::string&)>;
27*6777b538SAndroid Build Coastguard Worker 
28*6777b538SAndroid Build Coastguard Worker   PrefChangeRegistrar();
29*6777b538SAndroid Build Coastguard Worker 
30*6777b538SAndroid Build Coastguard Worker   PrefChangeRegistrar(const PrefChangeRegistrar&) = delete;
31*6777b538SAndroid Build Coastguard Worker   PrefChangeRegistrar& operator=(const PrefChangeRegistrar&) = delete;
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   ~PrefChangeRegistrar();
34*6777b538SAndroid Build Coastguard Worker 
35*6777b538SAndroid Build Coastguard Worker   // Must be called before adding or removing observers. Can be called more
36*6777b538SAndroid Build Coastguard Worker   // than once as long as the value of |service| doesn't change.
37*6777b538SAndroid Build Coastguard Worker   void Init(PrefService* service);
38*6777b538SAndroid Build Coastguard Worker 
39*6777b538SAndroid Build Coastguard Worker   // Removes all observers and clears the reference to `PrefService`.
40*6777b538SAndroid Build Coastguard Worker   // `Init` must be called before adding or removing any observers.
41*6777b538SAndroid Build Coastguard Worker   void Reset();
42*6777b538SAndroid Build Coastguard Worker 
43*6777b538SAndroid Build Coastguard Worker   // Adds a pref observer for the specified pref |path| and |obs| observer
44*6777b538SAndroid Build Coastguard Worker   // object. All registered observers will be automatically unregistered
45*6777b538SAndroid Build Coastguard Worker   // when the registrar's destructor is called.
46*6777b538SAndroid Build Coastguard Worker   //
47*6777b538SAndroid Build Coastguard Worker   // The second version binds a callback that will receive the path of
48*6777b538SAndroid Build Coastguard Worker   // the preference that is changing as its parameter.
49*6777b538SAndroid Build Coastguard Worker   //
50*6777b538SAndroid Build Coastguard Worker   // Only one observer may be registered per path.
51*6777b538SAndroid Build Coastguard Worker   void Add(const std::string& path, const base::RepeatingClosure& obs);
52*6777b538SAndroid Build Coastguard Worker   void Add(const std::string& path, const NamedChangeCallback& obs);
53*6777b538SAndroid Build Coastguard Worker 
54*6777b538SAndroid Build Coastguard Worker   // Removes the pref observer registered for |path|.
55*6777b538SAndroid Build Coastguard Worker   void Remove(const std::string& path);
56*6777b538SAndroid Build Coastguard Worker 
57*6777b538SAndroid Build Coastguard Worker   // Removes all observers that have been previously added with a call to Add.
58*6777b538SAndroid Build Coastguard Worker   void RemoveAll();
59*6777b538SAndroid Build Coastguard Worker 
60*6777b538SAndroid Build Coastguard Worker   // Returns true if no pref observers are registered.
61*6777b538SAndroid Build Coastguard Worker   bool IsEmpty() const;
62*6777b538SAndroid Build Coastguard Worker 
63*6777b538SAndroid Build Coastguard Worker   // Check whether |pref| is in the set of preferences being observed.
64*6777b538SAndroid Build Coastguard Worker   bool IsObserved(const std::string& pref);
65*6777b538SAndroid Build Coastguard Worker 
66*6777b538SAndroid Build Coastguard Worker   // Return the PrefService for this registrar.
67*6777b538SAndroid Build Coastguard Worker   PrefService* prefs();
68*6777b538SAndroid Build Coastguard Worker   const PrefService* prefs() const;
69*6777b538SAndroid Build Coastguard Worker 
70*6777b538SAndroid Build Coastguard Worker  private:
71*6777b538SAndroid Build Coastguard Worker   // PrefObserver:
72*6777b538SAndroid Build Coastguard Worker   void OnPreferenceChanged(PrefService* service,
73*6777b538SAndroid Build Coastguard Worker                            const std::string& pref_name) override;
74*6777b538SAndroid Build Coastguard Worker 
75*6777b538SAndroid Build Coastguard Worker   static void InvokeUnnamedCallback(const base::RepeatingClosure& callback,
76*6777b538SAndroid Build Coastguard Worker                                     const std::string& pref_name);
77*6777b538SAndroid Build Coastguard Worker 
78*6777b538SAndroid Build Coastguard Worker   using ObserverMap = std::map<std::string, NamedChangeCallback>;
79*6777b538SAndroid Build Coastguard Worker 
80*6777b538SAndroid Build Coastguard Worker   ObserverMap observers_;
81*6777b538SAndroid Build Coastguard Worker   raw_ptr<PrefService, AcrossTasksDanglingUntriaged> service_;
82*6777b538SAndroid Build Coastguard Worker };
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker #endif  // COMPONENTS_PREFS_PREF_CHANGE_REGISTRAR_H_
85