summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos')
-rw-r--r--chrome/browser/chromeos/arc/arc_settings_bridge_impl.cc158
-rw-r--r--chrome/browser/chromeos/arc/arc_settings_bridge_impl.h93
-rw-r--r--chrome/browser/chromeos/arc/arc_settings_bridge_unittest.cc53
-rw-r--r--chrome/browser/chromeos/chrome_browser_main_chromeos.cc5
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();