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

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

Issue 267743010: Suppressed screen rotation notifications triggeres by the accelerometer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor fix to some whitespace Created 6 years, 7 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/wm/maximize_mode/maximize_mode_controller.h"
6 6
7 #include "ash/accelerometer/accelerometer_controller.h" 7 #include "ash/accelerometer/accelerometer_controller.h"
8 #include "ash/display/display_manager.h" 8 #include "ash/display/display_manager.h"
9 #include "ash/shell.h" 9 #include "ash/shell.h"
10 #include "ash/system/chromeos/tray_display.h"
11 #include "ash/system/system_notifier.h"
10 #include "ash/wm/maximize_mode/maximize_mode_event_blocker.h" 12 #include "ash/wm/maximize_mode/maximize_mode_event_blocker.h"
11 #include "ui/gfx/vector3d_f.h" 13 #include "ui/gfx/vector3d_f.h"
14 #include "ui/message_center/message_center.h"
15 #include "ui/message_center/notification_blocker.h"
12 16
13 namespace ash { 17 namespace ash {
14 18
15 namespace { 19 namespace {
16 20
17 // The hinge angle at which to enter maximize mode. 21 // The hinge angle at which to enter maximize mode.
18 const float kEnterMaximizeModeAngle = 200.0f; 22 const float kEnterMaximizeModeAngle = 200.0f;
19 23
20 // The angle at which to exit maximize mode, this is specifically less than the 24 // The angle at which to exit maximize mode, this is specifically less than the
21 // angle to enter maximize mode to prevent rapid toggling when near the angle. 25 // angle to enter maximize mode to prevent rapid toggling when near the angle.
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 // shortest angle between |base| and |other| was counterclockwise with respect 79 // shortest angle between |base| and |other| was counterclockwise with respect
76 // to the surface represented by |normal| and this angle must be reversed. 80 // to the surface represented by |normal| and this angle must be reversed.
77 if (gfx::DotProduct(cross, normal) > 0.0f) 81 if (gfx::DotProduct(cross, normal) > 0.0f)
78 angle = 360.0f - angle; 82 angle = 360.0f - angle;
79 return angle; 83 return angle;
80 } 84 }
81 85
82 } // namespace 86 } // namespace
83 87
84 MaximizeModeController::MaximizeModeController() 88 MaximizeModeController::MaximizeModeController()
85 : rotation_locked_(false) { 89 : message_center::NotificationBlocker(message_center::MessageCenter::Get()),
flackr 2014/05/08 21:56:15 Are there any potential lifetime issues here? Does
bruthig 2014/05/14 00:36:16 Done.
90 rotation_locked_(false),
91 show_notifications_(true) {
86 Shell::GetInstance()->accelerometer_controller()->AddObserver(this); 92 Shell::GetInstance()->accelerometer_controller()->AddObserver(this);
87 } 93 }
88 94
89 MaximizeModeController::~MaximizeModeController() { 95 MaximizeModeController::~MaximizeModeController() {
90 Shell::GetInstance()->accelerometer_controller()->RemoveObserver(this); 96 Shell::GetInstance()->accelerometer_controller()->RemoveObserver(this);
91 } 97 }
92 98
93 void MaximizeModeController::OnAccelerometerUpdated( 99 void MaximizeModeController::OnAccelerometerUpdated(
94 const gfx::Vector3dF& base, 100 const gfx::Vector3dF& base,
95 const gfx::Vector3dF& lid) { 101 const gfx::Vector3dF& lid) {
96 // Ignore the reading if it appears unstable. The reading is considered 102 // Ignore the reading if it appears unstable. The reading is considered
97 // unstable if it deviates too much from gravity and/or the magnitude of the 103 // unstable if it deviates too much from gravity and/or the magnitude of the
98 // reading from the lid differs too much from the reading from the base. 104 // reading from the lid differs too much from the reading from the base.
99 float base_magnitude = base.Length(); 105 float base_magnitude = base.Length();
100 float lid_magnitude = lid.Length(); 106 float lid_magnitude = lid.Length();
101 if (std::abs(base_magnitude - lid_magnitude) > kNoisyMagnitudeDeviation || 107 if (std::abs(base_magnitude - lid_magnitude) > kNoisyMagnitudeDeviation ||
102 std::abs(base_magnitude - 1.0f) > kDeviationFromGravityThreshold || 108 std::abs(base_magnitude - 1.0f) > kDeviationFromGravityThreshold ||
103 std::abs(lid_magnitude - 1.0f) > kDeviationFromGravityThreshold) { 109 std::abs(lid_magnitude - 1.0f) > kDeviationFromGravityThreshold) {
104 return; 110 return;
105 } 111 }
106 112
107 // Responding to the hinge rotation can change the maximize mode state which 113 // Responding to the hinge rotation can change the maximize mode state which
108 // affects screen rotation, so we handle hinge rotation first. 114 // affects screen rotation, so we handle hinge rotation first.
109 HandleHingeRotation(base, lid); 115 HandleHingeRotation(base, lid);
110 HandleScreenRotation(lid); 116 HandleScreenRotation(lid);
111 } 117 }
112 118
119 void MaximizeModeController::set_show_notifications(bool should_show) {
120 bool did_change = show_notifications_ != should_show;
121 show_notifications_ = should_show;
122 if (did_change)
123 NotifyBlockingStateChanged();
124 }
125
126 bool MaximizeModeController::ShouldShowNotificationAsPopup(
127 const message_center::NotifierId& notifier_id) const {
128 if (notifier_id.id == ash::system_notifier::kNotifierDisplay)
129 return show_notifications_;
130 return true;
jonross 2014/05/09 14:57:33 on 137 you fall back to checking with the message
bruthig 2014/05/14 00:36:16 For some reason ShouldShowNotificationAsPopup is a
131 }
132
133 bool MaximizeModeController::ShouldShowNotification(
134 const message_center::NotifierId& notifier_id) const {
135 if (notifier_id.id == ash::system_notifier::kNotifierDisplay)
136 return show_notifications_;
137 return message_center::NotificationBlocker::ShouldShowNotification(
138 notifier_id);
139 }
140
113 void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base, 141 void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base,
114 const gfx::Vector3dF& lid) { 142 const gfx::Vector3dF& lid) {
115 static const gfx::Vector3dF hinge_vector(0.0f, 1.0f, 0.0f); 143 static const gfx::Vector3dF hinge_vector(0.0f, 1.0f, 0.0f);
116 bool maximize_mode_engaged = 144 bool maximize_mode_engaged =
117 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled(); 145 Shell::GetInstance()->IsMaximizeModeWindowManagerEnabled();
118 // Ignore the component of acceleration parallel to the hinge for the purposes 146 // Ignore the component of acceleration parallel to the hinge for the purposes
119 // of hinge angle calculation. 147 // of hinge angle calculation.
120 gfx::Vector3dF base_flattened(base); 148 gfx::Vector3dF base_flattened(base);
121 gfx::Vector3dF lid_flattened(lid); 149 gfx::Vector3dF lid_flattened(lid);
122 base_flattened.set_y(0.0f); 150 base_flattened.set_y(0.0f);
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 new_rotation = gfx::Display::ROTATE_0; 230 new_rotation = gfx::Display::ROTATE_0;
203 else if (angle < 180.0f) 231 else if (angle < 180.0f)
204 new_rotation = gfx::Display::ROTATE_270; 232 new_rotation = gfx::Display::ROTATE_270;
205 else if (angle < 270.0f) 233 else if (angle < 270.0f)
206 new_rotation = gfx::Display::ROTATE_180; 234 new_rotation = gfx::Display::ROTATE_180;
207 235
208 // When exiting maximize mode return rotation to 0. When entering, rotate to 236 // When exiting maximize mode return rotation to 0. When entering, rotate to
209 // match screen orientation. 237 // match screen orientation.
210 if (new_rotation == gfx::Display::ROTATE_0 || 238 if (new_rotation == gfx::Display::ROTATE_0 ||
211 maximize_mode_engaged) { 239 maximize_mode_engaged) {
212 display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(), 240 SetDisplayRotation(display_manager,
213 new_rotation); 241 gfx::Display::InternalDisplayId(),
242 new_rotation);
214 } 243 }
215 } 244 }
216 245
246 // Sets the display's rotation.
247 void MaximizeModeController::SetDisplayRotation(
248 DisplayManager* display_manager,
249 int64 display_id,
250 gfx::Display::Rotation rotation) {
251 // Suppress message centre notifications for screen rotations caused
252 // by accelerometer events because it should be obvious why the orientation
253 // changed.
254 set_show_notifications(false);
flackr 2014/05/08 21:56:15 It still seems like it would be nicer to scope the
bruthig 2014/05/14 00:36:16 Done.
255 display_manager->SetDisplayRotation(display_id, rotation);
256 message_center::MessageCenter* message_center =
257 message_center::MessageCenter::Get();
258 if (message_center->HasNotification(TrayDisplay::kNotificationId))
flackr 2014/05/08 21:56:15 This is a bit hacky, this could probably use a tod
bruthig 2014/05/14 00:36:16 Done.
259 message_center->MarkSinglePopupAsShown(TrayDisplay::kNotificationId, true);
260 set_show_notifications(true);
261 }
262
217 void MaximizeModeController::EnterMaximizeMode() { 263 void MaximizeModeController::EnterMaximizeMode() {
218 // TODO(jonross): Create a property on the display to track user rotations. 264 // TODO(jonross): Create a property on the display to track user rotations.
219 // We should lock based on this property. Furthermore we should apply the 265 // We should lock based on this property. Furthermore we should apply the
220 // lock if the user changes the display settings while we are in maximize 266 // lock if the user changes the display settings while we are in maximize
221 // mode. https://crbug.com/369505 267 // mode. https://crbug.com/369505
222 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 268 DisplayManager* display_manager = Shell::GetInstance()->display_manager();
223 gfx::Display::Rotation current_rotation = display_manager-> 269 gfx::Display::Rotation current_rotation = display_manager->
224 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation(); 270 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
225 rotation_locked_ = current_rotation != gfx::Display::ROTATE_0; 271 rotation_locked_ = current_rotation != gfx::Display::ROTATE_0;
226 Shell::GetInstance()->EnableMaximizeModeWindowManager(true); 272 Shell::GetInstance()->EnableMaximizeModeWindowManager(true);
227 event_blocker_.reset(new MaximizeModeEventBlocker); 273 event_blocker_.reset(new MaximizeModeEventBlocker);
228 } 274 }
229 275
230 void MaximizeModeController::LeaveMaximizeMode() { 276 void MaximizeModeController::LeaveMaximizeMode() {
231 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); 277 DisplayManager* display_manager = Shell::GetInstance()->display_manager();
232 gfx::Display::Rotation current_rotation = display_manager-> 278 gfx::Display::Rotation current_rotation = display_manager->
233 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation(); 279 GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
234 if (!rotation_locked_ && current_rotation != gfx::Display::ROTATE_0) { 280 if (!rotation_locked_ && current_rotation != gfx::Display::ROTATE_0) {
235 display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(), 281 SetDisplayRotation(display_manager,
236 gfx::Display::ROTATE_0); 282 gfx::Display::InternalDisplayId(),
283 gfx::Display::ROTATE_0);
237 } 284 }
238 Shell::GetInstance()->EnableMaximizeModeWindowManager(false); 285 Shell::GetInstance()->EnableMaximizeModeWindowManager(false);
239 event_blocker_.reset(); 286 event_blocker_.reset();
240 } 287 }
241 288
242 } // namespace ash 289 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698