OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ash/wm/maximize_mode/maximize_mode_controller.h" | 5 #include "ash/wm/maximize_mode/maximize_mode_controller.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "ash/ash_switches.h" | 9 #include "ash/ash_switches.h" |
10 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 11 #include "ash/shell_port.h" |
11 #include "ash/wm/maximize_mode/maximize_mode_window_manager.h" | 12 #include "ash/wm/maximize_mode/maximize_mode_window_manager.h" |
12 #include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h" | 13 #include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h" |
13 #include "ash/wm_shell.h" | |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/command_line.h" | 15 #include "base/command_line.h" |
16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
17 #include "base/time/default_tick_clock.h" | 17 #include "base/time/default_tick_clock.h" |
18 #include "base/time/tick_clock.h" | 18 #include "base/time/tick_clock.h" |
19 #include "chromeos/dbus/dbus_thread_manager.h" | 19 #include "chromeos/dbus/dbus_thread_manager.h" |
20 #include "ui/base/accelerators/accelerator.h" | 20 #include "ui/base/accelerators/accelerator.h" |
21 #include "ui/chromeos/accelerometer/accelerometer_util.h" | 21 #include "ui/chromeos/accelerometer/accelerometer_util.h" |
22 #include "ui/display/display.h" | 22 #include "ui/display/display.h" |
23 #include "ui/events/event.h" | 23 #include "ui/events/event.h" |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 | 105 |
106 MaximizeModeController::MaximizeModeController() | 106 MaximizeModeController::MaximizeModeController() |
107 : have_seen_accelerometer_data_(false), | 107 : have_seen_accelerometer_data_(false), |
108 can_detect_lid_angle_(false), | 108 can_detect_lid_angle_(false), |
109 touchview_usage_interval_start_time_(base::Time::Now()), | 109 touchview_usage_interval_start_time_(base::Time::Now()), |
110 tick_clock_(new base::DefaultTickClock()), | 110 tick_clock_(new base::DefaultTickClock()), |
111 tablet_mode_switch_is_on_(false), | 111 tablet_mode_switch_is_on_(false), |
112 lid_is_closed_(false), | 112 lid_is_closed_(false), |
113 weak_factory_(this) { | 113 weak_factory_(this) { |
114 Shell::Get()->AddShellObserver(this); | 114 Shell::Get()->AddShellObserver(this); |
115 WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_INITIALLY_DISABLED); | 115 ShellPort::Get()->RecordUserMetricsAction( |
| 116 UMA_MAXIMIZE_MODE_INITIALLY_DISABLED); |
116 | 117 |
117 // TODO(jonross): Do not create MaximizeModeController if the flag is | 118 // TODO(jonross): Do not create MaximizeModeController if the flag is |
118 // unavailable. This will require refactoring | 119 // unavailable. This will require refactoring |
119 // IsMaximizeModeWindowManagerEnabled to check for the existance of the | 120 // IsMaximizeModeWindowManagerEnabled to check for the existance of the |
120 // controller. | 121 // controller. |
121 if (IsEnabled()) { | 122 if (IsEnabled()) { |
122 WmShell::Get()->AddDisplayObserver(this); | 123 ShellPort::Get()->AddDisplayObserver(this); |
123 chromeos::AccelerometerReader::GetInstance()->AddObserver(this); | 124 chromeos::AccelerometerReader::GetInstance()->AddObserver(this); |
124 } | 125 } |
125 chromeos::PowerManagerClient* power_manager_client = | 126 chromeos::PowerManagerClient* power_manager_client = |
126 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); | 127 chromeos::DBusThreadManager::Get()->GetPowerManagerClient(); |
127 power_manager_client->AddObserver(this); | 128 power_manager_client->AddObserver(this); |
128 power_manager_client->GetSwitchStates(base::Bind( | 129 power_manager_client->GetSwitchStates(base::Bind( |
129 &MaximizeModeController::OnGetSwitchStates, weak_factory_.GetWeakPtr())); | 130 &MaximizeModeController::OnGetSwitchStates, weak_factory_.GetWeakPtr())); |
130 } | 131 } |
131 | 132 |
132 MaximizeModeController::~MaximizeModeController() { | 133 MaximizeModeController::~MaximizeModeController() { |
133 Shell::Get()->RemoveShellObserver(this); | 134 Shell::Get()->RemoveShellObserver(this); |
134 | 135 |
135 if (IsEnabled()) { | 136 if (IsEnabled()) { |
136 WmShell::Get()->RemoveDisplayObserver(this); | 137 ShellPort::Get()->RemoveDisplayObserver(this); |
137 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this); | 138 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this); |
138 } | 139 } |
139 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver( | 140 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver( |
140 this); | 141 this); |
141 } | 142 } |
142 | 143 |
143 bool MaximizeModeController::CanEnterMaximizeMode() { | 144 bool MaximizeModeController::CanEnterMaximizeMode() { |
144 // If we have ever seen accelerometer data, then HandleHingeRotation may | 145 // If we have ever seen accelerometer data, then HandleHingeRotation may |
145 // trigger maximize mode at some point in the future. | 146 // trigger maximize mode at some point in the future. |
146 // All TouchView-enabled devices can enter maximized mode. | 147 // All TouchView-enabled devices can enter maximized mode. |
147 return have_seen_accelerometer_data_ || IsEnabled(); | 148 return have_seen_accelerometer_data_ || IsEnabled(); |
148 } | 149 } |
149 | 150 |
150 // TODO(jcliang): Hide or remove EnableMaximizeModeWindowManager | 151 // TODO(jcliang): Hide or remove EnableMaximizeModeWindowManager |
151 // (http://crbug.com/620241). | 152 // (http://crbug.com/620241). |
152 void MaximizeModeController::EnableMaximizeModeWindowManager( | 153 void MaximizeModeController::EnableMaximizeModeWindowManager( |
153 bool should_enable) { | 154 bool should_enable) { |
154 bool is_enabled = !!maximize_mode_window_manager_.get(); | 155 bool is_enabled = !!maximize_mode_window_manager_.get(); |
155 if (should_enable == is_enabled) | 156 if (should_enable == is_enabled) |
156 return; | 157 return; |
157 | 158 |
158 WmShell* shell = WmShell::Get(); | |
159 | |
160 if (should_enable) { | 159 if (should_enable) { |
161 maximize_mode_window_manager_.reset(new MaximizeModeWindowManager()); | 160 maximize_mode_window_manager_.reset(new MaximizeModeWindowManager()); |
162 // TODO(jonross): Move the maximize mode notifications from ShellObserver | 161 // TODO(jonross): Move the maximize mode notifications from ShellObserver |
163 // to MaximizeModeController::Observer | 162 // to MaximizeModeController::Observer |
164 shell->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_ENABLED); | 163 ShellPort::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_ENABLED); |
165 Shell::Get()->NotifyMaximizeModeStarted(); | 164 Shell::Get()->NotifyMaximizeModeStarted(); |
166 | 165 |
167 observers_.ForAllPtrs([](mojom::TouchViewObserver* observer) { | 166 observers_.ForAllPtrs([](mojom::TouchViewObserver* observer) { |
168 observer->OnTouchViewToggled(true); | 167 observer->OnTouchViewToggled(true); |
169 }); | 168 }); |
170 | 169 |
171 } else { | 170 } else { |
172 Shell::Get()->NotifyMaximizeModeEnding(); | 171 Shell::Get()->NotifyMaximizeModeEnding(); |
173 maximize_mode_window_manager_.reset(); | 172 maximize_mode_window_manager_.reset(); |
174 shell->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_DISABLED); | 173 ShellPort::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_DISABLED); |
175 Shell::Get()->NotifyMaximizeModeEnded(); | 174 Shell::Get()->NotifyMaximizeModeEnded(); |
176 | 175 |
177 observers_.ForAllPtrs([](mojom::TouchViewObserver* observer) { | 176 observers_.ForAllPtrs([](mojom::TouchViewObserver* observer) { |
178 observer->OnTouchViewToggled(false); | 177 observer->OnTouchViewToggled(false); |
179 }); | 178 }); |
180 } | 179 } |
181 } | 180 } |
182 | 181 |
183 bool MaximizeModeController::IsMaximizeModeWindowManagerEnabled() const { | 182 bool MaximizeModeController::IsMaximizeModeWindowManagerEnabled() const { |
184 return maximize_mode_window_manager_.get() != NULL; | 183 return maximize_mode_window_manager_.get() != NULL; |
(...skipping 18 matching lines...) Expand all Loading... |
203 can_detect_lid_angle_ = | 202 can_detect_lid_angle_ = |
204 update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN) && | 203 update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN) && |
205 update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); | 204 update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD); |
206 | 205 |
207 if (!can_detect_lid_angle_) | 206 if (!can_detect_lid_angle_) |
208 return; | 207 return; |
209 | 208 |
210 if (!display::Display::HasInternalDisplay()) | 209 if (!display::Display::HasInternalDisplay()) |
211 return; | 210 return; |
212 | 211 |
213 if (!WmShell::Get()->IsActiveDisplayId( | 212 if (!ShellPort::Get()->IsActiveDisplayId( |
214 display::Display::InternalDisplayId())) { | 213 display::Display::InternalDisplayId())) { |
215 return; | 214 return; |
216 } | 215 } |
217 | 216 |
218 // Whether or not we enter maximize mode affects whether we handle screen | 217 // Whether or not we enter maximize mode affects whether we handle screen |
219 // rotation, so determine whether to enter maximize mode first. | 218 // rotation, so determine whether to enter maximize mode first. |
220 if (ui::IsAccelerometerReadingStable(*update, | 219 if (ui::IsAccelerometerReadingStable(*update, |
221 chromeos::ACCELEROMETER_SOURCE_SCREEN) && | 220 chromeos::ACCELEROMETER_SOURCE_SCREEN) && |
222 ui::IsAccelerometerReadingStable( | 221 ui::IsAccelerometerReadingStable( |
223 *update, chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) && | 222 *update, chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) && |
(...skipping 22 matching lines...) Expand all Loading... |
246 void MaximizeModeController::TabletModeEventReceived( | 245 void MaximizeModeController::TabletModeEventReceived( |
247 chromeos::PowerManagerClient::TabletMode mode, | 246 chromeos::PowerManagerClient::TabletMode mode, |
248 const base::TimeTicks& time) { | 247 const base::TimeTicks& time) { |
249 if (!AllowEnterExitMaximizeMode()) | 248 if (!AllowEnterExitMaximizeMode()) |
250 return; | 249 return; |
251 | 250 |
252 const bool on = mode == chromeos::PowerManagerClient::TabletMode::ON; | 251 const bool on = mode == chromeos::PowerManagerClient::TabletMode::ON; |
253 tablet_mode_switch_is_on_ = on; | 252 tablet_mode_switch_is_on_ = on; |
254 // Do not change if docked. | 253 // Do not change if docked. |
255 if (!display::Display::HasInternalDisplay() || | 254 if (!display::Display::HasInternalDisplay() || |
256 !WmShell::Get()->IsActiveDisplayId( | 255 !ShellPort::Get()->IsActiveDisplayId( |
257 display::Display::InternalDisplayId())) { | 256 display::Display::InternalDisplayId())) { |
258 return; | 257 return; |
259 } | 258 } |
260 // The tablet mode switch activates at 300 degrees, so it is always reliable | 259 // The tablet mode switch activates at 300 degrees, so it is always reliable |
261 // when |on|. However we wish to exit maximize mode at a smaller angle, so | 260 // when |on|. However we wish to exit maximize mode at a smaller angle, so |
262 // when |on| is false we ignore if it is possible to calculate the lid angle. | 261 // when |on| is false we ignore if it is possible to calculate the lid angle. |
263 if (on && !IsMaximizeModeWindowManagerEnabled()) { | 262 if (on && !IsMaximizeModeWindowManagerEnabled()) { |
264 EnterMaximizeMode(); | 263 EnterMaximizeMode(); |
265 } else if (!on && IsMaximizeModeWindowManagerEnabled() && | 264 } else if (!on && IsMaximizeModeWindowManagerEnabled() && |
266 !can_detect_lid_angle_) { | 265 !can_detect_lid_angle_) { |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 lid_angle >= kEnterMaximizeModeAngle && | 344 lid_angle >= kEnterMaximizeModeAngle && |
346 (is_angle_stable || !WasLidOpenedRecently())) { | 345 (is_angle_stable || !WasLidOpenedRecently())) { |
347 EnterMaximizeMode(); | 346 EnterMaximizeMode(); |
348 } | 347 } |
349 } | 348 } |
350 | 349 |
351 void MaximizeModeController::EnterMaximizeMode() { | 350 void MaximizeModeController::EnterMaximizeMode() { |
352 // Always reset first to avoid creation before destruction of a previous | 351 // Always reset first to avoid creation before destruction of a previous |
353 // object. | 352 // object. |
354 event_blocker_ = | 353 event_blocker_ = |
355 WmShell::Get()->CreateScopedDisableInternalMouseAndKeyboard(); | 354 ShellPort::Get()->CreateScopedDisableInternalMouseAndKeyboard(); |
356 | 355 |
357 if (IsMaximizeModeWindowManagerEnabled()) | 356 if (IsMaximizeModeWindowManagerEnabled()) |
358 return; | 357 return; |
359 EnableMaximizeModeWindowManager(true); | 358 EnableMaximizeModeWindowManager(true); |
360 } | 359 } |
361 | 360 |
362 void MaximizeModeController::LeaveMaximizeMode() { | 361 void MaximizeModeController::LeaveMaximizeMode() { |
363 event_blocker_.reset(); | 362 event_blocker_.reset(); |
364 | 363 |
365 if (!IsMaximizeModeWindowManagerEnabled()) | 364 if (!IsMaximizeModeWindowManagerEnabled()) |
(...skipping 13 matching lines...) Expand all Loading... |
379 } | 378 } |
380 | 379 |
381 void MaximizeModeController::OnShellInitialized() { | 380 void MaximizeModeController::OnShellInitialized() { |
382 force_tablet_mode_ = GetMaximizeMode(); | 381 force_tablet_mode_ = GetMaximizeMode(); |
383 if (force_tablet_mode_ == ForceTabletMode::TOUCHVIEW) | 382 if (force_tablet_mode_ == ForceTabletMode::TOUCHVIEW) |
384 EnterMaximizeMode(); | 383 EnterMaximizeMode(); |
385 } | 384 } |
386 | 385 |
387 void MaximizeModeController::OnDisplayConfigurationChanged() { | 386 void MaximizeModeController::OnDisplayConfigurationChanged() { |
388 if (!display::Display::HasInternalDisplay() || | 387 if (!display::Display::HasInternalDisplay() || |
389 !WmShell::Get()->IsActiveDisplayId( | 388 !ShellPort::Get()->IsActiveDisplayId( |
390 display::Display::InternalDisplayId())) { | 389 display::Display::InternalDisplayId())) { |
391 LeaveMaximizeMode(); | 390 LeaveMaximizeMode(); |
392 } else if (tablet_mode_switch_is_on_ && | 391 } else if (tablet_mode_switch_is_on_ && |
393 !IsMaximizeModeWindowManagerEnabled()) { | 392 !IsMaximizeModeWindowManagerEnabled()) { |
394 // The internal display has returned, as we are exiting docked mode. | 393 // The internal display has returned, as we are exiting docked mode. |
395 // The device is still in tablet mode, so trigger maximize mode, as this | 394 // The device is still in tablet mode, so trigger maximize mode, as this |
396 // switch leads to the ignoring of accelerometer events. When the switch is | 395 // switch leads to the ignoring of accelerometer events. When the switch is |
397 // not set the next stable accelerometer readings will trigger maximize | 396 // not set the next stable accelerometer readings will trigger maximize |
398 // mode. | 397 // mode. |
399 EnterMaximizeMode(); | 398 EnterMaximizeMode(); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 return elapsed_time.InSeconds() <= kLidRecentlyOpenedDurationSeconds; | 475 return elapsed_time.InSeconds() <= kLidRecentlyOpenedDurationSeconds; |
477 } | 476 } |
478 | 477 |
479 void MaximizeModeController::SetTickClockForTest( | 478 void MaximizeModeController::SetTickClockForTest( |
480 std::unique_ptr<base::TickClock> tick_clock) { | 479 std::unique_ptr<base::TickClock> tick_clock) { |
481 DCHECK(tick_clock_); | 480 DCHECK(tick_clock_); |
482 tick_clock_ = std::move(tick_clock); | 481 tick_clock_ = std::move(tick_clock); |
483 } | 482 } |
484 | 483 |
485 } // namespace ash | 484 } // namespace ash |
OLD | NEW |