Index: chrome/browser/chromeos/arc/arc_settings_service.cc |
diff --git a/chrome/browser/chromeos/arc/settings_bridge.cc b/chrome/browser/chromeos/arc/arc_settings_service.cc |
similarity index 51% |
rename from chrome/browser/chromeos/arc/settings_bridge.cc |
rename to chrome/browser/chromeos/arc/arc_settings_service.cc |
index 839d57854c1c853f512b16b3f815c563280dd7a0..c2d8a76e5ac2a0b415f5609626c4bf1bacf02c81 100644 |
--- a/chrome/browser/chromeos/arc/settings_bridge.cc |
+++ b/chrome/browser/chromeos/arc/arc_settings_service.cc |
@@ -2,14 +2,21 @@ |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#include "chrome/browser/chromeos/arc/settings_bridge.h" |
+#include "chrome/browser/chromeos/arc/arc_settings_service.h" |
-#include <algorithm> |
+#include <string> |
+#include "base/gtest_prod_util.h" |
+#include "base/json/json_writer.h" |
#include "base/strings/stringprintf.h" |
+#include "base/values.h" |
+#include "chrome/browser/chromeos/settings/cros_settings.h" |
#include "chrome/browser/profiles/profile_manager.h" |
#include "chrome/common/pref_names.h" |
#include "chromeos/settings/cros_settings_names.h" |
+#include "chromeos/settings/timezone_settings.h" |
+#include "components/arc/intent_helper/font_size_util.h" |
+#include "components/prefs/pref_change_registrar.h" |
#include "components/prefs/pref_service.h" |
using ::chromeos::CrosSettings; |
@@ -17,45 +24,69 @@ using ::chromeos::system::TimezoneSettings; |
namespace arc { |
-namespace fontsizes { |
- |
-double ConvertFontSizeChromeToAndroid(int default_size, |
- int default_fixed_size, |
- int minimum_size) { |
- // kWebKitDefaultFixedFontSize is automatically set to be 3 pixels smaller |
- // than kWebKitDefaultFontSize when Chrome's settings page's main font |
- // dropdown control is adjusted. If the user specifically sets a higher |
- // fixed font size we will want to take into account the adjustment. |
- default_fixed_size += 3; |
- int max_chrome_size = |
- std::max(std::max(default_fixed_size, default_size), minimum_size); |
- |
- double android_scale = kAndroidFontScaleSmall; |
- if (max_chrome_size >= kChromeFontSizeVeryLarge) { |
- android_scale = kAndroidFontScaleHuge; |
- } else if (max_chrome_size >= kChromeFontSizeLarge) { |
- android_scale = kAndroidFontScaleLarge; |
- } else if (max_chrome_size >= kChromeFontSizeNormal) { |
- android_scale = kAndroidFontScaleNormal; |
- } |
+// Listens to changes for select Chrome settings (prefs) that Android cares |
+// about and sends the new values to Android to keep the state in sync. |
+class ArcSettingsServiceImpl |
+ : public chromeos::system::TimezoneSettings::Observer { |
+ public: |
+ explicit ArcSettingsServiceImpl(ArcBridgeService* arc_bridge_service); |
+ ~ArcSettingsServiceImpl() override; |
- return android_scale; |
-} |
+ // Called when a Chrome pref we have registered an observer for has changed. |
+ // Obtains the new pref value and sends it to Android. |
+ void OnPrefChanged(const std::string& pref_name) const; |
+ |
+ // TimezoneSettings::Observer |
+ void TimezoneChanged(const icu::TimeZone& timezone) override; |
+ |
+ private: |
+ // Registers to observe changes for Chrome settings we care about. |
+ void StartObservingSettingsChanges(); |
+ |
+ // Stops listening for Chrome settings changes. |
+ void StopObservingSettingsChanges(); |
+ |
+ // Retrives Chrome's state for the settings and send it to Android. |
+ void SyncAllPrefs() const; |
+ void SyncFontSize() const; |
+ void SyncLocale() const; |
+ void SyncReportingConsent() const; |
+ void SyncSpokenFeedbackEnabled() const; |
+ void SyncTimeZone() const; |
+ void SyncUse24HourClock() const; |
-} // namespace fontsizes |
+ // Registers to listen to a particular perf. |
+ void AddPrefToObserve(const std::string& pref_name); |
-SettingsBridge::SettingsBridge(SettingsBridge::Delegate* delegate) |
- : delegate_(delegate) { |
- DCHECK(delegate_); |
+ // Returns the integer value of the pref. pref_name must exist. |
+ int GetIntegerPref(const std::string& pref_name) const; |
+ |
+ // Sends a broadcast to the delegate. |
+ void SendSettingsBroadcast(const std::string& action, |
+ const base::DictionaryValue& extras) const; |
+ |
+ // Manages pref observation registration. |
+ PrefChangeRegistrar registrar_; |
+ |
+ scoped_ptr<chromeos::CrosSettings::ObserverSubscription> |
+ reporting_consent_subscription_; |
+ ArcBridgeService* const arc_bridge_service_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ArcSettingsServiceImpl); |
+}; |
+ |
+ArcSettingsServiceImpl::ArcSettingsServiceImpl( |
+ ArcBridgeService* arc_bridge_service) |
+ : arc_bridge_service_(arc_bridge_service) { |
StartObservingSettingsChanges(); |
SyncAllPrefs(); |
} |
-SettingsBridge::~SettingsBridge() { |
+ArcSettingsServiceImpl::~ArcSettingsServiceImpl() { |
StopObservingSettingsChanges(); |
} |
-void SettingsBridge::StartObservingSettingsChanges() { |
+void ArcSettingsServiceImpl::StartObservingSettingsChanges() { |
Profile* profile = ProfileManager::GetActiveUserProfile(); |
registrar_.Init(profile->GetPrefs()); |
@@ -67,13 +98,13 @@ void SettingsBridge::StartObservingSettingsChanges() { |
reporting_consent_subscription_ = CrosSettings::Get()->AddSettingsObserver( |
chromeos::kStatsReportingPref, |
- base::Bind(&SettingsBridge::SyncReportingConsent, |
+ base::Bind(&ArcSettingsServiceImpl::SyncReportingConsent, |
base::Unretained(this))); |
TimezoneSettings::GetInstance()->AddObserver(this); |
} |
-void SettingsBridge::SyncAllPrefs() const { |
+void ArcSettingsServiceImpl::SyncAllPrefs() const { |
SyncFontSize(); |
SyncLocale(); |
SyncReportingConsent(); |
@@ -82,19 +113,19 @@ void SettingsBridge::SyncAllPrefs() const { |
SyncUse24HourClock(); |
} |
-void SettingsBridge::StopObservingSettingsChanges() { |
+void ArcSettingsServiceImpl::StopObservingSettingsChanges() { |
registrar_.RemoveAll(); |
reporting_consent_subscription_.reset(); |
TimezoneSettings::GetInstance()->RemoveObserver(this); |
} |
-void SettingsBridge::AddPrefToObserve(const std::string& pref_name) { |
- registrar_.Add(pref_name, base::Bind(&SettingsBridge::OnPrefChanged, |
+void ArcSettingsServiceImpl::AddPrefToObserve(const std::string& pref_name) { |
+ registrar_.Add(pref_name, base::Bind(&ArcSettingsServiceImpl::OnPrefChanged, |
base::Unretained(this))); |
} |
-void SettingsBridge::OnPrefChanged(const std::string& pref_name) const { |
+void ArcSettingsServiceImpl::OnPrefChanged(const std::string& pref_name) const { |
if (pref_name == prefs::kAccessibilitySpokenFeedbackEnabled) { |
SyncSpokenFeedbackEnabled(); |
} else if (pref_name == prefs::kWebKitDefaultFixedFontSize || |
@@ -108,11 +139,11 @@ void SettingsBridge::OnPrefChanged(const std::string& pref_name) const { |
} |
} |
-void SettingsBridge::TimezoneChanged(const icu::TimeZone& timezone) { |
+void ArcSettingsServiceImpl::TimezoneChanged(const icu::TimeZone& timezone) { |
SyncTimeZone(); |
} |
-int SettingsBridge::GetIntegerPref(const std::string& pref_name) const { |
+int ArcSettingsServiceImpl::GetIntegerPref(const std::string& pref_name) const { |
const PrefService::Preference* pref = |
registrar_.prefs()->FindPreference(pref_name); |
DCHECK(pref); |
@@ -122,12 +153,12 @@ int SettingsBridge::GetIntegerPref(const std::string& pref_name) const { |
return val; |
} |
-void SettingsBridge::SyncFontSize() const { |
+void ArcSettingsServiceImpl::SyncFontSize() const { |
int default_size = GetIntegerPref(prefs::kWebKitDefaultFontSize); |
int default_fixed_size = GetIntegerPref(prefs::kWebKitDefaultFixedFontSize); |
int minimum_size = GetIntegerPref(prefs::kWebKitMinimumFontSize); |
- double android_scale = fontsizes::ConvertFontSizeChromeToAndroid( |
+ double android_scale = ConvertFontSizeChromeToAndroid( |
default_size, default_fixed_size, minimum_size); |
base::DictionaryValue extras; |
@@ -136,7 +167,7 @@ void SettingsBridge::SyncFontSize() const { |
extras); |
} |
-void SettingsBridge::SyncSpokenFeedbackEnabled() const { |
+void ArcSettingsServiceImpl::SyncSpokenFeedbackEnabled() const { |
const PrefService::Preference* pref = registrar_.prefs()->FindPreference( |
prefs::kAccessibilitySpokenFeedbackEnabled); |
DCHECK(pref); |
@@ -149,7 +180,7 @@ void SettingsBridge::SyncSpokenFeedbackEnabled() const { |
"org.chromium.arc.intent_helper.SET_SPOKEN_FEEDBACK_ENABLED", extras); |
} |
-void SettingsBridge::SyncLocale() const { |
+void ArcSettingsServiceImpl::SyncLocale() const { |
const PrefService::Preference* pref = |
registrar_.prefs()->FindPreference(prefs::kApplicationLocale); |
DCHECK(pref); |
@@ -161,7 +192,7 @@ void SettingsBridge::SyncLocale() const { |
SendSettingsBroadcast("org.chromium.arc.intent_helper.SET_LOCALE", extras); |
} |
-void SettingsBridge::SyncReportingConsent() const { |
+void ArcSettingsServiceImpl::SyncReportingConsent() const { |
bool consent = false; |
CrosSettings::Get()->GetBoolean(chromeos::kStatsReportingPref, &consent); |
base::DictionaryValue extras; |
@@ -170,7 +201,7 @@ void SettingsBridge::SyncReportingConsent() const { |
extras); |
} |
-void SettingsBridge::SyncTimeZone() const { |
+void ArcSettingsServiceImpl::SyncTimeZone() const { |
TimezoneSettings* timezone_settings = TimezoneSettings::GetInstance(); |
base::string16 timezoneID = timezone_settings->GetCurrentTimezoneID(); |
base::DictionaryValue extras; |
@@ -178,7 +209,7 @@ void SettingsBridge::SyncTimeZone() const { |
SendSettingsBroadcast("org.chromium.arc.intent_helper.SET_TIME_ZONE", extras); |
} |
-void SettingsBridge::SyncUse24HourClock() const { |
+void ArcSettingsServiceImpl::SyncUse24HourClock() const { |
const PrefService::Preference* pref = |
registrar_.prefs()->FindPreference(prefs::kUse24HourClock); |
DCHECK(pref); |
@@ -191,10 +222,40 @@ void SettingsBridge::SyncUse24HourClock() const { |
extras); |
} |
-void SettingsBridge::SendSettingsBroadcast( |
+void ArcSettingsServiceImpl::SendSettingsBroadcast( |
const std::string& action, |
const base::DictionaryValue& extras) const { |
- delegate_->OnBroadcastNeeded(action, extras); |
+ if (!arc_bridge_service_->intent_helper_instance()) { |
+ LOG(ERROR) << "IntentHelper instance is not ready."; |
+ return; |
+ } |
+ |
+ std::string extras_json; |
+ bool write_success = base::JSONWriter::Write(extras, &extras_json); |
+ DCHECK(write_success); |
+ |
+ if (arc_bridge_service_->intent_helper_version() >= 1) { |
+ arc_bridge_service_->intent_helper_instance()->SendBroadcast( |
+ action, "org.chromium.arc.intent_helper", |
+ "org.chromium.arc.intent_helper.SettingsReceiver", extras_json); |
+ } |
+} |
+ |
+ArcSettingsService::ArcSettingsService(ArcBridgeService* bridge_service) |
+ : ArcService(bridge_service) { |
+ arc_bridge_service()->AddObserver(this); |
+} |
+ |
+ArcSettingsService::~ArcSettingsService() { |
+ arc_bridge_service()->RemoveObserver(this); |
+} |
+ |
+void ArcSettingsService::OnIntentHelperInstanceReady() { |
+ impl_.reset(new ArcSettingsServiceImpl(arc_bridge_service())); |
+} |
+ |
+void ArcSettingsService::OnIntentHelperInstanceClosed() { |
+ impl_.reset(); |
} |
} // namespace arc |