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

Side by Side Diff: ash/common/wm/maximize_mode/maximize_mode_controller.cc

Issue 2118643002: Move MaximizeModeController into ash/common (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: doh Created 4 years, 5 months 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
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/common/wm/maximize_mode/maximize_mode_controller.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "ash/accelerators/accelerator_controller.h"
10 #include "ash/accelerators/accelerator_table.h"
11 #include "ash/common/ash_switches.h" 9 #include "ash/common/ash_switches.h"
12 #include "ash/common/wm/maximize_mode/maximize_mode_window_manager.h" 10 #include "ash/common/wm/maximize_mode/maximize_mode_window_manager.h"
11 #include "ash/common/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard .h"
13 #include "ash/common/wm_shell.h" 12 #include "ash/common/wm_shell.h"
14 #include "ash/display/display_manager.h"
15 #include "ash/shell.h"
16 #include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h"
17 #include "base/command_line.h" 13 #include "base/command_line.h"
18 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
19 #include "base/time/default_tick_clock.h" 15 #include "base/time/default_tick_clock.h"
20 #include "base/time/tick_clock.h" 16 #include "base/time/tick_clock.h"
21 #include "ui/base/accelerators/accelerator.h" 17 #include "ui/base/accelerators/accelerator.h"
22 #include "ui/display/display.h" 18 #include "ui/display/display.h"
23 #include "ui/events/event.h" 19 #include "ui/events/event.h"
24 #include "ui/events/keycodes/keyboard_codes.h" 20 #include "ui/events/keycodes/keyboard_codes.h"
25 #include "ui/gfx/geometry/vector3d_f.h" 21 #include "ui/gfx/geometry/vector3d_f.h"
26 22
27 #if defined(USE_X11)
28 #include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_x11.h"
29 #endif
30
31 #if defined(USE_OZONE)
32 #include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard_ozone. h"
33 #endif
34
35 #if defined(OS_CHROMEOS) 23 #if defined(OS_CHROMEOS)
36 #include "chromeos/dbus/dbus_thread_manager.h" 24 #include "chromeos/dbus/dbus_thread_manager.h"
37 #include "ui/chromeos/accelerometer/accelerometer_util.h" 25 #include "ui/chromeos/accelerometer/accelerometer_util.h"
38 #endif // OS_CHROMEOS 26 #endif // OS_CHROMEOS
39 27
40 namespace ash { 28 namespace ash {
41 29
42 namespace { 30 namespace {
43 31
44 #if defined(OS_CHROMEOS) 32 #if defined(OS_CHROMEOS)
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 return std::abs( 78 return std::abs(
91 ui::ConvertAccelerometerReadingToVector3dF( 79 ui::ConvertAccelerometerReadingToVector3dF(
92 update.get(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) 80 update.get(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD))
93 .Length() - 81 .Length() -
94 ui::ConvertAccelerometerReadingToVector3dF( 82 ui::ConvertAccelerometerReadingToVector3dF(
95 update.get(chromeos::ACCELEROMETER_SOURCE_SCREEN)) 83 update.get(chromeos::ACCELEROMETER_SOURCE_SCREEN))
96 .Length()) <= kNoisyMagnitudeDeviation; 84 .Length()) <= kNoisyMagnitudeDeviation;
97 } 85 }
98 #endif // OS_CHROMEOS 86 #endif // OS_CHROMEOS
99 87
88 bool IsEnabled() {
89 return base::CommandLine::ForCurrentProcess()->HasSwitch(
90 switches::kAshEnableTouchView);
91 }
92
100 } // namespace 93 } // namespace
101 94
102 MaximizeModeController::MaximizeModeController() 95 MaximizeModeController::MaximizeModeController()
103 : have_seen_accelerometer_data_(false), 96 : have_seen_accelerometer_data_(false),
104 touchview_usage_interval_start_time_(base::Time::Now()), 97 touchview_usage_interval_start_time_(base::Time::Now()),
105 tick_clock_(new base::DefaultTickClock()), 98 tick_clock_(new base::DefaultTickClock()),
106 #if defined(OS_CHROMEOS) 99 #if defined(OS_CHROMEOS)
107 tablet_mode_switch_is_on_(false), 100 tablet_mode_switch_is_on_(false),
108 #endif 101 #endif
109 lid_is_closed_(false) { 102 lid_is_closed_(false) {
110 WmShell::Get()->AddShellObserver(this); 103 WmShell::Get()->AddShellObserver(this);
111 WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_INITIALLY_DISABLED); 104 WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_INITIALLY_DISABLED);
112 105
113 #if defined(OS_CHROMEOS)
114 // TODO(jonross): Do not create MaximizeModeController if the flag is 106 // TODO(jonross): Do not create MaximizeModeController if the flag is
115 // unavailable. This will require refactoring 107 // unavailable. This will require refactoring
116 // IsMaximizeModeWindowManagerEnabled to check for the existance of the 108 // IsMaximizeModeWindowManagerEnabled to check for the existance of the
117 // controller. 109 // controller.
118 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 110 const bool is_enabled = IsEnabled();
119 switches::kAshEnableTouchView)) { 111 if (is_enabled)
112 WmShell::Get()->AddDisplayObserver(this);
113
114 #if defined(OS_CHROMEOS)
115 if (is_enabled)
120 chromeos::AccelerometerReader::GetInstance()->AddObserver(this); 116 chromeos::AccelerometerReader::GetInstance()->AddObserver(this);
121 Shell::GetInstance()->window_tree_host_manager()->AddObserver(this);
122 }
123 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver( 117 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(
124 this); 118 this);
125 #endif // OS_CHROMEOS 119 #endif // OS_CHROMEOS
126 } 120 }
127 121
128 MaximizeModeController::~MaximizeModeController() { 122 MaximizeModeController::~MaximizeModeController() {
129 WmShell::Get()->RemoveShellObserver(this); 123 WmShell::Get()->RemoveShellObserver(this);
124 const bool is_enabled = IsEnabled();
125 if (is_enabled)
126 WmShell::Get()->RemoveDisplayObserver(this);
127
130 #if defined(OS_CHROMEOS) 128 #if defined(OS_CHROMEOS)
131 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 129 if (is_enabled)
132 switches::kAshEnableTouchView)) {
133 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this); 130 chromeos::AccelerometerReader::GetInstance()->RemoveObserver(this);
134 Shell::GetInstance()->window_tree_host_manager()->RemoveObserver(this);
135 }
136 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver( 131 chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RemoveObserver(
137 this); 132 this);
138 #endif // OS_CHROMEOS 133 #endif // OS_CHROMEOS
139 } 134 }
140 135
141 bool MaximizeModeController::CanEnterMaximizeMode() { 136 bool MaximizeModeController::CanEnterMaximizeMode() {
142 // If we have ever seen accelerometer data, then HandleHingeRotation may 137 // If we have ever seen accelerometer data, then HandleHingeRotation may
143 // trigger maximize mode at some point in the future. 138 // trigger maximize mode at some point in the future.
144 // The --enable-touch-view-testing switch can also mean that we may enter 139 // The --enable-touch-view-testing switch can also mean that we may enter
145 // maximize mode. 140 // maximize mode.
146 // TODO(mgiuca): This can result in false positives, as it returns true for 141 // TODO(mgiuca): This can result in false positives, as it returns true for
147 // any device with an accelerometer. Have TouchView-enabled devices explicitly 142 // any device with an accelerometer. Have TouchView-enabled devices explicitly
148 // set a flag, and change this implementation to simply return true iff the 143 // set a flag, and change this implementation to simply return true iff the
149 // flag is present (http://crbug.com/457445). 144 // flag is present (http://crbug.com/457445).
150 return have_seen_accelerometer_data_ || 145 return have_seen_accelerometer_data_ ||
151 base::CommandLine::ForCurrentProcess()->HasSwitch( 146 base::CommandLine::ForCurrentProcess()->HasSwitch(
152 switches::kAshEnableTouchViewTesting); 147 switches::kAshEnableTouchViewTesting);
153 } 148 }
154 149
155 // TODO(jcliang): Hide or remove EnableMaximizeModeWindowManager 150 // TODO(jcliang): Hide or remove EnableMaximizeModeWindowManager
156 // (http://crbug.com/620241). 151 // (http://crbug.com/620241).
157 void MaximizeModeController::EnableMaximizeModeWindowManager( 152 void MaximizeModeController::EnableMaximizeModeWindowManager(
158 bool should_enable) { 153 bool should_enable) {
159 bool is_enabled = !!maximize_mode_window_manager_.get(); 154 bool is_enabled = !!maximize_mode_window_manager_.get();
160 if (should_enable == is_enabled) 155 if (should_enable == is_enabled)
161 return; 156 return;
162 157
163 Shell* shell = Shell::GetInstance(); 158 WmShell* shell = WmShell::Get();
164 159
165 if (should_enable) { 160 if (should_enable) {
166 maximize_mode_window_manager_.reset(new MaximizeModeWindowManager()); 161 maximize_mode_window_manager_.reset(new MaximizeModeWindowManager());
167 // TODO(jonross): Move the maximize mode notifications from ShellObserver 162 // TODO(jonross): Move the maximize mode notifications from ShellObserver
168 // to MaximizeModeController::Observer 163 // to MaximizeModeController::Observer
169 WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_ENABLED); 164 shell->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_ENABLED);
170 shell->OnMaximizeModeStarted(); 165 shell->OnMaximizeModeStarted();
171 } else { 166 } else {
172 maximize_mode_window_manager_.reset(); 167 maximize_mode_window_manager_.reset();
173 WmShell::Get()->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_DISABLED); 168 shell->RecordUserMetricsAction(UMA_MAXIMIZE_MODE_DISABLED);
174 shell->OnMaximizeModeEnded(); 169 shell->OnMaximizeModeEnded();
175 } 170 }
176 } 171 }
177 172
178 bool MaximizeModeController::IsMaximizeModeWindowManagerEnabled() const { 173 bool MaximizeModeController::IsMaximizeModeWindowManagerEnabled() const {
179 return maximize_mode_window_manager_.get() != NULL; 174 return maximize_mode_window_manager_.get() != NULL;
180 } 175 }
181 176
182 void MaximizeModeController::AddWindow(WmWindow* window) { 177 void MaximizeModeController::AddWindow(WmWindow* window) {
183 if (IsMaximizeModeWindowManagerEnabled()) 178 if (IsMaximizeModeWindowManagerEnabled())
184 maximize_mode_window_manager_->AddWindow(window); 179 maximize_mode_window_manager_->AddWindow(window);
185 } 180 }
186 181
187 #if defined(OS_CHROMEOS) 182 #if defined(OS_CHROMEOS)
188 void MaximizeModeController::OnAccelerometerUpdated( 183 void MaximizeModeController::OnAccelerometerUpdated(
189 scoped_refptr<const chromeos::AccelerometerUpdate> update) { 184 scoped_refptr<const chromeos::AccelerometerUpdate> update) {
190 bool first_accelerometer_update = !have_seen_accelerometer_data_; 185 bool first_accelerometer_update = !have_seen_accelerometer_data_;
191 have_seen_accelerometer_data_ = true; 186 have_seen_accelerometer_data_ = true;
192 187
193 if (!update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN)) 188 if (!update->has(chromeos::ACCELEROMETER_SOURCE_SCREEN))
194 return; 189 return;
195 190
196 if (!display::Display::HasInternalDisplay()) 191 if (!display::Display::HasInternalDisplay())
197 return; 192 return;
198 193
199 if (!Shell::GetInstance()->display_manager()->IsActiveDisplayId( 194 if (!WmShell::Get()->IsActiveDisplayId(
200 display::Display::InternalDisplayId())) { 195 display::Display::InternalDisplayId())) {
201 return; 196 return;
202 } 197 }
203 198
204 // Whether or not we enter maximize mode affects whether we handle screen 199 // Whether or not we enter maximize mode affects whether we handle screen
205 // rotation, so determine whether to enter maximize mode first. 200 // rotation, so determine whether to enter maximize mode first.
206 if (!update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) { 201 if (!update->has(chromeos::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) {
207 if (first_accelerometer_update) 202 if (first_accelerometer_update)
208 EnterMaximizeMode(); 203 EnterMaximizeMode();
209 } else if (ui::IsAccelerometerReadingStable( 204 } else if (ui::IsAccelerometerReadingStable(
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 lid_angle >= kEnterMaximizeModeAngle && 307 lid_angle >= kEnterMaximizeModeAngle &&
313 (is_angle_stable || !WasLidOpenedRecently())) { 308 (is_angle_stable || !WasLidOpenedRecently())) {
314 EnterMaximizeMode(); 309 EnterMaximizeMode();
315 } 310 }
316 } 311 }
317 #endif // OS_CHROMEOS 312 #endif // OS_CHROMEOS
318 313
319 void MaximizeModeController::EnterMaximizeMode() { 314 void MaximizeModeController::EnterMaximizeMode() {
320 // Always reset first to avoid creation before destruction of a previous 315 // Always reset first to avoid creation before destruction of a previous
321 // object. 316 // object.
322 event_blocker_.reset(); 317 event_blocker_ =
323 #if defined(USE_X11) 318 WmShell::Get()->CreateScopedDisableInternalMouseAndKeyboard();
324 event_blocker_.reset(new ScopedDisableInternalMouseAndKeyboardX11);
325 #elif defined(USE_OZONE)
326 event_blocker_.reset(new ScopedDisableInternalMouseAndKeyboardOzone);
327 #endif
328 319
329 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 320 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
330 switches::kAshEnableTouchViewTesting)) { 321 switches::kAshEnableTouchViewTesting)) {
331 // We don't let accelerometer updates interfere with the maximize mode 322 // We don't let accelerometer updates interfere with the maximize mode
332 // status as set by the touch-view-testing keyboard shortcut. 323 // status as set by the touch-view-testing keyboard shortcut.
333 return; 324 return;
334 } 325 }
335 326
336 if (IsMaximizeModeWindowManagerEnabled()) 327 if (IsMaximizeModeWindowManagerEnabled())
337 return; 328 return;
(...skipping 21 matching lines...) Expand all
359 } 350 }
360 351
361 // Called after maximize mode has ended, windows might still be returning to 352 // Called after maximize mode has ended, windows might still be returning to
362 // their original position. 353 // their original position.
363 void MaximizeModeController::OnMaximizeModeEnded() { 354 void MaximizeModeController::OnMaximizeModeEnded() {
364 RecordTouchViewUsageInterval(TOUCH_VIEW_INTERVAL_ACTIVE); 355 RecordTouchViewUsageInterval(TOUCH_VIEW_INTERVAL_ACTIVE);
365 } 356 }
366 357
367 void MaximizeModeController::OnDisplayConfigurationChanged() { 358 void MaximizeModeController::OnDisplayConfigurationChanged() {
368 if (!display::Display::HasInternalDisplay() || 359 if (!display::Display::HasInternalDisplay() ||
369 !Shell::GetInstance()->display_manager()->IsActiveDisplayId( 360 !WmShell::Get()->IsActiveDisplayId(
370 display::Display::InternalDisplayId())) { 361 display::Display::InternalDisplayId())) {
371 LeaveMaximizeMode(); 362 LeaveMaximizeMode();
372 } 363 }
373 } 364 }
374 365
375 void MaximizeModeController::RecordTouchViewUsageInterval( 366 void MaximizeModeController::RecordTouchViewUsageInterval(
376 TouchViewIntervalType type) { 367 TouchViewIntervalType type) {
377 if (!CanEnterMaximizeMode()) 368 if (!CanEnterMaximizeMode())
378 return; 369 return;
379 370
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
432 return elapsed_time.InSeconds() <= kLidRecentlyOpenedDurationSeconds; 423 return elapsed_time.InSeconds() <= kLidRecentlyOpenedDurationSeconds;
433 } 424 }
434 425
435 void MaximizeModeController::SetTickClockForTest( 426 void MaximizeModeController::SetTickClockForTest(
436 std::unique_ptr<base::TickClock> tick_clock) { 427 std::unique_ptr<base::TickClock> tick_clock) {
437 DCHECK(tick_clock_); 428 DCHECK(tick_clock_);
438 tick_clock_ = std::move(tick_clock); 429 tick_clock_ = std::move(tick_clock);
439 } 430 }
440 431
441 } // namespace ash 432 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698