15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/preferences.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "ash/autoclick/autoclick_controller.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/magnifier_constants.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/shell.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/time_formatting.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/metrics/histogram.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_member.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_registry_simple.h"
171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h"
195e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h"
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/sys_info.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/drive/file_system_util.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_util.h"
27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/chromeos/login/session/user_session_manager.h"
2803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/browser/chromeos/profiles/profile_helper.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/system/input_device_settings.h"
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "chrome/browser/download/download_prefs.h"
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/prefs/pref_service_syncable.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_switches.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/chromeos_switches.h"
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chromeos/ime/extension_ime_util.h"
36a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "chromeos/ime/ime_keyboard.h"
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "chromeos/system/statistics_provider.h"
39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "components/feedback/tracing_manager.h"
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/pref_registry/pref_registry_syncable.h"
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user.h"
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/i18n/unicode/timezone.h"
43d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
44d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kFallbackInputMethodLocale[] = "en-US";
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Preferences::Preferences()
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : prefs_(NULL),
530f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      input_method_manager_(input_method::InputMethodManager::Get()),
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_(NULL),
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      user_is_primary_(false) {
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Do not observe shell, if there is no shell instance; e.g., in some unit
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // tests.
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (ash::Shell::HasInstance())
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ash::Shell::GetInstance()->AddShellObserver(this);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Preferences::Preferences(input_method::InputMethodManager* input_method_manager)
6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    : prefs_(NULL),
640f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)      input_method_manager_(input_method_manager),
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      user_(NULL),
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      user_is_primary_(false) {
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Do not observe shell, if there is no shell instance; e.g., in some unit
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // tests.
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (ash::Shell::HasInstance())
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ash::Shell::GetInstance()->AddShellObserver(this);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)Preferences::~Preferences() {
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs_->RemoveObserver(this);
756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager::Get()->RemoveSessionStateObserver(this);
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If shell instance is destoryed before this preferences instance, there is
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // no need to remove this shell observer.
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (ash::Shell::HasInstance())
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ash::Shell::GetInstance()->RemoveShellObserver(this);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Preferences::RegisterPrefs(PrefRegistrySimple* registry) {
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterBooleanPref(prefs::kOwnerPrimaryMouseButtonRight, false);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterBooleanPref(prefs::kOwnerTapToClickEnabled, true);
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  registry->RegisterBooleanPref(prefs::kAccessibilityVirtualKeyboardEnabled,
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                false);
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  registry->RegisterStringPref(prefs::kLogoutStartedLast, std::string());
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid Preferences::RegisterProfilePrefs(
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string hardware_keyboard_id;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(yusukes): Remove the runtime hack.
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (base::SysInfo::IsRunningOnChromeOS()) {
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(g_browser_process);
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    PrefService* local_state = g_browser_process->local_state();
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    DCHECK(local_state);
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    hardware_keyboard_id =
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        local_state->GetString(prefs::kHardwareKeyboardLayout);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hardware_keyboard_id = "xkb:us::eng";  // only for testing.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
107bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      prefs::kPerformanceTracingEnabled,
108bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      false,
109bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
110bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
111bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  registry->RegisterBooleanPref(
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kTapToClickEnabled,
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
1143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kTapDraggingEnabled,
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
1183240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kEnableTouchpadThreeFingerClick,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kNaturalScroll,
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CommandLine::ForCurrentProcess()->HasSwitch(
126b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          switches::kNaturalScrollDefault),
1273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kPrimaryMouseButtonRight,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
1313240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLabsMediaplayerEnabled,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLabsAdvancedFilesystemEnabled,
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityStickyKeysEnabled,
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      false,
14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  registry->RegisterBooleanPref(
145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityLargeCursorEnabled,
146868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
147868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilitySpokenFeedbackEnabled,
150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
1513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityHighContrastEnabled,
154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      false,
15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityScreenMagnifierEnabled,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityScreenMagnifierType,
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ash::kDefaultMagnifierType,
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterDoublePref(
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityScreenMagnifierScale,
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::numeric_limits<double>::min(),
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityAutoclickEnabled,
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      false,
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
1728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  registry->RegisterIntegerPref(
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityAutoclickDelayMs,
1748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      ash::AutoclickController::kDefaultAutoclickDelayMs,
1758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  registry->RegisterBooleanPref(
177f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      prefs::kAccessibilityVirtualKeyboardEnabled,
178f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      false,
179f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  registry->RegisterBooleanPref(
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kShouldAlwaysShowAccessibilityMenu,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kMouseSensitivity,
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      3,
1873240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kTouchpadSensitivity,
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      3,
1913240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kUse24HourClock,
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::GetHourClockType() == base::k24HourClock,
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kDisableDrive,
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kDisableDriveOverCellular,
202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kDisableDriveHostedFiles,
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't sync prefs::kLanguageCurrentInputMethod and PreviousInputMethod
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // because they're just used to track the logout state of the device.
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageCurrentInputMethod,
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguagePreviousInputMethod,
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We don't sync the list of input methods and preferred languages since a
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user might use two or more devices with different hardware keyboards.
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crosbug.com/15181
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguagePreferredLanguages,
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      kFallbackInputMethodLocale,
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguagePreloadEngines,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      hardware_keyboard_id,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      prefs::kLanguageEnabledExtensionImes,
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageRemapSearchKeyTo,
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_method::kSearchKey,
2373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageRemapControlKeyTo,
240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_method::kControlKey,
2413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
243c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageRemapAltKeyTo,
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_method::kAltKey,
2453240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
246b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // We don't sync the CapsLock remapping pref, since the UI hides this pref
247b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // on certain devices, so syncing a non-default value to a device that
248b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // doesn't allow changing the pref would be odd. http://crbug.com/167237
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageRemapCapsLockKeyTo,
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_method::kCapsLockKey,
252b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
254c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageRemapDiamondKeyTo,
255c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      input_method::kControlKey,
2563240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch      user_prefs::PrefRegistrySyncable::SYNCABLE_PRIORITY_PREF);
2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // The following pref isn't synced since the user may desire a different value
2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // depending on whether an external keyboard is attached to a particular
2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // device.
2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  registry->RegisterBooleanPref(
2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      prefs::kLanguageSendFunctionKeys,
2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      false,
2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatEnabled,
266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
269c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatDelay,
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      language_prefs::kXkbAutoRepeatDelayInMs,
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterIntegerPref(
273c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatInterval,
274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      language_prefs::kXkbAutoRepeatIntervalInMs,
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mobile plan notifications default to on.
278c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
279c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kShowPlanNotifications,
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
281c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 3G first-time usage promo will be shown at least once.
284c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kShow3gPromoNotification,
286c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
287c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Initially all existing users would see "What's new" for current version
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // after update.
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterStringPref(prefs::kChromeOSReleaseNotesVersion,
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                               "0.0.0.0",
293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kExternalStorageDisabled,
297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
298c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
299c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
300c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kTermsOfServiceURL,
302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      "",
303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
3047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
3057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  registry->RegisterBooleanPref(
3067dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      prefs::kTouchHudProjectionEnabled,
3077dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      false,
3087dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
3096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  registry->RegisterBooleanPref(
3116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      prefs::kTouchVirtualKeyboardEnabled,
3126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      false,
3136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Preferences::InitUserPrefs(PrefServiceSyncable* prefs) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs_ = prefs;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BooleanPrefMember::NamedChangeCallback callback =
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&Preferences::OnPreferenceChanged, base::Unretained(this));
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
322bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  performance_tracing_enabled_.Init(prefs::kPerformanceTracingEnabled,
323bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch                                    prefs, callback);
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tap_to_click_enabled_.Init(prefs::kTapToClickEnabled, prefs, callback);
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  tap_dragging_enabled_.Init(prefs::kTapDraggingEnabled, prefs, callback);
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  three_finger_click_enabled_.Init(prefs::kEnableTouchpadThreeFingerClick,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs, callback);
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  natural_scroll_.Init(prefs::kNaturalScroll, prefs, callback);
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  mouse_sensitivity_.Init(prefs::kMouseSensitivity, prefs, callback);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  touchpad_sensitivity_.Init(prefs::kTouchpadSensitivity, prefs, callback);
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  primary_mouse_button_right_.Init(prefs::kPrimaryMouseButtonRight,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   prefs, callback);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  download_default_directory_.Init(prefs::kDownloadDefaultDirectory,
3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   prefs, callback);
3357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  touch_hud_projection_enabled_.Init(prefs::kTouchHudProjectionEnabled,
3367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                                     prefs, callback);
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  preload_engines_.Init(prefs::kLanguagePreloadEngines, prefs, callback);
338b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes,
339b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                               prefs, callback);
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  current_input_method_.Init(prefs::kLanguageCurrentInputMethod,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             prefs, callback);
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  previous_input_method_.Init(prefs::kLanguagePreviousInputMethod,
3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              prefs, callback);
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xkb_auto_repeat_enabled_.Init(
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatEnabled, prefs, callback);
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xkb_auto_repeat_delay_pref_.Init(
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatDelay, prefs, callback);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  xkb_auto_repeat_interval_pref_.Init(
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kLanguageXkbAutoRepeatInterval, prefs, callback);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void Preferences::Init(Profile* profile, const user_manager::User* user) {
35403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(profile);
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(user);
35603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  PrefServiceSyncable* prefs = PrefServiceSyncable::FromProfile(profile);
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  user_ = user;
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_is_primary_ =
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetPrimaryUser() == user_;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitUserPrefs(prefs);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  user_manager::UserManager::Get()->AddSessionStateObserver(this);
3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This causes OnIsSyncingChanged to be called when the value of
3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PrefService::IsSyncing() changes.
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  prefs->AddObserver(this);
3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
36803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  UserSessionManager* session_manager = UserSessionManager::GetInstance();
36903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  DCHECK(session_manager);
3701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ime_state_ = session_manager->GetDefaultIMEState(profile);
37103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  input_method_manager_->SetState(ime_state_);
37203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initialize preferences to currently saved state.
3745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ApplyPreferences(REASON_INITIALIZATION, "");
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If a guest is logged in, initialize the prefs as if this is the first
377f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // login. For a regular user this is done in
378116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // UserSessionManager::InitProfilePreferences().
379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kGuestSession))
38003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    session_manager->SetFirstLoginPrefs(profile, std::string(), std::string());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void Preferences::InitUserPrefsForTesting(
38403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    PrefServiceSyncable* prefs,
38503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    const user_manager::User* user,
38603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    scoped_refptr<input_method::InputMethodManager::State> ime_state) {
3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  user_ = user;
38803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ime_state_ = ime_state;
38903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (ime_state.get())
39103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    input_method_manager_->SetState(ime_state);
39203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitUserPrefs(prefs);
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Preferences::SetInputMethodListForTesting() {
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetInputMethodList();
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Preferences::OnPreferenceChanged(const std::string& pref_name) {
4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ApplyPreferences(REASON_PREF_CHANGED, pref_name);
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Preferences::ApplyPreferences(ApplyReason reason,
4055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& pref_name) {
4065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DCHECK(reason != REASON_PREF_CHANGED || !pref_name.empty());
4075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool user_is_owner =
4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetOwnerEmail() == user_->email();
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  const bool user_is_active = user_->is_active();
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  system::TouchpadSettings touchpad_settings;
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  system::MouseSettings mouse_settings;
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (user_is_primary_ && (reason == REASON_INITIALIZATION ||
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           pref_name == prefs::kPerformanceTracingEnabled)) {
416bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    const bool enabled = performance_tracing_enabled_.GetValue();
417bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    if (enabled)
418bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      tracing_manager_ = TracingManager::Create();
419bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    else
420bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      tracing_manager_.reset();
421bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  }
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED || pref_name == prefs::kTapToClickEnabled) {
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool enabled = tap_to_click_enabled_.GetValue();
4245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
4255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touchpad_settings.SetTapToClick(enabled);
4265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.TapToClick.Changed", enabled);
4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.TapToClick.Started", enabled);
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Save owner preference in local state to use on login screen.
4325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_owner) {
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* prefs = g_browser_process->local_state();
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prefs->GetBoolean(prefs::kOwnerTapToClickEnabled) != enabled)
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->SetBoolean(prefs::kOwnerTapToClickEnabled, enabled);
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
4395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kTapDraggingEnabled) {
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool enabled = tap_dragging_enabled_.GetValue();
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
4425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touchpad_settings.SetTapDragging(enabled);
4435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Changed", enabled);
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Started", enabled);
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kEnableTouchpadThreeFingerClick) {
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool enabled = three_finger_click_enabled_.GetValue();
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touchpad_settings.SetThreeFingerClick(enabled);
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.ThreeFingerClick.Changed", enabled);
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.ThreeFingerClick.Started", enabled);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED || pref_name == prefs::kNaturalScroll) {
4592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Force natural scroll default if we've sync'd and if the cmd line arg is
4602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // set.
4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ForceNaturalScrollDefault();
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool enabled = natural_scroll_.GetValue();
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DVLOG(1) << "Natural scroll set to " << enabled;
4655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
466c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      touchpad_settings.SetNaturalScroll(enabled);
4675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.NaturalScroll.Changed", enabled);
4695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Touchpad.NaturalScroll.Started", enabled);
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED || pref_name == prefs::kMouseSensitivity) {
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int sensitivity = mouse_sensitivity_.GetValue();
4745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      mouse_settings.SetSensitivity(sensitivity);
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED) {
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UMA_HISTOGRAM_ENUMERATION("Mouse.PointerSensitivity.Changed",
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                sensitivity,
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                system::kMaxPointerSensitivity + 1);
4805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (reason == REASON_INITIALIZATION) {
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UMA_HISTOGRAM_ENUMERATION("Mouse.PointerSensitivity.Started",
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                sensitivity,
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                system::kMaxPointerSensitivity + 1);
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
4875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kTouchpadSensitivity) {
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int sensitivity = touchpad_sensitivity_.GetValue();
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      touchpad_settings.SetSensitivity(sensitivity);
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED) {
492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UMA_HISTOGRAM_ENUMERATION("Touchpad.PointerSensitivity.Changed",
493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                sensitivity,
494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                system::kMaxPointerSensitivity + 1);
4955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    } else if (reason == REASON_INITIALIZATION) {
496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      UMA_HISTOGRAM_ENUMERATION("Touchpad.PointerSensitivity.Started",
497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                sensitivity,
498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                system::kMaxPointerSensitivity + 1);
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kPrimaryMouseButtonRight) {
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool right = primary_mouse_button_right_.GetValue();
5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
5055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      mouse_settings.SetPrimaryButtonRight(right);
5065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Mouse.PrimaryButtonRight.Changed", right);
5085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN("Mouse.PrimaryButtonRight.Started", right);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Save owner preference in local state to use on login screen.
5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_owner) {
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      PrefService* prefs = g_browser_process->local_state();
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (prefs->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight) != right)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        prefs->SetBoolean(prefs::kOwnerPrimaryMouseButtonRight, right);
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kDownloadDefaultDirectory) {
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const bool default_download_to_drive = drive::util::IsUnderDriveMountPoint(
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        download_default_directory_.GetValue());
5215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (reason == REASON_PREF_CHANGED)
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN(
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "FileBrowser.DownloadDestination.IsGoogleDrive.Changed",
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default_download_to_drive);
5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    else if (reason == REASON_INITIALIZATION)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UMA_HISTOGRAM_BOOLEAN(
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          "FileBrowser.DownloadDestination.IsGoogleDrive.Started",
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          default_download_to_drive);
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
5315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kTouchHudProjectionEnabled) {
5321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if !defined(USE_ATHENA)
5335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active) {
5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const bool enabled = touch_hud_projection_enabled_.GetValue();
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ash::Shell::GetInstance()->SetTouchHudProjectionEnabled(enabled);
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
5415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kLanguageXkbAutoRepeatEnabled) {
5425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active) {
5435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const bool enabled = xkb_auto_repeat_enabled_.GetValue();
544a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      input_method::InputMethodManager::Get()
545a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          ->GetImeKeyboard()
5465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ->SetAutoRepeatEnabled(enabled);
5475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    }
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (reason != REASON_PREF_CHANGED ||
5505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kLanguageXkbAutoRepeatDelay ||
5515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      pref_name == prefs::kLanguageXkbAutoRepeatInterval) {
5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (user_is_active)
5535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      UpdateAutoRepeatRate();
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (reason == REASON_INITIALIZATION)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetInputMethodList();
55803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if (pref_name == prefs::kLanguagePreloadEngines &&
56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      reason == REASON_PREF_CHANGED) {
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName,
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     language_prefs::kPreloadEnginesConfigName,
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     preload_engines_.GetValue());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  if ((reason == REASON_INITIALIZATION) ||
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      (pref_name == prefs::kLanguageEnabledExtensionImes &&
56803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)       reason == REASON_PREF_CHANGED)) {
56903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::string value(enabled_extension_imes_.GetValue());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    std::vector<std::string> split_values;
57203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    if (!value.empty())
57303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      base::SplitString(value, ',', &split_values);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ime_state_->SetEnabledExtensionImes(&split_values);
5765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
5775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
5785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (user_is_active) {
5795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    system::InputDeviceSettings::Get()->UpdateTouchpadSettings(
5805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        touchpad_settings);
5815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    system::InputDeviceSettings::Get()->UpdateMouseSettings(mouse_settings);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Preferences::OnIsSyncingChanged() {
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "OnIsSyncingChanged";
5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ForceNaturalScrollDefault();
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Preferences::ForceNaturalScrollDefault() {
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DVLOG(1) << "ForceNaturalScrollDefault";
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (CommandLine::ForCurrentProcess()->HasSwitch(
593b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)          switches::kNaturalScrollDefault) &&
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs_->IsSyncing() &&
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      !prefs_->GetUserPrefValue(prefs::kNaturalScroll)) {
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    DVLOG(1) << "Natural scroll forced to true";
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    natural_scroll_.SetValue(true);
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    UMA_HISTOGRAM_BOOLEAN("Touchpad.NaturalScroll.Forced", true);
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Preferences::SetLanguageConfigStringListAsCSV(const char* section,
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const char* name,
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                   const std::string& value) {
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  VLOG(1) << "Setting " << name << " to '" << value << "'";
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> split_values;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!value.empty())
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    base::SplitString(value, ',', &split_values);
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Transfers the xkb id to extension-xkb id.
61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (input_method_manager_->MigrateInputMethods(&split_values))
613a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    preload_engines_.SetValue(JoinString(split_values, ','));
614a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (section == std::string(language_prefs::kGeneralSectionName) &&
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      name == std::string(language_prefs::kPreloadEnginesConfigName)) {
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ime_state_->ReplaceEnabledInputMethods(split_values);
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Preferences::SetInputMethodList() {
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When |preload_engines_| are set, InputMethodManager::ChangeInputMethod()
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might be called to change the current input method to the first one in the
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |preload_engines_| list. This also updates previous/current input method
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs. That's why GetValue() calls are placed before the
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // SetLanguageConfigStringListAsCSV() call below.
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string previous_input_method_id =
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      previous_input_method_.GetValue();
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::string current_input_method_id = current_input_method_.GetValue();
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName,
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   language_prefs::kPreloadEnginesConfigName,
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   preload_engines_.GetValue());
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ChangeInputMethod() has to be called AFTER the value of |preload_engines_|
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is sent to the InputMethodManager. Otherwise, the ChangeInputMethod request
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // might be ignored as an invalid input method ID. The ChangeInputMethod()
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // calls are also necessary to restore the previous/current input method prefs
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // which could have been modified by the SetLanguageConfigStringListAsCSV call
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // above to the original state.
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!previous_input_method_id.empty())
64203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ime_state_->ChangeInputMethod(previous_input_method_id,
64303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  false /* show_message */);
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!current_input_method_id.empty())
64503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ime_state_->ChangeInputMethod(current_input_method_id,
64603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)                                  false /* show_message */);
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Preferences::UpdateAutoRepeatRate() {
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  input_method::AutoRepeatRate rate;
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rate.initial_delay_in_ms = xkb_auto_repeat_delay_pref_.GetValue();
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rate.repeat_interval_in_ms = xkb_auto_repeat_interval_pref_.GetValue();
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rate.initial_delay_in_ms > 0);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(rate.repeat_interval_in_ms > 0);
655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  input_method::InputMethodManager::Get()
656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ->GetImeKeyboard()
6575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ->SetAutoRepeatRate(rate);
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid Preferences::OnTouchHudProjectionToggled(bool enabled) {
6617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if (touch_hud_projection_enabled_.GetValue() == enabled)
6627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return;
6635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (!user_->is_active())
6645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  touch_hud_projection_enabled_.SetValue(enabled);
6667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
6677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
6685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void Preferences::ActiveUserChanged(const user_manager::User* active_user) {
6695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (active_user != user_)
6705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return;
6715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ApplyPreferences(REASON_ACTIVE_USER_CHANGED, "");
6725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
675