Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(53)

Side by Side Diff: ash/wm/tablet_power_button_controller.cc

Issue 2474913004: Tablet-like power button behavior on Convertible/Tablet ChromeOS devices (Closed)
Patch Set: nits on tests Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "ash/wm/tablet_power_button_controller.h"
6
7 #include "ash/common/session/session_state_delegate.h"
8 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
9 #include "ash/common/wm_shell.h"
10 #include "ash/shell.h"
11 #include "ash/wm/lock_state_controller.h"
12 #include "chromeos/dbus/dbus_thread_manager.h"
13 #include "chromeos/dbus/power_manager_client.h"
14
15 namespace ash {
16
17 namespace {
18
19 // Amount of time the power button must be held to start the pre-shutdown
20 // animation when in tablet mode.
21 constexpr int kTabletShutdownTimeoutMs = 1000;
Daniel Erat 2016/11/07 20:54:41 nit: remove "Tablet" from name
Qiang(Joe) Xu 2016/11/10 22:18:44 Done.
22
23 } // namespace
24
25 TabletPowerButtonController::TestApi::TestApi(
26 TabletPowerButtonController* controller)
27 : controller_(controller) {}
28
29 TabletPowerButtonController::TestApi::~TestApi() {}
30
31 bool TabletPowerButtonController::TestApi::TabletPowerButtonTimerIsRunning()
32 const {
33 return controller_->tablet_power_button_timer_.IsRunning();
34 }
35
36 void TabletPowerButtonController::TestApi::TriggerTabletPowerButtonTimeout() {
37 controller_->OnTabletPowerButtonTimeout();
Daniel Erat 2016/11/07 20:54:41 i'd make sure that the timer is actually running h
Qiang(Joe) Xu 2016/11/10 22:18:45 Done.
38 controller_->tablet_power_button_timer_.Stop();
39 }
40
41 TabletPowerButtonController::TabletPowerButtonController(
42 LockStateController* controller) {
43 controller_ = controller;
Daniel Erat 2016/11/07 20:54:41 nit: use an initialization list for controller_
Qiang(Joe) Xu 2016/11/10 22:18:44 Done.
44 Shell::GetInstance()->PrependPreTargetHandler(this);
45 GetInitialBacklightsForcedOff();
Daniel Erat 2016/11/07 20:54:41 i think you also need to handle the case where pow
Qiang(Joe) Xu 2016/11/10 22:18:44 Done.
46 }
47
48 TabletPowerButtonController::~TabletPowerButtonController() {
49 Shell::GetInstance()->RemovePreTargetHandler(this);
50 }
51
52 bool TabletPowerButtonController::ShouldHandlePowerButtonEvents() const {
53 return IsTabletModeSupported();
Daniel Erat 2016/11/07 20:54:41 would it be cleaner to make IsTabletModeSupported
Qiang(Joe) Xu 2016/11/10 22:18:44 Avoid instantiating makes sense to me. However, I
54 }
55
56 void TabletPowerButtonController::OnPowerButtonEvent(
57 bool down,
58 const base::TimeTicks& timestamp,
59 bool brightness_is_zero) {
60 if (down) {
61 power_button_down_while_screen_off_ = brightness_is_zero;
62 SetBacklightsForcedOff(false);
63 StartTabletPowerButtonTimer();
Daniel Erat 2016/11/07 20:54:41 should you only start this if we aren't already sh
Qiang(Joe) Xu 2016/11/10 22:18:44 This case will be handled by PBC::OnPowerButtonEve
64 } else {
65 if (tablet_power_button_timer_.IsRunning()) {
66 tablet_power_button_timer_.Stop();
67 if (!power_button_down_while_screen_off_) {
68 SetBacklightsForcedOff(true);
69 LockScreenIfRequired();
70 }
71 }
72 power_button_down_while_screen_off_ = false;
73
74 // When power button is released, Cancel Shutdown animation whenever it is
Daniel Erat 2016/11/07 20:54:41 nit: s/Shutdown/shutdown/
Qiang(Joe) Xu 2016/11/10 22:18:45 Done.
75 // still cancellable.
76 if (controller_->CanCancelShutdownAnimation())
77 controller_->CancelShutdownAnimation();
78 }
79 }
80
81 void TabletPowerButtonController::OnKeyEvent(ui::KeyEvent* event) {
82 if (!IsTabletModeActive() && backlights_forced_off_)
83 SetBacklightsForcedOff(false);
84 }
85
86 void TabletPowerButtonController::OnMouseEvent(ui::MouseEvent* event) {
Daniel Erat 2016/11/07 20:54:41 i'm assuming that we intentionally don't want to s
Qiang(Joe) Xu 2016/11/10 22:18:44 I learned from Jacob that stylus event is a mouse
87 if (!IsTabletModeActive() && backlights_forced_off_)
88 SetBacklightsForcedOff(false);
89 }
90
91 void TabletPowerButtonController::SetBacklightsForcedOff(bool forced_off) {
92 if (backlights_forced_off_ == forced_off)
93 return;
94
95 chromeos::DBusThreadManager::Get()
96 ->GetPowerManagerClient()
97 ->SetBacklightsForcedOff(forced_off);
98 backlights_forced_off_ = forced_off;
99 }
100
101 void TabletPowerButtonController::GetInitialBacklightsForcedOff() {
102 chromeos::DBusThreadManager::Get()
103 ->GetPowerManagerClient()
104 ->GetBacklightsForcedOff(base::Bind(
105 &TabletPowerButtonController::OnGotInitialBacklightsForcedOff,
106 base::Unretained(this)));
107 }
108
109 void TabletPowerButtonController::OnGotInitialBacklightsForcedOff(
110 bool is_forced_off) {
111 backlights_forced_off_ = is_forced_off;
112 }
113
114 void TabletPowerButtonController::StartTabletPowerButtonTimer() {
115 tablet_power_button_timer_.Start(
116 FROM_HERE, base::TimeDelta::FromMilliseconds(kTabletShutdownTimeoutMs),
117 this, &TabletPowerButtonController::OnTabletPowerButtonTimeout);
118 }
119
120 void TabletPowerButtonController::OnTabletPowerButtonTimeout() {
121 controller_->StartShutdownAnimation();
122 }
123
124 void TabletPowerButtonController::LockScreenIfRequired() {
125 SessionStateDelegate* session_state_delegate =
126 WmShell::Get()->GetSessionStateDelegate();
127 if (session_state_delegate->ShouldLockScreenAutomatically() &&
128 session_state_delegate->CanLockScreen() &&
129 !session_state_delegate->IsUserSessionBlocked() &&
130 !controller_->LockRequested()) {
131 session_state_delegate->LockScreen();
132 }
133 }
134
135 bool TabletPowerButtonController::IsTabletModeSupported() const {
136 MaximizeModeController* maximize_mode_controller =
137 WmShell::Get()->maximize_mode_controller();
138 return maximize_mode_controller &&
139 maximize_mode_controller->CanEnterMaximizeMode();
140 }
141
142 bool TabletPowerButtonController::IsTabletModeActive() const {
143 MaximizeModeController* maximize_mode_controller =
144 WmShell::Get()->maximize_mode_controller();
145 return maximize_mode_controller &&
146 maximize_mode_controller->IsMaximizeModeWindowManagerEnabled();
147 }
148
149 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698