1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/nearby_sharing/nearby_share_settings.h"
6 
7 #include "base/values.h"
8 #include "chrome/browser/nearby_sharing/common/nearby_share_enums.h"
9 #include "chrome/browser/nearby_sharing/common/nearby_share_prefs.h"
10 #include "components/prefs/pref_service.h"
11 #include "components/prefs/scoped_user_pref_update.h"
12 
NearbyShareSettings(PrefService * pref_service,NearbyShareLocalDeviceDataManager * local_device_data_manager)13 NearbyShareSettings::NearbyShareSettings(
14     PrefService* pref_service,
15     NearbyShareLocalDeviceDataManager* local_device_data_manager)
16     : pref_service_(pref_service),
17       local_device_data_manager_(local_device_data_manager) {
18   pref_change_registrar_.Init(pref_service_);
19   pref_change_registrar_.Add(
20       prefs::kNearbySharingEnabledPrefName,
21       base::BindRepeating(&NearbyShareSettings::OnEnabledPrefChanged,
22                           base::Unretained(this)));
23   pref_change_registrar_.Add(
24       prefs::kNearbySharingBackgroundVisibilityName,
25       base::BindRepeating(&NearbyShareSettings::OnVisibilityPrefChanged,
26                           base::Unretained(this)));
27   pref_change_registrar_.Add(
28       prefs::kNearbySharingDataUsageName,
29       base::BindRepeating(&NearbyShareSettings::OnDataUsagePrefChanged,
30                           base::Unretained(this)));
31   pref_change_registrar_.Add(
32       prefs::kNearbySharingAllowedContactsPrefName,
33       base::BindRepeating(&NearbyShareSettings::OnAllowedContactsPrefChanged,
34                           base::Unretained(this)));
35 
36   local_device_data_manager_->AddObserver(this);
37 }
38 
~NearbyShareSettings()39 NearbyShareSettings::~NearbyShareSettings() {
40   local_device_data_manager_->RemoveObserver(this);
41 }
42 
GetEnabled() const43 bool NearbyShareSettings::GetEnabled() const {
44   return pref_service_->GetBoolean(prefs::kNearbySharingEnabledPrefName);
45 }
46 
GetDeviceName() const47 std::string NearbyShareSettings::GetDeviceName() const {
48   return local_device_data_manager_->GetDeviceName();
49 }
50 
GetDataUsage() const51 DataUsage NearbyShareSettings::GetDataUsage() const {
52   return static_cast<DataUsage>(
53       pref_service_->GetInteger(prefs::kNearbySharingDataUsageName));
54 }
55 
GetVisibility() const56 Visibility NearbyShareSettings::GetVisibility() const {
57   return static_cast<Visibility>(
58       pref_service_->GetInteger(prefs::kNearbySharingBackgroundVisibilityName));
59 }
60 
GetAllowedContacts() const61 const std::vector<std::string> NearbyShareSettings::GetAllowedContacts() const {
62   std::vector<std::string> allowed_contacts;
63   const base::ListValue* list =
64       pref_service_->GetList(prefs::kNearbySharingAllowedContactsPrefName);
65   if (list) {
66     base::Value::ConstListView view = list->GetList();
67     for (const auto& value : view) {
68       allowed_contacts.push_back(value.GetString());
69     }
70   }
71   return allowed_contacts;
72 }
73 
AddSettingsObserver(::mojo::PendingRemote<nearby_share::mojom::NearbyShareSettingsObserver> observer)74 void NearbyShareSettings::AddSettingsObserver(
75     ::mojo::PendingRemote<nearby_share::mojom::NearbyShareSettingsObserver>
76         observer) {
77   observers_set_.Add(std::move(observer));
78 }
79 
GetEnabled(base::OnceCallback<void (bool)> callback)80 void NearbyShareSettings::GetEnabled(base::OnceCallback<void(bool)> callback) {
81   std::move(callback).Run(GetEnabled());
82 }
83 
SetEnabled(bool enabled)84 void NearbyShareSettings::SetEnabled(bool enabled) {
85   pref_service_->SetBoolean(prefs::kNearbySharingEnabledPrefName, enabled);
86   if (enabled) {
87     // We rely on the the UI to enforce that if the feature was enabled for the
88     // first time, that onboarding was run.
89     pref_service_->SetBoolean(prefs::kNearbySharingOnboardingCompletePrefName,
90                               true);
91   }
92 }
93 
GetDeviceName(base::OnceCallback<void (const std::string &)> callback)94 void NearbyShareSettings::GetDeviceName(
95     base::OnceCallback<void(const std::string&)> callback) {
96   std::move(callback).Run(GetDeviceName());
97 }
98 
ValidateDeviceName(const std::string & device_name,base::OnceCallback<void (nearby_share::mojom::DeviceNameValidationResult)> callback)99 void NearbyShareSettings::ValidateDeviceName(
100     const std::string& device_name,
101     base::OnceCallback<void(nearby_share::mojom::DeviceNameValidationResult)>
102         callback) {
103   std::move(callback).Run(
104       local_device_data_manager_->ValidateDeviceName(device_name));
105 }
106 
SetDeviceName(const std::string & device_name,base::OnceCallback<void (nearby_share::mojom::DeviceNameValidationResult)> callback)107 void NearbyShareSettings::SetDeviceName(
108     const std::string& device_name,
109     base::OnceCallback<void(nearby_share::mojom::DeviceNameValidationResult)>
110         callback) {
111   return std::move(callback).Run(
112       local_device_data_manager_->SetDeviceName(device_name));
113 }
114 
GetDataUsage(base::OnceCallback<void (nearby_share::mojom::DataUsage)> callback)115 void NearbyShareSettings::GetDataUsage(
116     base::OnceCallback<void(nearby_share::mojom::DataUsage)> callback) {
117   std::move(callback).Run(GetDataUsage());
118 }
119 
SetDataUsage(nearby_share::mojom::DataUsage data_usage)120 void NearbyShareSettings::SetDataUsage(
121     nearby_share::mojom::DataUsage data_usage) {
122   pref_service_->SetInteger(prefs::kNearbySharingDataUsageName,
123                             static_cast<int>(data_usage));
124 }
125 
GetVisibility(base::OnceCallback<void (nearby_share::mojom::Visibility)> callback)126 void NearbyShareSettings::GetVisibility(
127     base::OnceCallback<void(nearby_share::mojom::Visibility)> callback) {
128   std::move(callback).Run(GetVisibility());
129 }
130 
SetVisibility(nearby_share::mojom::Visibility visibility)131 void NearbyShareSettings::SetVisibility(
132     nearby_share::mojom::Visibility visibility) {
133   pref_service_->SetInteger(prefs::kNearbySharingBackgroundVisibilityName,
134                             static_cast<int>(visibility));
135 }
136 
GetAllowedContacts(base::OnceCallback<void (const std::vector<std::string> &)> callback)137 void NearbyShareSettings::GetAllowedContacts(
138     base::OnceCallback<void(const std::vector<std::string>&)> callback) {
139   std::move(callback).Run(GetAllowedContacts());
140 }
141 
SetAllowedContacts(const std::vector<std::string> & allowed_contacts)142 void NearbyShareSettings::SetAllowedContacts(
143     const std::vector<std::string>& allowed_contacts) {
144   base::ListValue list;
145   for (const auto& id : allowed_contacts) {
146     list.AppendString(id);
147   }
148   pref_service_->Set(prefs::kNearbySharingAllowedContactsPrefName, list);
149 }
150 
Bind(mojo::PendingReceiver<nearby_share::mojom::NearbyShareSettings> receiver)151 void NearbyShareSettings::Bind(
152     mojo::PendingReceiver<nearby_share::mojom::NearbyShareSettings> receiver) {
153   receiver_set_.Add(this, std::move(receiver));
154 }
155 
OnLocalDeviceDataChanged(bool did_device_name_change,bool did_full_name_change,bool did_icon_url_change)156 void NearbyShareSettings::OnLocalDeviceDataChanged(bool did_device_name_change,
157                                                    bool did_full_name_change,
158                                                    bool did_icon_url_change) {
159   if (!did_device_name_change)
160     return;
161 
162   std::string device_name = GetDeviceName();
163   for (auto& remote : observers_set_) {
164     remote->OnDeviceNameChanged(device_name);
165   }
166 }
167 
OnEnabledPrefChanged()168 void NearbyShareSettings::OnEnabledPrefChanged() {
169   bool enabled = GetEnabled();
170   for (auto& remote : observers_set_) {
171     remote->OnEnabledChanged(enabled);
172   }
173 }
174 
OnDataUsagePrefChanged()175 void NearbyShareSettings::OnDataUsagePrefChanged() {
176   DataUsage data_usage = GetDataUsage();
177   for (auto& remote : observers_set_) {
178     remote->OnDataUsageChanged(data_usage);
179   }
180 }
181 
OnVisibilityPrefChanged()182 void NearbyShareSettings::OnVisibilityPrefChanged() {
183   Visibility visibility = GetVisibility();
184   for (auto& remote : observers_set_) {
185     remote->OnVisibilityChanged(visibility);
186   }
187 }
188 
OnAllowedContactsPrefChanged()189 void NearbyShareSettings::OnAllowedContactsPrefChanged() {
190   std::vector<std::string> visible_contacts = GetAllowedContacts();
191   for (auto& remote : observers_set_) {
192     remote->OnAllowedContactsChanged(visible_contacts);
193   }
194 }
195