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