// Copyright 2017 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 "ash/touch/touch_devices_controller.h" #include #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/root_window_controller.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" #include "ash/shell_delegate.h" #include "base/bind.h" #include "base/command_line.h" #include "base/metrics/histogram_macros.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "ui/ozone/public/input_controller.h" #include "ui/ozone/public/ozone_platform.h" namespace ash { namespace { PrefService* GetActivePrefService() { return Shell::Get()->session_controller()->GetActivePrefService(); } } // namespace // static void TouchDevicesController::RegisterProfilePrefs(PrefRegistrySimple* registry, bool for_test) { registry->RegisterBooleanPref( prefs::kTapDraggingEnabled, false, user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF); registry->RegisterBooleanPref(prefs::kTouchpadEnabled, true); registry->RegisterBooleanPref(prefs::kTouchscreenEnabled, true); if (for_test) { registry->RegisterBooleanPref( prefs::kNaturalScroll, base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kNaturalScrollDefault), user_prefs::PrefRegistrySyncable::SYNCABLE_OS_PRIORITY_PREF); } } TouchDevicesController::TouchDevicesController() { Shell::Get()->session_controller()->AddObserver(this); } TouchDevicesController::~TouchDevicesController() { Shell::Get()->session_controller()->RemoveObserver(this); } void TouchDevicesController::ToggleTouchpad() { PrefService* prefs = GetActivePrefService(); if (!prefs) return; const bool touchpad_enabled = prefs->GetBoolean(prefs::kTouchpadEnabled); prefs->SetBoolean(prefs::kTouchpadEnabled, !touchpad_enabled); } bool TouchDevicesController::GetTouchpadEnabled( TouchDeviceEnabledSource source) const { if (source == TouchDeviceEnabledSource::GLOBAL) return global_touchpad_enabled_; PrefService* prefs = GetActivePrefService(); return prefs && prefs->GetBoolean(prefs::kTouchpadEnabled); } void TouchDevicesController::SetTouchpadEnabled( bool enabled, TouchDeviceEnabledSource source) { if (source == TouchDeviceEnabledSource::GLOBAL) { global_touchpad_enabled_ = enabled; UpdateTouchpadEnabled(); return; } PrefService* prefs = GetActivePrefService(); if (!prefs) return; prefs->SetBoolean(prefs::kTouchpadEnabled, enabled); } bool TouchDevicesController::GetTouchscreenEnabled( TouchDeviceEnabledSource source) const { if (source == TouchDeviceEnabledSource::GLOBAL) return global_touchscreen_enabled_; PrefService* prefs = GetActivePrefService(); return prefs && prefs->GetBoolean(prefs::kTouchscreenEnabled); } void TouchDevicesController::SetTouchscreenEnabled( bool enabled, TouchDeviceEnabledSource source) { if (source == TouchDeviceEnabledSource::GLOBAL) { global_touchscreen_enabled_ = enabled; // Explicitly call |UpdateTouchscreenEnabled()| to update the actual // touchscreen state from multiple sources. UpdateTouchscreenEnabled(); return; } PrefService* prefs = GetActivePrefService(); if (!prefs) return; prefs->SetBoolean(prefs::kTouchscreenEnabled, enabled); } void TouchDevicesController::OnUserSessionAdded(const AccountId& account_id) { uma_record_callback_ = base::BindOnce([](PrefService* prefs) { UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Started", prefs->GetBoolean(prefs::kTapDraggingEnabled)); }); } void TouchDevicesController::OnSigninScreenPrefServiceInitialized( PrefService* prefs) { ObservePrefs(prefs); } void TouchDevicesController::OnActiveUserPrefServiceChanged( PrefService* prefs) { if (uma_record_callback_) std::move(uma_record_callback_).Run(prefs); ObservePrefs(prefs); } void TouchDevicesController::ObservePrefs(PrefService* prefs) { // Watch for pref updates. pref_change_registrar_ = std::make_unique(); pref_change_registrar_->Init(prefs); pref_change_registrar_->Add( prefs::kTapDraggingEnabled, base::BindRepeating(&TouchDevicesController::UpdateTapDraggingEnabled, base::Unretained(this))); pref_change_registrar_->Add( prefs::kTouchpadEnabled, base::BindRepeating(&TouchDevicesController::UpdateTouchpadEnabled, base::Unretained(this))); pref_change_registrar_->Add( prefs::kTouchscreenEnabled, base::BindRepeating(&TouchDevicesController::UpdateTouchscreenEnabled, base::Unretained(this))); // Load current state. UpdateTapDraggingEnabled(); UpdateTouchpadEnabled(); UpdateTouchscreenEnabled(); } void TouchDevicesController::UpdateTapDraggingEnabled() { PrefService* prefs = GetActivePrefService(); const bool enabled = prefs->GetBoolean(prefs::kTapDraggingEnabled); if (tap_dragging_enabled_ == enabled) return; tap_dragging_enabled_ = enabled; UMA_HISTOGRAM_BOOLEAN("Touchpad.TapDragging.Changed", enabled); ui::OzonePlatform::GetInstance()->GetInputController()->SetTapDragging( enabled); } void TouchDevicesController::UpdateTouchpadEnabled() { ui::OzonePlatform::GetInstance() ->GetInputController() ->SetInternalTouchpadEnabled( GetTouchpadEnabled(TouchDeviceEnabledSource::GLOBAL) && GetTouchpadEnabled(TouchDeviceEnabledSource::USER_PREF)); } void TouchDevicesController::UpdateTouchscreenEnabled() { ui::OzonePlatform::GetInstance() ->GetInputController() ->SetTouchscreensEnabled( GetTouchscreenEnabled(TouchDeviceEnabledSource::GLOBAL) && GetTouchscreenEnabled(TouchDeviceEnabledSource::USER_PREF)); } } // namespace ash