Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Side by Side Diff: chrome/browser/chromeos/arc/arc_settings_bridge_impl.cc

Issue 1596663002: arc-bridge: Introduce the ArcService class (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: Rebased + protected ArcService direct instantiation Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2015 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/chromeos/arc/arc_settings_bridge_impl.h"
6
7 #include <algorithm>
8
9 #include "base/json/json_writer.h"
10 #include "base/prefs/pref_service.h"
11 #include "base/strings/stringprintf.h"
12 #include "chrome/browser/profiles/profile_manager.h"
13 #include "chrome/common/pref_names.h"
14 #include "components/arc/common/settings.mojom.h"
15
16 using ::chromeos::system::TimezoneSettings;
17
18 namespace arc {
19
20 namespace fontsizes {
21
22 double ConvertFontSizeChromeToAndroid(int default_size,
23 int default_fixed_size,
24 int minimum_size) {
25 // kWebKitDefaultFixedFontSize is automatically set to be 3 pixels smaller
26 // than kWebKitDefaultFontSize when Chrome's settings page's main font
27 // dropdown control is adjusted. If the user specifically sets a higher
28 // fixed font size we will want to take into account the adjustment.
29 default_fixed_size += 3;
30 int max_chrome_size =
31 std::max(std::max(default_fixed_size, default_size), minimum_size);
32
33 double android_scale = kAndroidFontScaleSmall;
34 if (max_chrome_size >= kChromeFontSizeVeryLarge) {
35 android_scale = kAndroidFontScaleHuge;
36 } else if (max_chrome_size >= kChromeFontSizeLarge) {
37 android_scale = kAndroidFontScaleLarge;
38 } else if (max_chrome_size >= kChromeFontSizeNormal) {
39 android_scale = kAndroidFontScaleNormal;
40 }
41
42 return android_scale;
43 }
44
45 } // namespace fontsizes
46
47 ArcSettingsBridgeImpl::~ArcSettingsBridgeImpl() {
48 ArcBridgeService* bridge_service = ArcBridgeService::Get();
49 DCHECK(bridge_service);
50 bridge_service->RemoveObserver(this);
51 }
52
53 void ArcSettingsBridgeImpl::StartObservingBridgeServiceChanges() {
54 ArcBridgeService* bridge_service = ArcBridgeService::Get();
55 DCHECK(bridge_service);
56 bridge_service->AddObserver(this);
57 }
58
59 void ArcSettingsBridgeImpl::StartObservingSettingsChanges() {
60 Profile* profile = ProfileManager::GetActiveUserProfile();
61 registrar_.Init(profile->GetPrefs());
62
63 AddPrefToObserve(prefs::kWebKitDefaultFixedFontSize);
64 AddPrefToObserve(prefs::kWebKitDefaultFontSize);
65 AddPrefToObserve(prefs::kWebKitMinimumFontSize);
66 AddPrefToObserve(prefs::kAccessibilitySpokenFeedbackEnabled);
67
68 TimezoneSettings::GetInstance()->AddObserver(this);
69 }
70
71 void ArcSettingsBridgeImpl::SyncAllPrefs() const {
72 SyncFontSize();
73 SyncLocale();
74 SyncSpokenFeedbackEnabled();
75 SyncTimeZone();
76 }
77
78 void ArcSettingsBridgeImpl::StopObservingSettingsChanges() {
79 registrar_.RemoveAll();
80
81 TimezoneSettings::GetInstance()->RemoveObserver(this);
82 }
83
84 void ArcSettingsBridgeImpl::AddPrefToObserve(const std::string& pref_name) {
85 registrar_.Add(pref_name, base::Bind(&ArcSettingsBridgeImpl::OnPrefChanged,
86 base::Unretained(this)));
87 }
88
89 void ArcSettingsBridgeImpl::OnPrefChanged(const std::string& pref_name) const {
90 if (pref_name == prefs::kAccessibilitySpokenFeedbackEnabled) {
91 SyncSpokenFeedbackEnabled();
92 } else if (pref_name == prefs::kWebKitDefaultFixedFontSize ||
93 pref_name == prefs::kWebKitDefaultFontSize ||
94 pref_name == prefs::kWebKitMinimumFontSize) {
95 SyncFontSize();
96 } else {
97 LOG(ERROR) << "Unknown pref changed.";
98 }
99 }
100
101 void ArcSettingsBridgeImpl::OnStateChanged(ArcBridgeService::State state) {
102 // ArcBridgeService::State::READY is emitted before ArcSettings app is ready
103 // to send broadcasts. Instead we wait for the SettingsInstance to be ready.
104 if (state == ArcBridgeService::State::STOPPING) {
105 StopObservingSettingsChanges();
106 }
107 }
108
109 void ArcSettingsBridgeImpl::OnSettingsInstanceReady() {
110 StartObservingSettingsChanges();
111 SyncAllPrefs();
112 }
113
114 void ArcSettingsBridgeImpl::TimezoneChanged(const icu::TimeZone& timezone) {
115 SyncTimeZone();
116 }
117
118 int ArcSettingsBridgeImpl::GetIntegerPref(const std::string& pref_name) const {
119 const PrefService::Preference* pref =
120 registrar_.prefs()->FindPreference(pref_name);
121 DCHECK(pref);
122 int val = -1;
123 bool value_exists = pref->GetValue()->GetAsInteger(&val);
124 DCHECK(value_exists);
125 return val;
126 }
127
128 void ArcSettingsBridgeImpl::SyncFontSize() const {
129 int default_size = GetIntegerPref(prefs::kWebKitDefaultFontSize);
130 int default_fixed_size = GetIntegerPref(prefs::kWebKitDefaultFixedFontSize);
131 int minimum_size = GetIntegerPref(prefs::kWebKitMinimumFontSize);
132
133 double android_scale = fontsizes::ConvertFontSizeChromeToAndroid(
134 default_size, default_fixed_size, minimum_size);
135
136 base::DictionaryValue extras;
137 extras.SetDouble("scale", android_scale);
138 SendSettingsBroadcast("org.chromium.arc.settings.SET_FONT_SCALE", extras);
139 }
140
141 void ArcSettingsBridgeImpl::SyncSpokenFeedbackEnabled() const {
142 const PrefService::Preference* pref = registrar_.prefs()->FindPreference(
143 prefs::kAccessibilitySpokenFeedbackEnabled);
144 DCHECK(pref);
145 bool enabled = false;
146 bool value_exists = pref->GetValue()->GetAsBoolean(&enabled);
147 DCHECK(value_exists);
148 base::DictionaryValue extras;
149 extras.SetBoolean("enabled", enabled);
150 SendSettingsBroadcast("org.chromium.arc.settings.SET_SPOKEN_FEEDBACK_ENABLED",
151 extras);
152 }
153
154 void ArcSettingsBridgeImpl::SyncLocale() const {
155 const PrefService::Preference* pref =
156 registrar_.prefs()->FindPreference(prefs::kApplicationLocale);
157 DCHECK(pref);
158 std::string locale;
159 bool value_exists = pref->GetValue()->GetAsString(&locale);
160 DCHECK(value_exists);
161 base::DictionaryValue extras;
162 extras.SetString("locale", locale);
163 SendSettingsBroadcast("org.chromium.arc.settings.SET_LOCALE", extras);
164 }
165
166 void ArcSettingsBridgeImpl::SyncTimeZone() const {
167 TimezoneSettings* timezone_settings = TimezoneSettings::GetInstance();
168 base::string16 timezoneID = timezone_settings->GetCurrentTimezoneID();
169 base::DictionaryValue extras;
170 extras.SetString("olsonTimeZone", timezoneID);
171 SendSettingsBroadcast("org.chromium.arc.settings.SET_TIME_ZONE", extras);
172 }
173
174 void ArcSettingsBridgeImpl::SendSettingsBroadcast(
175 const std::string& action,
176 const base::DictionaryValue& extras) const {
177 ArcBridgeService* bridge_service = ArcBridgeService::Get();
178 if (!bridge_service ||
179 bridge_service->state() != ArcBridgeService::State::READY) {
180 LOG(ERROR) << "Bridge service is not ready.";
181 return;
182 }
183
184 std::string extras_json;
185 bool write_success = base::JSONWriter::Write(extras, &extras_json);
186 DCHECK(write_success);
187 bridge_service->settings_instance()->SendBroadcast(
188 action, "org.chromium.arc.settings",
189 "org.chromium.arc.settings.SettingsReceiver", extras_json);
190 }
191
192 } // namespace arc
OLDNEW
« no previous file with comments | « chrome/browser/chromeos/arc/arc_settings_bridge_impl.h ('k') | chrome/browser/chromeos/arc/arc_settings_bridge_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698