diff options
Diffstat (limited to 'chrome/browser/chromeos')
4 files changed, 308 insertions, 1 deletions
diff --git a/chrome/browser/chromeos/arc/arc_settings_bridge_impl.cc b/chrome/browser/chromeos/arc/arc_settings_bridge_impl.cc new file mode 100644 index 0000000..6285044 --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_settings_bridge_impl.cc @@ -0,0 +1,158 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// 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/arc_settings_bridge_impl.h" + +#include <algorithm> + +#include "base/prefs/pref_service.h" +#include "base/strings/stringprintf.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/common/pref_names.h" + +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; + } + + return android_scale; +} + +} // namespace fontsizes + +ArcSettingsBridgeImpl::~ArcSettingsBridgeImpl() { + ArcBridgeService* bridge_service = ArcBridgeService::Get(); + DCHECK(bridge_service); + bridge_service->RemoveObserver(this); +} + +void ArcSettingsBridgeImpl::StartObservingBridgeServiceChanges() { + ArcBridgeService* bridge_service = ArcBridgeService::Get(); + DCHECK(bridge_service); + bridge_service->AddObserver(this); +} + +void ArcSettingsBridgeImpl::StartObservingPrefChanges() { + Profile* profile = ProfileManager::GetActiveUserProfile(); + registrar_.Init(profile->GetPrefs()); + + AddPrefToObserve(prefs::kWebKitDefaultFixedFontSize); + AddPrefToObserve(prefs::kWebKitDefaultFontSize); + AddPrefToObserve(prefs::kWebKitMinimumFontSize); + AddPrefToObserve(prefs::kAccessibilitySpokenFeedbackEnabled); +} + +void ArcSettingsBridgeImpl::SyncAllPrefs() const { + SyncFontSize(); + SyncSpokenFeedbackEnabled(); +} + +void ArcSettingsBridgeImpl::StopObservingPrefChanges() { + registrar_.RemoveAll(); +} + +void ArcSettingsBridgeImpl::AddPrefToObserve(const std::string& pref_name) { + registrar_.Add(pref_name, base::Bind(&ArcSettingsBridgeImpl::OnPrefChanged, + base::Unretained(this))); +} + +void ArcSettingsBridgeImpl::OnPrefChanged(const std::string& pref_name) const { + if (pref_name == prefs::kAccessibilitySpokenFeedbackEnabled) { + SyncSpokenFeedbackEnabled(); + } else if (pref_name == prefs::kWebKitDefaultFixedFontSize || + pref_name == prefs::kWebKitDefaultFontSize || + pref_name == prefs::kWebKitMinimumFontSize) { + SyncFontSize(); + } else { + LOG(ERROR) << "Unknown pref changed."; + } +} + +void ArcSettingsBridgeImpl::OnStateChanged(ArcBridgeService::State state) { + // ArcBridgeService::State::READY is emitted before ArcSettings app is ready + // to send broadcasts. Instead we wait for a later boot phase in + // OnInstanceBootPhase. + if (state == ArcBridgeService::State::STOPPING) { + StopObservingPrefChanges(); + } +} + +void ArcSettingsBridgeImpl::OnInstanceBootPhase(InstanceBootPhase phase) { + if (phase == INSTANCE_BOOT_PHASE_ACTIVITY_MANAGER_READY) { + StartObservingPrefChanges(); + SyncAllPrefs(); + } +} + +void ArcSettingsBridgeImpl::SyncSpokenFeedbackEnabled() const { + const PrefService::Preference* pref = registrar_.prefs()->FindPreference( + prefs::kAccessibilitySpokenFeedbackEnabled); + DCHECK(pref); + bool enabled = false; + bool value_exists = pref->GetValue()->GetAsBoolean(&enabled); + DCHECK(value_exists); + base::DictionaryValue extras; + extras.SetBoolean("enabled", enabled); + SendSettingsBroadcast("org.chromium.arc.settings.SET_SPOKEN_FEEDBACK_ENABLED", + extras); +} + +int ArcSettingsBridgeImpl::GetIntegerPref(const std::string& pref_name) const { + const PrefService::Preference* pref = + registrar_.prefs()->FindPreference(pref_name); + DCHECK(pref); + int val = -1; + bool value_exists = pref->GetValue()->GetAsInteger(&val); + DCHECK(value_exists); + return val; +} + +void ArcSettingsBridgeImpl::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( + default_size, default_fixed_size, minimum_size); + + base::DictionaryValue extras; + extras.SetDouble("scale", android_scale); + SendSettingsBroadcast("org.chromium.arc.settings.SET_FONT_SCALE", extras); +} + +void ArcSettingsBridgeImpl::SendSettingsBroadcast( + const std::string& action, + const base::DictionaryValue& extras) const { + ArcBridgeService* bridge_service = ArcBridgeService::Get(); + if (!bridge_service || + bridge_service->state() != ArcBridgeService::State::READY) { + LOG(ERROR) << "Bridge service is not ready."; + return; + } + + bridge_service->SendBroadcast(action, "org.chromium.arc.settings", + "org.chromium.arc.settings.SettingsReceiver", + extras); +} + +} // namespace arc diff --git a/chrome/browser/chromeos/arc/arc_settings_bridge_impl.h b/chrome/browser/chromeos/arc/arc_settings_bridge_impl.h new file mode 100644 index 0000000..e245a1b --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_settings_bridge_impl.h @@ -0,0 +1,93 @@ +// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +#ifndef CHROME_BROWSER_CHROMEOS_ARC_ARC_SETTINGS_BRIDGE_IMPL_H_ +#define CHROME_BROWSER_CHROMEOS_ARC_ARC_SETTINGS_BRIDGE_IMPL_H_ + +#include <string> + +#include "base/gtest_prod_util.h" +#include "base/macros.h" +#include "base/prefs/pref_change_registrar.h" +#include "base/values.h" +#include "components/arc/arc_bridge_service.h" +#include "components/arc/settings/arc_settings_bridge.h" + +namespace arc { + +namespace fontsizes { + +// The following values were obtained from chrome://settings and Android's +// Display settings on Nov 2015. They are expected to remain stable. +const float kAndroidFontScaleSmall = 0.85; +const float kAndroidFontScaleNormal = 1; +const float kAndroidFontScaleLarge = 1.15; +const float kAndroidFontScaleHuge = 1.3; +const int kChromeFontSizeNormal = 16; +const int kChromeFontSizeLarge = 20; +const int kChromeFontSizeVeryLarge = 24; + +// Android has only a single float value for system-wide font size +// (font_scale). Chrome has three main int pixel values that affect +// system-wide font size. We will take the largest font value of the three +// main font values on Chrome and convert to an Android size. +double ConvertFontSizeChromeToAndroid(int default_size, + int default_fixed_size, + int minimum_size); + +} // namespace fontsizes + +// 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 ArcSettingsBridgeImpl : public ArcSettingsBridge, + public ArcBridgeService::Observer { + public: + ArcSettingsBridgeImpl() = default; + + ~ArcSettingsBridgeImpl() override; + + // Starts listening to state changes of the ArcBridgeService. + // This must be called before the bridge service starts bootstrapping. + void StartObservingBridgeServiceChanges() override; + + // 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; + + // ArcBridgeService::Observer + void OnStateChanged(ArcBridgeService::State state) override; + + // ArcBridgeService::Observer + void OnInstanceBootPhase(InstanceBootPhase phase) override; + + private: + // Registers to observe changes for Chrome settings we care about. + void StartObservingPrefChanges(); + + // Stops listening for Chrome settings changes. + void StopObservingPrefChanges(); + + // Retrives Chrome's state for the settings and send it to Android. + void SyncAllPrefs() const; + void SyncSpokenFeedbackEnabled() const; + void SyncFontSize() const; + + // Registers to listen to a particular perf. + void AddPrefToObserve(const std::string& pref_name); + + // Returns the integer value of the pref. pref_name must exist. + int GetIntegerPref(const std::string& pref_name) const; + + // Sends a broadcast to the ArcSettings app in Android. + void SendSettingsBroadcast(const std::string& action, + const base::DictionaryValue& extras) const; + + // Manages pref observation registration. + PrefChangeRegistrar registrar_; + + DISALLOW_COPY_AND_ASSIGN(ArcSettingsBridgeImpl); +}; + +} // namespace arc + +#endif // CHROME_BROWSER_CHROMEOS_ARC_ARC_SETTINGS_BRIDGE_IMPL_H_ diff --git a/chrome/browser/chromeos/arc/arc_settings_bridge_unittest.cc b/chrome/browser/chromeos/arc/arc_settings_bridge_unittest.cc new file mode 100644 index 0000000..864f016 --- /dev/null +++ b/chrome/browser/chromeos/arc/arc_settings_bridge_unittest.cc @@ -0,0 +1,53 @@ +// Copyright (c) 2015 The Chromium Authors. All rights reserved. +// 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/arc_settings_bridge_impl.h" + +#include "testing/gtest/include/gtest/gtest.h" + +namespace arc { + +namespace fontsizes { + +TEST(ArcSettingsBridgeTest, FontSizeConvertChromeToAndroid) { + // Does not return a value smaller than Small. + EXPECT_DOUBLE_EQ(kAndroidFontScaleSmall, + ConvertFontSizeChromeToAndroid(0, 0, 0)); + + // Does not return a value larger than Huge + EXPECT_DOUBLE_EQ(kAndroidFontScaleHuge, + ConvertFontSizeChromeToAndroid(100, 100, 100)); + + // The max of any Chrome values is what determines the Android value. + EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge, + ConvertFontSizeChromeToAndroid(20, 0, 0)); + EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge, + ConvertFontSizeChromeToAndroid(0, 20, 0)); + EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge, + ConvertFontSizeChromeToAndroid(0, 0, 20)); + + // default fixed font size is adjusted up three pixels + EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge, + ConvertFontSizeChromeToAndroid(0, 17, 0)); + + // Small converts properly. + EXPECT_DOUBLE_EQ(kAndroidFontScaleSmall, + ConvertFontSizeChromeToAndroid(12, 0, 0)); + + // Normal converts properly. + EXPECT_DOUBLE_EQ(kAndroidFontScaleNormal, + ConvertFontSizeChromeToAndroid(16, 0, 0)); + + // Large converts properly. + EXPECT_DOUBLE_EQ(kAndroidFontScaleLarge, + ConvertFontSizeChromeToAndroid(20, 0, 0)); + + // Very large converts properly. + EXPECT_DOUBLE_EQ(kAndroidFontScaleHuge, + ConvertFontSizeChromeToAndroid(24, 0, 0)); +} + +} // namespace fontsizes + +} // namespace arc diff --git a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc index 3c83155..33f04e4 100644 --- a/chrome/browser/chromeos/chrome_browser_main_chromeos.cc +++ b/chrome/browser/chromeos/chrome_browser_main_chromeos.cc @@ -30,6 +30,7 @@ #include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" #include "chrome/browser/chromeos/app_mode/kiosk_mode_idle_app_name_notification.h" +#include "chrome/browser/chromeos/arc/arc_settings_bridge_impl.h" #include "chrome/browser/chromeos/boot_times_recorder.h" #include "chrome/browser/chromeos/dbus/chrome_console_service_provider_delegate.h" #include "chrome/browser/chromeos/dbus/chrome_display_power_service_provider_delegate.h" @@ -111,6 +112,7 @@ #include "chromeos/tpm/tpm_token_loader.h" #include "components/arc/arc_bridge_service.h" #include "components/arc/arc_service_manager.h" +#include "components/arc/settings/arc_settings_bridge.h" #include "components/browser_sync/common/browser_sync_switches.h" #include "components/device_event_log/device_event_log.h" #include "components/metrics/metrics_service.h" @@ -389,7 +391,8 @@ void ChromeBrowserMainPartsChromeos::PreMainMessageLoopRun() { wake_on_wifi_manager_.reset(new WakeOnWifiManager()); - arc_service_manager_.reset(new arc::ArcServiceManager()); + arc_service_manager_.reset(new arc::ArcServiceManager( + make_scoped_ptr(new arc::ArcSettingsBridgeImpl()))); arc_service_manager_->arc_bridge_service()->DetectAvailability(); chromeos::ResourceReporter::GetInstance()->StartMonitoring(); |