Commit 4c8baedb authored by warx's avatar warx Committed by Commit bot

Enabled/disable touch screen in TabletPowerButtonController

By exposing several apis in input_device_settings.h and add new local pref for TouchScreenEnabled, we can disable touch screen events when backlights are forced off so that no screen UI events can be triggered and enable touch screen when stopping backlights forced off is called properly.

BUG=655388
BUG=633304
TEST=manual test on device, and add test coverage.
also test that this added behavior is compatible with toggle touchscreen shortcut
The shortcut induced in https://codereview.chromium.org/2467023004 is per user pref, backlights-forced-off related touch screen status is per device pref. The final hardware touchscreen status is determined by the rule: enabled_in_local_state && enabled_in_user_pref

Review-Url: https://codereview.chromium.org/2533373002
Cr-Commit-Position: refs/heads/master@{#436177}
parent 6c406fd0
...@@ -128,7 +128,11 @@ void HandleToggleTouchpad() { ...@@ -128,7 +128,11 @@ void HandleToggleTouchpad() {
void HandleToggleTouchscreen() { void HandleToggleTouchscreen() {
base::RecordAction(base::UserMetricsAction("Accel_Toggle_Touchscreen")); base::RecordAction(base::UserMetricsAction("Accel_Toggle_Touchscreen"));
ash::WmShell::Get()->delegate()->ToggleTouchscreen(); ShellDelegate* delegate = WmShell::Get()->delegate();
delegate->SetTouchscreenEnabledInPrefs(
!delegate->IsTouchscreenEnabledInPrefs(false /* use_local_state */),
false /* use_local_state */);
delegate->UpdateTouchscreenStatusFromPrefs();
} }
void HandleToggleTouchView() { void HandleToggleTouchView() {
......
...@@ -133,9 +133,21 @@ class ASH_EXPORT ShellDelegate { ...@@ -133,9 +133,21 @@ class ASH_EXPORT ShellDelegate {
virtual gfx::Image GetDeprecatedAcceleratorImage() const = 0; virtual gfx::Image GetDeprecatedAcceleratorImage() const = 0;
// Toggles the status of the touchpad / touchscreen on or off. // If |use_local_state| is true, returns the touchscreen status from local
// state, otherwise from user prefs.
virtual bool IsTouchscreenEnabledInPrefs(bool use_local_state) const = 0;
// Sets the status of touchscreen to |enabled| in prefs. If |use_local_state|,
// pref is set in local state, otherwise in user prefs.
virtual void SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) = 0;
// Updates the enabled/disabled status of the touchscreen from prefs. Enabled
// if both local state and user prefs are enabled, otherwise disabled.
virtual void UpdateTouchscreenStatusFromPrefs() = 0;
// Toggles the status of touchpad between enabled and disabled.
virtual void ToggleTouchpad() {} virtual void ToggleTouchpad() {}
virtual void ToggleTouchscreen() {}
}; };
} // namespace ash } // namespace ash
......
...@@ -231,4 +231,18 @@ gfx::Image ShellDelegateMus::GetDeprecatedAcceleratorImage() const { ...@@ -231,4 +231,18 @@ gfx::Image ShellDelegateMus::GetDeprecatedAcceleratorImage() const {
return gfx::Image(); return gfx::Image();
} }
bool ShellDelegateMus::IsTouchscreenEnabledInPrefs(bool use_local_state) const {
NOTIMPLEMENTED();
return true;
}
void ShellDelegateMus::SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) {
NOTIMPLEMENTED();
}
void ShellDelegateMus::UpdateTouchscreenStatusFromPrefs() {
NOTIMPLEMENTED();
}
} // namespace ash } // namespace ash
...@@ -47,6 +47,10 @@ class ShellDelegateMus : public ShellDelegate { ...@@ -47,6 +47,10 @@ class ShellDelegateMus : public ShellDelegate {
GPUSupport* CreateGPUSupport() override; GPUSupport* CreateGPUSupport() override;
base::string16 GetProductName() const override; base::string16 GetProductName() const override;
gfx::Image GetDeprecatedAcceleratorImage() const override; gfx::Image GetDeprecatedAcceleratorImage() const override;
bool IsTouchscreenEnabledInPrefs(bool use_local_state) const override;
void SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) override;
void UpdateTouchscreenStatusFromPrefs() override;
private: private:
service_manager::Connector* connector_; service_manager::Connector* connector_;
......
...@@ -265,5 +265,15 @@ gfx::Image ShellDelegateImpl::GetDeprecatedAcceleratorImage() const { ...@@ -265,5 +265,15 @@ gfx::Image ShellDelegateImpl::GetDeprecatedAcceleratorImage() const {
return gfx::Image(); return gfx::Image();
} }
bool ShellDelegateImpl::IsTouchscreenEnabledInPrefs(
bool use_local_state) const {
return true;
}
void ShellDelegateImpl::SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) {}
void ShellDelegateImpl::UpdateTouchscreenStatusFromPrefs() {}
} // namespace shell } // namespace shell
} // namespace ash } // namespace ash
...@@ -53,6 +53,10 @@ class ShellDelegateImpl : public ShellDelegate { ...@@ -53,6 +53,10 @@ class ShellDelegateImpl : public ShellDelegate {
GPUSupport* CreateGPUSupport() override; GPUSupport* CreateGPUSupport() override;
base::string16 GetProductName() const override; base::string16 GetProductName() const override;
gfx::Image GetDeprecatedAcceleratorImage() const override; gfx::Image GetDeprecatedAcceleratorImage() const override;
bool IsTouchscreenEnabledInPrefs(bool use_local_state) const override;
void SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) override;
void UpdateTouchscreenStatusFromPrefs() override;
private: private:
ShelfDelegate* shelf_delegate_; ShelfDelegate* shelf_delegate_;
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include "ash/common/accessibility_delegate.h" #include "ash/common/accessibility_delegate.h"
#include "ash/common/session/session_state_delegate.h" #include "ash/common/session/session_state_delegate.h"
#include "ash/common/shell_delegate.h"
#include "ash/common/wm/maximize_mode/maximize_mode_controller.h" #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
#include "ash/common/wm_shell.h" #include "ash/common/wm_shell.h"
#include "ash/shell.h" #include "ash/shell.h"
...@@ -96,24 +97,27 @@ void TabletPowerButtonController::OnPowerButtonEvent( ...@@ -96,24 +97,27 @@ void TabletPowerButtonController::OnPowerButtonEvent(
// backlight has been turned back on before seeing the power button events // backlight has been turned back on before seeing the power button events
// that woke the system. Ignore events just after resuming to ensure that we // that woke the system. Ignore events just after resuming to ensure that we
// don't turn the screen off in response to the events. // don't turn the screen off in response to the events.
//
// TODO(warx): pressing power button should also StartShutdownTimer() in this
// case. Reorganize the code to support that.
if (timestamp - last_resume_time_ <= if (timestamp - last_resume_time_ <=
base::TimeDelta::FromMilliseconds(kIgnorePowerButtonAfterResumeMs)) { base::TimeDelta::FromMilliseconds(kIgnorePowerButtonAfterResumeMs)) {
// If backlights are forced off, stop forcing off because resuming system // If backlights are forced off, stop forcing off because resuming system
// doesn't handle this. // doesn't handle this.
if (down && backlights_forced_off_) if (down && backlights_forced_off_)
SetBacklightsForcedOff(false); SetDisplayForcedOff(false);
return; return;
} }
if (down) { if (down) {
screen_off_when_power_button_down_ = brightness_level_is_zero_; screen_off_when_power_button_down_ = brightness_level_is_zero_;
SetBacklightsForcedOff(false); SetDisplayForcedOff(false);
StartShutdownTimer(); StartShutdownTimer();
} else { } else {
if (shutdown_timer_.IsRunning()) { if (shutdown_timer_.IsRunning()) {
shutdown_timer_.Stop(); shutdown_timer_.Stop();
if (!screen_off_when_power_button_down_) { if (!screen_off_when_power_button_down_) {
SetBacklightsForcedOff(true); SetDisplayForcedOff(true);
LockScreenIfRequired(); LockScreenIfRequired();
} }
} }
...@@ -149,7 +153,7 @@ void TabletPowerButtonController::OnKeyEvent(ui::KeyEvent* event) { ...@@ -149,7 +153,7 @@ void TabletPowerButtonController::OnKeyEvent(ui::KeyEvent* event) {
return; return;
if (!IsTabletModeActive() && backlights_forced_off_) if (!IsTabletModeActive() && backlights_forced_off_)
SetBacklightsForcedOff(false); SetDisplayForcedOff(false);
} }
void TabletPowerButtonController::OnMouseEvent(ui::MouseEvent* event) { void TabletPowerButtonController::OnMouseEvent(ui::MouseEvent* event) {
...@@ -161,13 +165,13 @@ void TabletPowerButtonController::OnMouseEvent(ui::MouseEvent* event) { ...@@ -161,13 +165,13 @@ void TabletPowerButtonController::OnMouseEvent(ui::MouseEvent* event) {
} }
if (!IsTabletModeActive() && backlights_forced_off_) if (!IsTabletModeActive() && backlights_forced_off_)
SetBacklightsForcedOff(false); SetDisplayForcedOff(false);
} }
void TabletPowerButtonController::OnStylusStateChanged(ui::StylusState state) { void TabletPowerButtonController::OnStylusStateChanged(ui::StylusState state) {
if (IsTabletModeSupported() && state == ui::StylusState::REMOVED && if (IsTabletModeSupported() && state == ui::StylusState::REMOVED &&
backlights_forced_off_) { backlights_forced_off_) {
SetBacklightsForcedOff(false); SetDisplayForcedOff(false);
} }
} }
...@@ -177,15 +181,21 @@ void TabletPowerButtonController::SetTickClockForTesting( ...@@ -177,15 +181,21 @@ void TabletPowerButtonController::SetTickClockForTesting(
tick_clock_ = std::move(tick_clock); tick_clock_ = std::move(tick_clock);
} }
void TabletPowerButtonController::SetBacklightsForcedOff(bool forced_off) { void TabletPowerButtonController::SetDisplayForcedOff(bool forced_off) {
if (backlights_forced_off_ == forced_off) if (backlights_forced_off_ == forced_off)
return; return;
// Set the display and keyboard backlights (if present) to |forced_off|.
chromeos::DBusThreadManager::Get() chromeos::DBusThreadManager::Get()
->GetPowerManagerClient() ->GetPowerManagerClient()
->SetBacklightsForcedOff(forced_off); ->SetBacklightsForcedOff(forced_off);
backlights_forced_off_ = forced_off; backlights_forced_off_ = forced_off;
ShellDelegate* delegate = WmShell::Get()->delegate();
delegate->SetTouchscreenEnabledInPrefs(!forced_off,
true /* use_local_state */);
delegate->UpdateTouchscreenStatusFromPrefs();
// Send an a11y alert. // Send an a11y alert.
WmShell::Get()->accessibility_delegate()->TriggerAccessibilityAlert( WmShell::Get()->accessibility_delegate()->TriggerAccessibilityAlert(
forced_off ? A11Y_ALERT_SCREEN_OFF : A11Y_ALERT_SCREEN_ON); forced_off ? A11Y_ALERT_SCREEN_OFF : A11Y_ALERT_SCREEN_ON);
......
...@@ -72,8 +72,10 @@ class ASH_EXPORT TabletPowerButtonController ...@@ -72,8 +72,10 @@ class ASH_EXPORT TabletPowerButtonController
void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock); void SetTickClockForTesting(std::unique_ptr<base::TickClock> tick_clock);
private: private:
// Set backlights to |forced_off| if they aren't already. // Updates the power manager's backlights-forced-off state and enables or
void SetBacklightsForcedOff(bool forced_off); // disables the touchscreen. No-op if |backlights_forced_off_| already equals
// |forced_off|.
void SetDisplayForcedOff(bool forced_off);
// Sends a request to powerd to get the backlights forced off state so that // Sends a request to powerd to get the backlights forced off state so that
// |backlights_forced_off_| can be initialized. // |backlights_forced_off_| can be initialized.
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "ash/shell.h" #include "ash/shell.h"
#include "ash/test/ash_test_base.h" #include "ash/test/ash_test_base.h"
#include "ash/test/lock_state_controller_test_api.h" #include "ash/test/lock_state_controller_test_api.h"
#include "ash/test/test_shell_delegate.h"
#include "ash/wm/lock_state_controller.h" #include "ash/wm/lock_state_controller.h"
#include "ash/wm/power_button_controller.h" #include "ash/wm/power_button_controller.h"
#include "base/command_line.h" #include "base/command_line.h"
...@@ -64,6 +65,8 @@ class TabletPowerButtonControllerTest : public AshTestBase { ...@@ -64,6 +65,8 @@ class TabletPowerButtonControllerTest : public AshTestBase {
tick_clock_ = new base::SimpleTestTickClock; tick_clock_ = new base::SimpleTestTickClock;
tablet_controller_->SetTickClockForTesting( tablet_controller_->SetTickClockForTesting(
std::unique_ptr<base::TickClock>(tick_clock_)); std::unique_ptr<base::TickClock>(tick_clock_));
shell_delegate_ =
static_cast<TestShellDelegate*>(WmShell::Get()->delegate());
generator_ = &AshTestBase::GetEventGenerator(); generator_ = &AshTestBase::GetEventGenerator();
power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false); power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false);
EXPECT_FALSE(GetBacklightsForcedOff()); EXPECT_FALSE(GetBacklightsForcedOff());
...@@ -119,6 +122,7 @@ class TabletPowerButtonControllerTest : public AshTestBase { ...@@ -119,6 +122,7 @@ class TabletPowerButtonControllerTest : public AshTestBase {
TabletPowerButtonController* tablet_controller_; // Not owned. TabletPowerButtonController* tablet_controller_; // Not owned.
std::unique_ptr<TabletPowerButtonController::TestApi> test_api_; std::unique_ptr<TabletPowerButtonController::TestApi> test_api_;
base::SimpleTestTickClock* tick_clock_; // Not owned. base::SimpleTestTickClock* tick_clock_; // Not owned.
TestShellDelegate* shell_delegate_; // Not owned.
ui::test::EventGenerator* generator_ = nullptr; ui::test::EventGenerator* generator_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(TabletPowerButtonControllerTest); DISALLOW_COPY_AND_ASSIGN(TabletPowerButtonControllerTest);
...@@ -356,5 +360,43 @@ TEST_F(TabletPowerButtonControllerTest, IgnorePowerOnKeyEvent) { ...@@ -356,5 +360,43 @@ TEST_F(TabletPowerButtonControllerTest, IgnorePowerOnKeyEvent) {
EXPECT_EQ(1, power_manager_client_->num_set_backlights_forced_off_calls()); EXPECT_EQ(1, power_manager_client_->num_set_backlights_forced_off_calls());
} }
// Tests that under (1) tablet power button pressed/released, (2) keyboard/mouse
// events on laptop mode when screen is off, requesting/stopping backlights
// forced off should also set corresponding touch screen state in local pref.
TEST_F(TabletPowerButtonControllerTest, TouchScreenState) {
// Tests tablet power button.
EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
PressPowerButton();
ReleasePowerButton();
power_manager_client_->SendBrightnessChanged(0, false);
EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
PressPowerButton();
power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false);
ReleasePowerButton();
EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
EnableMaximizeMode(false);
// KeyEvent on laptop mode when screen is off.
PressPowerButton();
ReleasePowerButton();
power_manager_client_->SendBrightnessChanged(0, false);
EXPECT_TRUE(GetBacklightsForcedOff());
EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
generator_->PressKey(ui::VKEY_L, ui::EF_NONE);
power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false);
EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
// MouseEvent on laptop mode when screen is off.
PressPowerButton();
ReleasePowerButton();
power_manager_client_->SendBrightnessChanged(0, false);
EXPECT_TRUE(GetBacklightsForcedOff());
EXPECT_FALSE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
generator_->MoveMouseBy(1, 1);
power_manager_client_->SendBrightnessChanged(kNonZeroBrightness, false);
EXPECT_TRUE(shell_delegate_->IsTouchscreenEnabledInPrefs(true));
}
} // namespace test } // namespace test
} // namespace ash } // namespace ash
...@@ -86,6 +86,7 @@ TestShellDelegate::TestShellDelegate() ...@@ -86,6 +86,7 @@ TestShellDelegate::TestShellDelegate()
: num_exit_requests_(0), : num_exit_requests_(0),
multi_profiles_enabled_(false), multi_profiles_enabled_(false),
force_maximize_on_first_run_(false), force_maximize_on_first_run_(false),
touchscreen_enabled_in_local_pref_(true),
app_list_presenter_delegate_factory_(new AppListPresenterDelegateFactory( app_list_presenter_delegate_factory_(new AppListPresenterDelegateFactory(
base::WrapUnique(new AppListViewDelegateFactoryImpl))) {} base::WrapUnique(new AppListViewDelegateFactoryImpl))) {}
...@@ -184,6 +185,19 @@ gfx::Image TestShellDelegate::GetDeprecatedAcceleratorImage() const { ...@@ -184,6 +185,19 @@ gfx::Image TestShellDelegate::GetDeprecatedAcceleratorImage() const {
return gfx::Image(); return gfx::Image();
} }
bool TestShellDelegate::IsTouchscreenEnabledInPrefs(
bool use_local_state) const {
return use_local_state ? touchscreen_enabled_in_local_pref_ : true;
}
void TestShellDelegate::SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) {
if (use_local_state)
touchscreen_enabled_in_local_pref_ = enabled;
}
void TestShellDelegate::UpdateTouchscreenStatusFromPrefs() {}
void TestShellDelegate::SetMediaCaptureState(MediaCaptureState state) { void TestShellDelegate::SetMediaCaptureState(MediaCaptureState state) {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
static_cast<MediaDelegateImpl*>(WmShell::Get()->media_delegate()) static_cast<MediaDelegateImpl*>(WmShell::Get()->media_delegate())
......
...@@ -60,6 +60,11 @@ class TestShellDelegate : public ShellDelegate { ...@@ -60,6 +60,11 @@ class TestShellDelegate : public ShellDelegate {
base::string16 GetProductName() const override; base::string16 GetProductName() const override;
gfx::Image GetDeprecatedAcceleratorImage() const override; gfx::Image GetDeprecatedAcceleratorImage() const override;
bool IsTouchscreenEnabledInPrefs(bool use_local_state) const override;
void SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) override;
void UpdateTouchscreenStatusFromPrefs() override;
int num_exit_requests() const { return num_exit_requests_; } int num_exit_requests() const { return num_exit_requests_; }
app_list::AppListPresenterImpl* app_list_presenter() { app_list::AppListPresenterImpl* app_list_presenter() {
...@@ -75,6 +80,7 @@ class TestShellDelegate : public ShellDelegate { ...@@ -75,6 +80,7 @@ class TestShellDelegate : public ShellDelegate {
int num_exit_requests_; int num_exit_requests_;
bool multi_profiles_enabled_; bool multi_profiles_enabled_;
bool force_maximize_on_first_run_; bool force_maximize_on_first_run_;
bool touchscreen_enabled_in_local_pref_;
std::unique_ptr<app_list::AppListPresenterDelegateFactory> std::unique_ptr<app_list::AppListPresenterDelegateFactory>
app_list_presenter_delegate_factory_; app_list_presenter_delegate_factory_;
......
...@@ -756,6 +756,8 @@ void ChromeBrowserMainPartsChromeos::PreBrowserStart() { ...@@ -756,6 +756,8 @@ void ChromeBrowserMainPartsChromeos::PreBrowserStart() {
void ChromeBrowserMainPartsChromeos::PostBrowserStart() { void ChromeBrowserMainPartsChromeos::PostBrowserStart() {
if (!chrome::IsRunningInMash()) { if (!chrome::IsRunningInMash()) {
system::InputDeviceSettings::Get()->UpdateTouchDevicesStatusFromPrefs();
// These are dependent on the ash::Shell singleton already having been // These are dependent on the ash::Shell singleton already having been
// initialized. Consequently, these cannot be used when running as a mus // initialized. Consequently, these cannot be used when running as a mus
// client. // client.
......
...@@ -707,8 +707,7 @@ void Preferences::ApplyPreferences(ApplyReason reason, ...@@ -707,8 +707,7 @@ void Preferences::ApplyPreferences(ApplyReason reason,
prefs::kUse24HourClock, value); prefs::kUse24HourClock, value);
} }
system::InputDeviceSettings::Get() system::InputDeviceSettings::Get()->UpdateTouchDevicesStatusFromPrefs();
->UpdateTouchDevicesStatusFromActiveProfilePrefs();
} }
void Preferences::OnIsSyncingChanged() { void Preferences::OnIsSyncingChanged() {
......
...@@ -233,43 +233,70 @@ bool InputDeviceSettings::ForceKeyboardDrivenUINavigation() { ...@@ -233,43 +233,70 @@ bool InputDeviceSettings::ForceKeyboardDrivenUINavigation() {
return false; return false;
} }
// static
void InputDeviceSettings::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(::prefs::kTouchscreenEnabledLocal, true);
}
// static // static
void InputDeviceSettings::RegisterProfilePrefs(PrefRegistrySimple* registry) { void InputDeviceSettings::RegisterProfilePrefs(PrefRegistrySimple* registry) {
registry->RegisterBooleanPref(::prefs::kTouchScreenEnabled, true); registry->RegisterBooleanPref(::prefs::kTouchscreenEnabled, true);
registry->RegisterBooleanPref(::prefs::kTouchPadEnabled, true); registry->RegisterBooleanPref(::prefs::kTouchpadEnabled, true);
} }
void InputDeviceSettings::UpdateTouchDevicesStatusFromActiveProfilePrefs() { void InputDeviceSettings::UpdateTouchDevicesStatusFromPrefs() {
UpdateTouchscreenStatusFromPrefs();
PrefService* user_prefs = GetActiveProfilePrefs(); PrefService* user_prefs = GetActiveProfilePrefs();
if (!user_prefs) if (!user_prefs)
return; return;
const bool touch_screen_status = const bool touchpad_status =
user_prefs->HasPrefPath(::prefs::kTouchScreenEnabled) user_prefs->HasPrefPath(::prefs::kTouchpadEnabled)
? user_prefs->GetBoolean(::prefs::kTouchScreenEnabled) ? user_prefs->GetBoolean(::prefs::kTouchpadEnabled)
: true; : true;
SetInternalTouchpadEnabled(touchpad_status);
const bool touch_pad_status = }
user_prefs->HasPrefPath(::prefs::kTouchPadEnabled)
? user_prefs->GetBoolean(::prefs::kTouchPadEnabled) bool InputDeviceSettings::IsTouchscreenEnabledInPrefs(
: true; bool use_local_state) const {
if (use_local_state) {
SetTouchscreensEnabled(touch_screen_status); PrefService* local_state = g_browser_process->local_state();
SetInternalTouchpadEnabled(touch_pad_status); DCHECK(local_state);
return local_state->HasPrefPath(::prefs::kTouchscreenEnabledLocal)
? local_state->GetBoolean(::prefs::kTouchscreenEnabledLocal)
: true;
} else {
PrefService* user_prefs = GetActiveProfilePrefs();
if (!user_prefs)
return true;
return user_prefs->HasPrefPath(::prefs::kTouchscreenEnabled)
? user_prefs->GetBoolean(::prefs::kTouchscreenEnabled)
: true;
}
} }
void InputDeviceSettings::ToggleTouchscreen() { void InputDeviceSettings::SetTouchscreenEnabledInPrefs(bool enabled,
PrefService* user_prefs = GetActiveProfilePrefs(); bool use_local_state) {
if (!user_prefs) if (use_local_state) {
return; PrefService* local_state = g_browser_process->local_state();
DCHECK(local_state);
local_state->SetBoolean(::prefs::kTouchscreenEnabledLocal, enabled);
} else {
PrefService* user_prefs = GetActiveProfilePrefs();
if (!user_prefs)
return;
const bool touch_screen_status = user_prefs->SetBoolean(::prefs::kTouchscreenEnabled, enabled);
user_prefs->HasPrefPath(::prefs::kTouchScreenEnabled) }
? user_prefs->GetBoolean(::prefs::kTouchScreenEnabled) }
: true;
user_prefs->SetBoolean(::prefs::kTouchScreenEnabled, !touch_screen_status); void InputDeviceSettings::UpdateTouchscreenStatusFromPrefs() {
SetTouchscreensEnabled(!touch_screen_status); bool enabled_in_local_state = IsTouchscreenEnabledInPrefs(true);
bool enabled_in_user_prefs = IsTouchscreenEnabledInPrefs(false);
SetTouchscreensEnabled(enabled_in_local_state && enabled_in_user_prefs);
} }
void InputDeviceSettings::ToggleTouchpad() { void InputDeviceSettings::ToggleTouchpad() {
...@@ -277,13 +304,13 @@ void InputDeviceSettings::ToggleTouchpad() { ...@@ -277,13 +304,13 @@ void InputDeviceSettings::ToggleTouchpad() {
if (!user_prefs) if (!user_prefs)
return; return;
const bool touch_pad_status = const bool touchpad_status =
user_prefs->HasPrefPath(::prefs::kTouchPadEnabled) user_prefs->HasPrefPath(::prefs::kTouchpadEnabled)
? user_prefs->GetBoolean(::prefs::kTouchPadEnabled) ? user_prefs->GetBoolean(::prefs::kTouchpadEnabled)
: true; : true;
user_prefs->SetBoolean(::prefs::kTouchPadEnabled, !touch_pad_status); user_prefs->SetBoolean(::prefs::kTouchpadEnabled, !touchpad_status);
SetInternalTouchpadEnabled(!touch_pad_status); SetInternalTouchpadEnabled(!touchpad_status);
} }
} // namespace system } // namespace system
......
...@@ -174,16 +174,29 @@ class CHROMEOS_EXPORT InputDeviceSettings { ...@@ -174,16 +174,29 @@ class CHROMEOS_EXPORT InputDeviceSettings {
// where other input devices like mouse are absent. // where other input devices like mouse are absent.
static bool ForceKeyboardDrivenUINavigation(); static bool ForceKeyboardDrivenUINavigation();
// Registers profile pref names for touchpad and touch screen statuses. // Registers local state pref names for touchscreen status.
static void RegisterPrefs(PrefRegistrySimple* registry);
// Registers profile pref names for touchpad and touchscreen statuses.
static void RegisterProfilePrefs(PrefRegistrySimple* registry); static void RegisterProfilePrefs(PrefRegistrySimple* registry);
// Updates the on/off status of the touchscreen/touchpad from the active // Updates the enabled/disabled status of the touchscreen/touchpad from the
// user's preferences. // preferences.
void UpdateTouchDevicesStatusFromActiveProfilePrefs(); void UpdateTouchDevicesStatusFromPrefs();
// If |use_local_state| is true, returns the touchscreen status from local
// state, otherwise from user prefs.
bool IsTouchscreenEnabledInPrefs(bool use_local_state) const;
// Sets the status of touchscreen to |enabled| in prefs. If |use_local_state|,
// pref is set in local state, otherwise in user pref.
void SetTouchscreenEnabledInPrefs(bool enabled, bool use_local_state);
// Updates the enabled/disabled status of the touchscreen from prefs. Enabled
// if both local state and user prefs are enabled, otherwise disabled.
void UpdateTouchscreenStatusFromPrefs();
// Toggles the status of Touchscreen/Touchpad on or off and updates the local // Toggles the status of touchpad between enabled and disabled.
// prefs.
void ToggleTouchscreen();
void ToggleTouchpad(); void ToggleTouchpad();
// Calls |callback|, possibly asynchronously, after determining if a touchpad // Calls |callback|, possibly asynchronously, after determining if a touchpad
......
...@@ -429,6 +429,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) { ...@@ -429,6 +429,7 @@ void RegisterLocalState(PrefRegistrySimple* registry) {
chromeos::SigninScreenHandler::RegisterPrefs(registry); chromeos::SigninScreenHandler::RegisterPrefs(registry);
chromeos::StartupUtils::RegisterPrefs(registry); chromeos::StartupUtils::RegisterPrefs(registry);
chromeos::system::AutomaticRebootManager::RegisterPrefs(registry); chromeos::system::AutomaticRebootManager::RegisterPrefs(registry);
chromeos::system::InputDeviceSettings::RegisterPrefs(registry);
chromeos::TimeZoneResolver::RegisterPrefs(registry); chromeos::TimeZoneResolver::RegisterPrefs(registry);
chromeos::UserImageManager::RegisterPrefs(registry); chromeos::UserImageManager::RegisterPrefs(registry);
chromeos::UserSessionManager::RegisterPrefs(registry); chromeos::UserSessionManager::RegisterPrefs(registry);
...@@ -707,8 +708,8 @@ void RegisterLoginProfilePrefs(user_prefs::PrefRegistrySyncable* registry) { ...@@ -707,8 +708,8 @@ void RegisterLoginProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state) { void MigrateObsoleteBrowserPrefs(Profile* profile, PrefService* local_state) {
#if defined(OS_CHROMEOS) #if defined(OS_CHROMEOS)
// Added 11/2016 // Added 11/2016
local_state->ClearPref(prefs::kTouchScreenEnabled); local_state->ClearPref(prefs::kTouchscreenEnabled);
local_state->ClearPref(prefs::kTouchPadEnabled); local_state->ClearPref(prefs::kTouchpadEnabled);
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
} }
......
...@@ -500,12 +500,25 @@ gfx::Image ChromeShellDelegate::GetDeprecatedAcceleratorImage() const { ...@@ -500,12 +500,25 @@ gfx::Image ChromeShellDelegate::GetDeprecatedAcceleratorImage() const {
IDR_BLUETOOTH_KEYBOARD); IDR_BLUETOOTH_KEYBOARD);
} }
void ChromeShellDelegate::ToggleTouchpad() { bool ChromeShellDelegate::IsTouchscreenEnabledInPrefs(
chromeos::system::InputDeviceSettings::Get()->ToggleTouchpad(); bool use_local_state) const {
return chromeos::system::InputDeviceSettings::Get()
->IsTouchscreenEnabledInPrefs(use_local_state);
}
void ChromeShellDelegate::SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) {
chromeos::system::InputDeviceSettings::Get()->SetTouchscreenEnabledInPrefs(
enabled, use_local_state);
} }
void ChromeShellDelegate::ToggleTouchscreen() { void ChromeShellDelegate::UpdateTouchscreenStatusFromPrefs() {
chromeos::system::InputDeviceSettings::Get()->ToggleTouchscreen(); chromeos::system::InputDeviceSettings::Get()
->UpdateTouchscreenStatusFromPrefs();
}
void ChromeShellDelegate::ToggleTouchpad() {
chromeos::system::InputDeviceSettings::Get()->ToggleTouchpad();
} }
keyboard::KeyboardUI* ChromeShellDelegate::CreateKeyboardUI() { keyboard::KeyboardUI* ChromeShellDelegate::CreateKeyboardUI() {
......
...@@ -56,8 +56,11 @@ class ChromeShellDelegate : public ash::ShellDelegate, ...@@ -56,8 +56,11 @@ class ChromeShellDelegate : public ash::ShellDelegate,
base::string16 GetProductName() const override; base::string16 GetProductName() const override;
void OpenKeyboardShortcutHelpPage() const override; void OpenKeyboardShortcutHelpPage() const override;
gfx::Image GetDeprecatedAcceleratorImage() const override; gfx::Image GetDeprecatedAcceleratorImage() const override;
bool IsTouchscreenEnabledInPrefs(bool use_local_state) const override;
void SetTouchscreenEnabledInPrefs(bool enabled,
bool use_local_state) override;
void UpdateTouchscreenStatusFromPrefs() override;
void ToggleTouchpad() override; void ToggleTouchpad() override;
void ToggleTouchscreen() override;
// content::NotificationObserver override: // content::NotificationObserver override:
void Observe(int type, void Observe(int type,
......
...@@ -844,9 +844,9 @@ const char kFileSystemProviderMounted[] = "file_system_provider.mounted"; ...@@ -844,9 +844,9 @@ const char kFileSystemProviderMounted[] = "file_system_provider.mounted";
// A boolean pref set to true if the virtual keyboard should be enabled. // A boolean pref set to true if the virtual keyboard should be enabled.
const char kTouchVirtualKeyboardEnabled[] = "ui.touch_virtual_keyboard_enabled"; const char kTouchVirtualKeyboardEnabled[] = "ui.touch_virtual_keyboard_enabled";
// Boolean prefs for the status of the touch screen and the touchpad. // Boolean prefs for the status of the touchscreen and the touchpad.
const char kTouchScreenEnabled[] = "events.touch_screen.enabled"; const char kTouchscreenEnabled[] = "events.touch_screen.enabled";
const char kTouchPadEnabled[] = "events.touch_pad.enabled"; const char kTouchpadEnabled[] = "events.touch_pad.enabled";
// A boolean pref that controls whether the dark connect feature is enabled. // A boolean pref that controls whether the dark connect feature is enabled.
// The dark connect feature allows a Chrome OS device to periodically wake // The dark connect feature allows a Chrome OS device to periodically wake
...@@ -1415,13 +1415,6 @@ const char kTaskManagerColumnVisibility[] = "task_manager.column_visibility"; ...@@ -1415,13 +1415,6 @@ const char kTaskManagerColumnVisibility[] = "task_manager.column_visibility";
// A boolean indicating if ending processes are enabled or disabled by policy. // A boolean indicating if ending processes are enabled or disabled by policy.
const char kTaskManagerEndProcessEnabled[] = "task_manager.end_process_enabled"; const char kTaskManagerEndProcessEnabled[] = "task_manager.end_process_enabled";
#if defined(OS_CHROMEOS)
// Dictionary indicating current network bandwidth throttling settings.
// Contains a boolean (is throttling enabled) and two integers (upload rate
// and download rate in kbits/s to throttle to)
const char kNetworkThrottlingEnabled[] = "net.throttling_enabled";
#endif
// A collection of position, size, and other data relating to app windows to // A collection of position, size, and other data relating to app windows to
// restore on startup. // restore on startup.
const char kAppWindowPlacement[] = "browser.app_window_placement"; const char kAppWindowPlacement[] = "browser.app_window_placement";
...@@ -1883,6 +1876,14 @@ const char kIsBootstrappingSlave[] = "is_oobe_bootstrapping_slave"; ...@@ -1883,6 +1876,14 @@ const char kIsBootstrappingSlave[] = "is_oobe_bootstrapping_slave";
// A preference that controlles Android status reporting. // A preference that controlles Android status reporting.
const char kReportArcStatusEnabled[] = "arc.status_reporting_enabled"; const char kReportArcStatusEnabled[] = "arc.status_reporting_enabled";
// Dictionary indicating current network bandwidth throttling settings.
// Contains a boolean (is throttling enabled) and two integers (upload rate
// and download rate in kbits/s to throttle to)
const char kNetworkThrottlingEnabled[] = "net.throttling_enabled";
// Boolean prefs for the local status of the touchscreen.
const char kTouchscreenEnabledLocal[] = "events.touch_screen.enabled_local";
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
// Whether there is a Flash version installed that supports clearing LSO data. // Whether there is a Flash version installed that supports clearing LSO data.
......
...@@ -293,8 +293,8 @@ extern const char kTimeOnOobe[]; ...@@ -293,8 +293,8 @@ extern const char kTimeOnOobe[];
extern const char kCurrentWallpaperAppName[]; extern const char kCurrentWallpaperAppName[];
extern const char kFileSystemProviderMounted[]; extern const char kFileSystemProviderMounted[];
extern const char kTouchVirtualKeyboardEnabled[]; extern const char kTouchVirtualKeyboardEnabled[];
extern const char kTouchScreenEnabled[]; extern const char kTouchscreenEnabled[];
extern const char kTouchPadEnabled[]; extern const char kTouchpadEnabled[];
extern const char kWakeOnWifiDarkConnect[]; extern const char kWakeOnWifiDarkConnect[];
extern const char kCaptivePortalAuthenticationIgnoresProxy[]; extern const char kCaptivePortalAuthenticationIgnoresProxy[];
extern const char kForceMaximizeOnFirstRun[]; extern const char kForceMaximizeOnFirstRun[];
...@@ -664,6 +664,7 @@ extern const char kConsumerManagementStage[]; ...@@ -664,6 +664,7 @@ extern const char kConsumerManagementStage[];
extern const char kIsBootstrappingSlave[]; extern const char kIsBootstrappingSlave[];
extern const char kReportArcStatusEnabled[]; extern const char kReportArcStatusEnabled[];
extern const char kNetworkThrottlingEnabled[]; extern const char kNetworkThrottlingEnabled[];
extern const char kTouchscreenEnabledLocal[];
#endif // defined(OS_CHROMEOS) #endif // defined(OS_CHROMEOS)
extern const char kClearPluginLSODataEnabled[]; extern const char kClearPluginLSODataEnabled[];
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment