#include "chrome/browser/chromeos/preferences.h"
+#include <vector>
+
#include "ash/autoclick/autoclick_controller.h"
#include "ash/magnifier/magnifier_constants.h"
#include "ash/shell.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
#include "chrome/browser/chromeos/input_method/input_method_util.h"
#include "chrome/browser/chromeos/login/login_utils.h"
-#include "chrome/browser/chromeos/login/user_manager.h"
+#include "chrome/browser/chromeos/login/user.h"
#include "chrome/browser/chromeos/system/input_device_settings.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/feedback/tracing_manager.h"
static const char kFallbackInputMethodLocale[] = "en-US";
-// TODO(achuith): Remove deprecated pref in M31. crbug.com/223480.
-static const char kEnableTouchpadThreeFingerSwipe[] =
- "settings.touchpad.enable_three_finger_swipe";
-
Preferences::Preferences()
: prefs_(NULL),
input_method_manager_(input_method::InputMethodManager::Get()),
- is_primary_user_prefs_(true) {
+ user_(NULL),
+ user_is_primary_(false) {
// Do not observe shell, if there is no shell instance; e.g., in some unit
// tests.
if (ash::Shell::HasInstance())
Preferences::Preferences(input_method::InputMethodManager* input_method_manager)
: prefs_(NULL),
input_method_manager_(input_method_manager),
- is_primary_user_prefs_(true) {
+ user_(NULL) {
// Do not observe shell, if there is no shell instance; e.g., in some unit
// tests.
if (ash::Shell::HasInstance())
Preferences::~Preferences() {
prefs_->RemoveObserver(this);
+ UserManager::Get()->RemoveSessionStateObserver(this);
// If shell instance is destoryed before this preferences instance, there is
// no need to remove this shell observer.
if (ash::Shell::HasInstance())
std::string hardware_keyboard_id;
// TODO(yusukes): Remove the runtime hack.
if (base::SysInfo::IsRunningOnChromeOS()) {
- input_method::InputMethodManager* manager =
- input_method::InputMethodManager::Get();
- if (manager) {
- hardware_keyboard_id =
- manager->GetInputMethodUtil()->GetHardwareInputMethodId();
- }
+ DCHECK(g_browser_process);
+ PrefService* local_state = g_browser_process->local_state();
+ DCHECK(local_state);
+ hardware_keyboard_id =
+ local_state->GetString(prefs::kHardwareKeyboardLayout);
} else {
hardware_keyboard_id = "xkb:us::eng"; // only for testing.
}
ash::AutoclickController::kDefaultAutoclickDelayMs,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
registry->RegisterBooleanPref(
+ prefs::kVirtualKeyboardEnabled,
+ false,
+ user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
+ registry->RegisterBooleanPref(
prefs::kShouldAlwaysShowAccessibilityMenu,
false,
user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
"",
user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
- // TODO(achuith): Remove deprecated pref in M31. crbug.com/223480.
- registry->RegisterBooleanPref(
- kEnableTouchpadThreeFingerSwipe,
- false,
- user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
-
registry->RegisterBooleanPref(
prefs::kTouchHudProjectionEnabled,
false,
three_finger_click_enabled_.Init(prefs::kEnableTouchpadThreeFingerClick,
prefs, callback);
natural_scroll_.Init(prefs::kNaturalScroll, prefs, callback);
- a11y_spoken_feedback_enabled_.Init(prefs::kSpokenFeedbackEnabled,
- prefs, callback);
- a11y_high_contrast_enabled_.Init(prefs::kHighContrastEnabled,
- prefs, callback);
- a11y_screen_magnifier_enabled_.Init(prefs::kScreenMagnifierEnabled,
- prefs, callback);
- a11y_screen_magnifier_type_.Init(prefs::kScreenMagnifierType,
- prefs, callback);
- a11y_screen_magnifier_scale_.Init(prefs::kScreenMagnifierScale,
- prefs, callback);
mouse_sensitivity_.Init(prefs::kMouseSensitivity, prefs, callback);
touchpad_sensitivity_.Init(prefs::kTouchpadSensitivity, prefs, callback);
- use_24hour_clock_.Init(prefs::kUse24HourClock, prefs, callback);
- disable_drive_.Init(prefs::kDisableDrive, prefs, callback);
- disable_drive_over_cellular_.Init(prefs::kDisableDriveOverCellular,
- prefs, callback);
- disable_drive_hosted_files_.Init(prefs::kDisableDriveHostedFiles,
+ primary_mouse_button_right_.Init(prefs::kPrimaryMouseButtonRight,
prefs, callback);
download_default_directory_.Init(prefs::kDownloadDefaultDirectory,
prefs, callback);
- select_file_last_directory_.Init(prefs::kSelectFileLastDirectory,
- prefs, callback);
- save_file_default_directory_.Init(prefs::kSaveFileDefaultDirectory,
- prefs, callback);
touch_hud_projection_enabled_.Init(prefs::kTouchHudProjectionEnabled,
prefs, callback);
- primary_mouse_button_right_.Init(prefs::kPrimaryMouseButtonRight,
- prefs, callback);
- preferred_languages_.Init(prefs::kLanguagePreferredLanguages,
- prefs, callback);
preload_engines_.Init(prefs::kLanguagePreloadEngines, prefs, callback);
enabled_extension_imes_.Init(prefs::kLanguageEnabledExtensionImes,
prefs, callback);
prefs::kLanguageXkbAutoRepeatDelay, prefs, callback);
xkb_auto_repeat_interval_pref_.Init(
prefs::kLanguageXkbAutoRepeatInterval, prefs, callback);
-
- // TODO(achuith): Remove deprecated pref in M31. crbug.com/223480.
- prefs->ClearPref(kEnableTouchpadThreeFingerSwipe);
}
-void Preferences::Init(PrefServiceSyncable* prefs, bool is_primary_user) {
- is_primary_user_prefs_ = is_primary_user;
+void Preferences::Init(PrefServiceSyncable* prefs, const User* user) {
+ DCHECK(user);
+ user_ = user;
+ user_is_primary_ = UserManager::Get()->GetPrimaryUser() == user_;
InitUserPrefs(prefs);
+ UserManager::Get()->AddSessionStateObserver(this);
+
// This causes OnIsSyncingChanged to be called when the value of
// PrefService::IsSyncing() changes.
prefs->AddObserver(this);
// Initialize preferences to currently saved state.
- NotifyPrefChanged(NULL);
+ ApplyPreferences(REASON_INITIALIZATION, "");
// If a guest is logged in, initialize the prefs as if this is the first
// login.
}
}
-void Preferences::InitUserPrefsForTesting(PrefServiceSyncable* prefs) {
+void Preferences::InitUserPrefsForTesting(PrefServiceSyncable* prefs,
+ const User* user) {
+ user_ = user;
InitUserPrefs(prefs);
}
}
void Preferences::OnPreferenceChanged(const std::string& pref_name) {
- NotifyPrefChanged(&pref_name);
+ ApplyPreferences(REASON_PREF_CHANGED, pref_name);
}
-void Preferences::NotifyPrefChanged(const std::string* pref_name) {
- if (!pref_name || *pref_name == prefs::kPerformanceTracingEnabled) {
+void Preferences::ApplyPreferences(ApplyReason reason,
+ const std::string& pref_name) {
+ DCHECK(reason != REASON_PREF_CHANGED || !pref_name.empty());
+ const bool user_is_owner =
+ UserManager::Get()->GetOwnerEmail() == user_->email();
+ const bool user_is_active = user_->is_active();
+
+ system::TouchpadSettings touchpad_settings;
+ system::MouseSettings mouse_settings;
+
+ if (user_is_primary_ && (reason == REASON_INITIALIZATION ||
+ pref_name == prefs::kPerformanceTracingEnabled)) {
const bool enabled = performance_tracing_enabled_.GetValue();
if (enabled)
tracing_manager_ = TracingManager::Create();
else
tracing_manager_.reset();
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kTapToClickEnabled)) {
+ if (reason != REASON_PREF_CHANGED || pref_name == prefs::kTapToClickEnabled) {
const bool enabled = tap_to_click_enabled_.GetValue();
- system::touchpad_settings::SetTapToClick(enabled);
- if (pref_name)
+ if (user_is_active)
+ touchpad_settings.SetTapToClick(enabled);
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN("Touchpad.TapToClick.Changed", enabled);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN("Touchpad.TapToClick.Started", enabled);
// Save owner preference in local state to use on login screen.
- if (chromeos::UserManager::Get()->IsCurrentUserOwner()) {
+ if (user_is_owner) {
PrefService* prefs = g_browser_process->local_state();
if (prefs->GetBoolean(prefs::kOwnerTapToClickEnabled) != enabled)
prefs->SetBoolean(prefs::kOwnerTapToClickEnabled, enabled);
}
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kTapDraggingEnabled)) {
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kTapDraggingEnabled) {
const bool enabled = tap_dragging_enabled_.GetValue();
- system::touchpad_settings::SetTapDragging(enabled);
- if (pref_name)
+ if (user_is_active)
+ touchpad_settings.SetTapDragging(enabled);
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Changed", enabled);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Started", enabled);
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kEnableTouchpadThreeFingerClick)) {
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kEnableTouchpadThreeFingerClick) {
const bool enabled = three_finger_click_enabled_.GetValue();
- system::touchpad_settings::SetThreeFingerClick(enabled);
- if (pref_name)
+ if (user_is_active)
+ touchpad_settings.SetThreeFingerClick(enabled);
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN("Touchpad.ThreeFingerClick.Changed", enabled);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN("Touchpad.ThreeFingerClick.Started", enabled);
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kNaturalScroll)) {
+ if (reason != REASON_PREF_CHANGED || pref_name == prefs::kNaturalScroll) {
// Force natural scroll default if we've sync'd and if the cmd line arg is
// set.
ForceNaturalScrollDefault();
const bool enabled = natural_scroll_.GetValue();
DVLOG(1) << "Natural scroll set to " << enabled;
- ui::SetNaturalScroll(enabled);
- if (pref_name)
+ if (user_is_active)
+ ui::SetNaturalScroll(enabled);
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN("Touchpad.NaturalScroll.Changed", enabled);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN("Touchpad.NaturalScroll.Started", enabled);
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kMouseSensitivity)) {
+ if (reason != REASON_PREF_CHANGED || pref_name == prefs::kMouseSensitivity) {
const int sensitivity = mouse_sensitivity_.GetValue();
- system::mouse_settings::SetSensitivity(sensitivity);
- if (pref_name) {
+ if (user_is_active)
+ mouse_settings.SetSensitivity(sensitivity);
+ if (reason == REASON_PREF_CHANGED) {
UMA_HISTOGRAM_ENUMERATION("Mouse.PointerSensitivity.Changed",
sensitivity,
system::kMaxPointerSensitivity + 1);
- } else {
+ } else if (reason == REASON_INITIALIZATION) {
UMA_HISTOGRAM_ENUMERATION("Mouse.PointerSensitivity.Started",
sensitivity,
system::kMaxPointerSensitivity + 1);
}
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kTouchpadSensitivity)) {
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kTouchpadSensitivity) {
const int sensitivity = touchpad_sensitivity_.GetValue();
- system::touchpad_settings::SetSensitivity(sensitivity);
- if (pref_name) {
+ if (user_is_active)
+ touchpad_settings.SetSensitivity(sensitivity);
+ if (reason == REASON_PREF_CHANGED) {
UMA_HISTOGRAM_ENUMERATION("Touchpad.PointerSensitivity.Changed",
sensitivity,
system::kMaxPointerSensitivity + 1);
- } else {
+ } else if (reason == REASON_INITIALIZATION) {
UMA_HISTOGRAM_ENUMERATION("Touchpad.PointerSensitivity.Started",
sensitivity,
system::kMaxPointerSensitivity + 1);
}
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kPrimaryMouseButtonRight)) {
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kPrimaryMouseButtonRight) {
const bool right = primary_mouse_button_right_.GetValue();
- system::mouse_settings::SetPrimaryButtonRight(right);
- if (pref_name)
+ if (user_is_active)
+ mouse_settings.SetPrimaryButtonRight(right);
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN("Mouse.PrimaryButtonRight.Changed", right);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN("Mouse.PrimaryButtonRight.Started", right);
-
// Save owner preference in local state to use on login screen.
- if (chromeos::UserManager::Get()->IsCurrentUserOwner()) {
+ if (user_is_owner) {
PrefService* prefs = g_browser_process->local_state();
if (prefs->GetBoolean(prefs::kOwnerPrimaryMouseButtonRight) != right)
prefs->SetBoolean(prefs::kOwnerPrimaryMouseButtonRight, right);
}
}
- if (!pref_name || *pref_name == prefs::kDownloadDefaultDirectory) {
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kDownloadDefaultDirectory) {
const bool default_download_to_drive = drive::util::IsUnderDriveMountPoint(
download_default_directory_.GetValue());
- if (pref_name)
+ if (reason == REASON_PREF_CHANGED)
UMA_HISTOGRAM_BOOLEAN(
"FileBrowser.DownloadDestination.IsGoogleDrive.Changed",
default_download_to_drive);
- else
+ else if (reason == REASON_INITIALIZATION)
UMA_HISTOGRAM_BOOLEAN(
"FileBrowser.DownloadDestination.IsGoogleDrive.Started",
default_download_to_drive);
}
- if ((!pref_name && is_primary_user_prefs_) ||
- (pref_name && *pref_name == prefs::kTouchHudProjectionEnabled)) {
- const bool enabled = touch_hud_projection_enabled_.GetValue();
- ash::Shell::GetInstance()->SetTouchHudProjectionEnabled(enabled);
- }
-
- if (!pref_name || *pref_name == prefs::kLanguagePreferredLanguages) {
- // Unlike kLanguagePreloadEngines and some other input method
- // preferencs, we don't need to send this to ibus-daemon.
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kTouchHudProjectionEnabled) {
+ if (user_is_active) {
+ const bool enabled = touch_hud_projection_enabled_.GetValue();
+ ash::Shell::GetInstance()->SetTouchHudProjectionEnabled(enabled);
+ }
}
- if (!pref_name || *pref_name == prefs::kLanguageXkbAutoRepeatEnabled) {
- const bool enabled = xkb_auto_repeat_enabled_.GetValue();
- input_method::XKeyboard::SetAutoRepeatEnabled(enabled);
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kLanguageXkbAutoRepeatEnabled) {
+ if (user_is_active) {
+ const bool enabled = xkb_auto_repeat_enabled_.GetValue();
+ input_method::InputMethodManager::Get()->GetXKeyboard()
+ ->SetAutoRepeatEnabled(enabled);
+ }
}
- if (!pref_name || ((*pref_name == prefs::kLanguageXkbAutoRepeatDelay) ||
- (*pref_name == prefs::kLanguageXkbAutoRepeatInterval))) {
- UpdateAutoRepeatRate();
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kLanguageXkbAutoRepeatDelay ||
+ pref_name == prefs::kLanguageXkbAutoRepeatInterval) {
+ if (user_is_active)
+ UpdateAutoRepeatRate();
}
- if (!pref_name) {
+ if (reason != REASON_PREF_CHANGED && user_is_active) {
SetInputMethodList();
- } else if (*pref_name == prefs::kLanguagePreloadEngines) {
+ } else if (pref_name == prefs::kLanguagePreloadEngines && user_is_active) {
SetLanguageConfigStringListAsCSV(language_prefs::kGeneralSectionName,
language_prefs::kPreloadEnginesConfigName,
preload_engines_.GetValue());
}
- if (!pref_name || *pref_name == prefs::kLanguageEnabledExtensionImes) {
- std::string value(enabled_extension_imes_.GetValue());
+ if (reason != REASON_PREF_CHANGED ||
+ pref_name == prefs::kLanguageEnabledExtensionImes) {
+ if (user_is_active) {
+ std::string value(enabled_extension_imes_.GetValue());
- std::vector<std::string> split_values;
- if (!value.empty())
- base::SplitString(value, ',', &split_values);
+ std::vector<std::string> split_values;
+ if (!value.empty())
+ base::SplitString(value, ',', &split_values);
- input_method_manager_->SetEnabledExtensionImes(&split_values);
+ input_method_manager_->SetEnabledExtensionImes(&split_values);
+ }
+ }
+
+ if (user_is_active) {
+ system::InputDeviceSettings::Get()->UpdateTouchpadSettings(
+ touchpad_settings);
+ system::InputDeviceSettings::Get()->UpdateMouseSettings(mouse_settings);
}
}
if (section == std::string(language_prefs::kGeneralSectionName) &&
name == std::string(language_prefs::kPreloadEnginesConfigName)) {
- input_method_manager_->EnableInputMethods(split_values);
+ input_method_manager_->ReplaceEnabledInputMethods(split_values);
return;
}
}
}
void Preferences::UpdateAutoRepeatRate() {
- // Avoid setting repeat rate on desktop dev environment.
- if (!base::SysInfo::IsRunningOnChromeOS())
- return;
-
input_method::AutoRepeatRate rate;
rate.initial_delay_in_ms = xkb_auto_repeat_delay_pref_.GetValue();
rate.repeat_interval_in_ms = xkb_auto_repeat_interval_pref_.GetValue();
DCHECK(rate.initial_delay_in_ms > 0);
DCHECK(rate.repeat_interval_in_ms > 0);
- input_method::XKeyboard::SetAutoRepeatRate(rate);
+ input_method::InputMethodManager::Get()->GetXKeyboard()
+ ->SetAutoRepeatRate(rate);
}
void Preferences::OnTouchHudProjectionToggled(bool enabled) {
if (touch_hud_projection_enabled_.GetValue() == enabled)
return;
-
+ if (!user_->is_active())
+ return;
touch_hud_projection_enabled_.SetValue(enabled);
}
+void Preferences::ActiveUserChanged(const User* active_user) {
+ if (active_user != user_)
+ return;
+ ApplyPreferences(REASON_ACTIVE_USER_CHANGED, "");
+}
+
} // namespace chromeos