| 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 |