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 <math.h> | 5 #include <math.h> |
6 | 6 |
7 #include "ash/wm/maximize_mode/maximize_mode_controller.h" | 7 #include "ash/wm/maximize_mode/maximize_mode_controller.h" |
8 | 8 |
9 #include "ash/accelerometer/accelerometer_controller.h" | 9 #include "ash/accelerometer/accelerometer_controller.h" |
10 #include "ash/ash_switches.h" | 10 #include "ash/ash_switches.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 extern const float kAccelerometerFullyOpenTestData[]; | 50 extern const float kAccelerometerFullyOpenTestData[]; |
51 extern const size_t kAccelerometerFullyOpenTestDataLength; | 51 extern const size_t kAccelerometerFullyOpenTestDataLength; |
52 | 52 |
53 class MaximizeModeControllerTest : public test::AshTestBase { | 53 class MaximizeModeControllerTest : public test::AshTestBase { |
54 public: | 54 public: |
55 MaximizeModeControllerTest() {} | 55 MaximizeModeControllerTest() {} |
56 ~MaximizeModeControllerTest() override {} | 56 ~MaximizeModeControllerTest() override {} |
57 | 57 |
58 void SetUp() override { | 58 void SetUp() override { |
59 test::AshTestBase::SetUp(); | 59 test::AshTestBase::SetUp(); |
60 Shell::GetInstance()->accelerometer_controller()->RemoveObserver( | |
61 maximize_mode_controller()); | |
62 | |
63 // Set the first display to be the internal display for the accelerometer | 60 // Set the first display to be the internal display for the accelerometer |
64 // screen rotation tests. | 61 // screen rotation tests. |
65 test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()). | 62 test::DisplayManagerTestApi(Shell::GetInstance()->display_manager()). |
66 SetFirstDisplayAsInternalDisplay(); | 63 SetFirstDisplayAsInternalDisplay(); |
67 } | 64 } |
68 | 65 |
69 void TearDown() override { | |
70 Shell::GetInstance()->accelerometer_controller()->AddObserver( | |
71 maximize_mode_controller()); | |
72 test::AshTestBase::TearDown(); | |
73 } | |
74 | |
75 MaximizeModeController* maximize_mode_controller() { | 66 MaximizeModeController* maximize_mode_controller() { |
76 return Shell::GetInstance()->maximize_mode_controller(); | 67 return Shell::GetInstance()->maximize_mode_controller(); |
77 } | 68 } |
78 | 69 |
79 void TriggerLidUpdate(const gfx::Vector3dF& lid) { | 70 void TriggerLidUpdate(const gfx::Vector3dF& lid) { |
80 ui::AccelerometerUpdate update; | 71 ui::AccelerometerUpdate update; |
81 update.Set(ui::ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); | 72 update.Set(ui::ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); |
82 maximize_mode_controller()->OnAccelerometerUpdated(update); | 73 maximize_mode_controller()->OnAccelerometerUpdated(update); |
83 } | 74 } |
84 | 75 |
85 void TriggerBaseAndLidUpdate(const gfx::Vector3dF& base, | 76 void TriggerBaseAndLidUpdate(const gfx::Vector3dF& base, |
86 const gfx::Vector3dF& lid) { | 77 const gfx::Vector3dF& lid) { |
87 ui::AccelerometerUpdate update; | 78 ui::AccelerometerUpdate update; |
88 update.Set(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, | 79 update.Set(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, |
89 base.x(), base.y(), base.z()); | 80 base.x(), base.y(), base.z()); |
90 update.Set(ui::ACCELEROMETER_SOURCE_SCREEN, | 81 update.Set(ui::ACCELEROMETER_SOURCE_SCREEN, |
91 lid.x(), lid.y(), lid.z()); | 82 lid.x(), lid.y(), lid.z()); |
92 maximize_mode_controller()->OnAccelerometerUpdated(update); | 83 maximize_mode_controller()->OnAccelerometerUpdated(update); |
93 } | 84 } |
94 | 85 |
| 86 #if defined(OS_CHROMEOS) |
| 87 void TriggerAccelerometerController(const gfx::Vector3dF& base, |
| 88 const gfx::Vector3dF& lid) { |
| 89 ui::AccelerometerUpdate update; |
| 90 update.Set(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD, base.x(), base.y(), |
| 91 base.z()); |
| 92 update.Set(ui::ACCELEROMETER_SOURCE_SCREEN, lid.x(), lid.y(), lid.z()); |
| 93 Shell::GetInstance()->accelerometer_controller()->HandleAccelerometerUpdate( |
| 94 update); |
| 95 } |
| 96 #endif |
| 97 |
95 bool IsMaximizeModeStarted() { | 98 bool IsMaximizeModeStarted() { |
96 return maximize_mode_controller()->IsMaximizeModeWindowManagerEnabled(); | 99 return maximize_mode_controller()->IsMaximizeModeWindowManagerEnabled(); |
97 } | 100 } |
98 | 101 |
99 gfx::Display::Rotation GetInternalDisplayRotation() const { | 102 gfx::Display::Rotation GetInternalDisplayRotation() const { |
100 return Shell::GetInstance()->display_manager()->GetDisplayInfo( | 103 return Shell::GetInstance()->display_manager()->GetDisplayInfo( |
101 gfx::Display::InternalDisplayId()).rotation(); | 104 gfx::Display::InternalDisplayId()).rotation(); |
102 } | 105 } |
103 | 106 |
104 void SetInternalDisplayRotation(gfx::Display::Rotation rotation) const { | 107 void SetInternalDisplayRotation(gfx::Display::Rotation rotation) const { |
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
303 gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); | 306 gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); |
304 EXPECT_TRUE(IsMaximizeModeStarted()); | 307 EXPECT_TRUE(IsMaximizeModeStarted()); |
305 | 308 |
306 // Normal 90 degree orientation but near vertical should stay in maximize | 309 // Normal 90 degree orientation but near vertical should stay in maximize |
307 // mode. | 310 // mode. |
308 TriggerBaseAndLidUpdate(gfx::Vector3dF(kMeanGravity, 0.0f, -0.1f), | 311 TriggerBaseAndLidUpdate(gfx::Vector3dF(kMeanGravity, 0.0f, -0.1f), |
309 gfx::Vector3dF(kMeanGravity, -0.1f, 0.0f)); | 312 gfx::Vector3dF(kMeanGravity, -0.1f, 0.0f)); |
310 EXPECT_TRUE(IsMaximizeModeStarted()); | 313 EXPECT_TRUE(IsMaximizeModeStarted()); |
311 } | 314 } |
312 | 315 |
313 // Tests that only getting a lid accelerometer update will enter maximize | 316 #if defined(OS_CHROMEOS) |
314 // mode and rotate the screen. | |
315 TEST_F(MaximizeModeControllerTest, LidOnlyDisplayRotation) { | |
316 ASSERT_FALSE(IsMaximizeModeStarted()); | |
317 // Test rotating in all directions. | |
318 TriggerLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); | |
319 // The first update should have entered maximize mode. | |
320 ASSERT_TRUE(IsMaximizeModeStarted()); | |
321 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
322 TriggerLidUpdate(gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); | |
323 EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation()); | |
324 TriggerLidUpdate(gfx::Vector3dF(kMeanGravity, 0.0f, 0.0f)); | |
325 EXPECT_EQ(gfx::Display::ROTATE_270, GetInternalDisplayRotation()); | |
326 TriggerLidUpdate(gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
327 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
328 } | |
329 | |
330 // Tests that accelerometer readings in each of the screen angles will trigger a | |
331 // rotation of the internal display. | |
332 TEST_F(MaximizeModeControllerTest, DisplayRotation) { | |
333 // Trigger maximize mode by opening to 270. | |
334 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
335 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
336 ASSERT_TRUE(IsMaximizeModeStarted()); | |
337 | |
338 // Now test rotating in all directions. | |
339 TriggerBaseAndLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f), | |
340 gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); | |
341 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
342 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f), | |
343 gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); | |
344 EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation()); | |
345 TriggerBaseAndLidUpdate(gfx::Vector3dF(kMeanGravity, 0.0f, 0.0f), | |
346 gfx::Vector3dF(kMeanGravity, 0.0f, 0.0f)); | |
347 EXPECT_EQ(gfx::Display::ROTATE_270, GetInternalDisplayRotation()); | |
348 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, kMeanGravity, 0.0f), | |
349 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
350 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
351 } | |
352 | |
353 // Tests that low angles are ignored by the accelerometer (i.e. when the device | |
354 // is almost laying flat). | |
355 TEST_F(MaximizeModeControllerTest, RotationIgnoresLowAngles) { | |
356 // Trigger maximize mode by opening to 270. | |
357 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
358 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
359 ASSERT_TRUE(IsMaximizeModeStarted()); | |
360 | |
361 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, kMeanGravity, kMeanGravity), | |
362 gfx::Vector3dF(0.0f, -kMeanGravity, -kMeanGravity)); | |
363 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
364 TriggerBaseAndLidUpdate(gfx::Vector3dF(-2.0f, 0.0f, kMeanGravity), | |
365 gfx::Vector3dF(-2.0f, 0.0f, -kMeanGravity)); | |
366 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
367 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, -2.0f, kMeanGravity), | |
368 gfx::Vector3dF(0.0f, 2.0f, -kMeanGravity)); | |
369 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
370 TriggerBaseAndLidUpdate(gfx::Vector3dF(2.0f, 0.0f, kMeanGravity), | |
371 gfx::Vector3dF(2.0f, 0.0f, -kMeanGravity)); | |
372 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
373 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 2.0f, kMeanGravity), | |
374 gfx::Vector3dF(0.0f, -2.0f, -kMeanGravity)); | |
375 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
376 } | |
377 | |
378 // Tests that the display will stick to the current orientation beyond the | |
379 // halfway point, preventing frequent updates back and forth. | |
380 TEST_F(MaximizeModeControllerTest, RotationSticky) { | |
381 // Trigger maximize mode by opening to 270. | |
382 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
383 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
384 ASSERT_TRUE(IsMaximizeModeStarted()); | |
385 | |
386 gfx::Vector3dF gravity(0.0f, -kMeanGravity, 0.0f); | |
387 TriggerBaseAndLidUpdate(gravity, gravity); | |
388 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
389 | |
390 // Turn past half-way point to next direction and rotation should remain | |
391 // the same. | |
392 float degrees = 50.0; | |
393 gravity.set_x(-sin(degrees * kDegreesToRadians) * kMeanGravity); | |
394 gravity.set_y(-cos(degrees * kDegreesToRadians) * kMeanGravity); | |
395 TriggerBaseAndLidUpdate(gravity, gravity); | |
396 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
397 | |
398 // Turn more and the screen should rotate. | |
399 degrees = 70.0; | |
400 gravity.set_x(-sin(degrees * kDegreesToRadians) * kMeanGravity); | |
401 gravity.set_y(-cos(degrees * kDegreesToRadians) * kMeanGravity); | |
402 TriggerBaseAndLidUpdate(gravity, gravity); | |
403 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
404 | |
405 // Turn back just beyond the half-way point and the new rotation should | |
406 // still be in effect. | |
407 degrees = 40.0; | |
408 gravity.set_x(-sin(degrees * kDegreesToRadians) * kMeanGravity); | |
409 gravity.set_y(-cos(degrees * kDegreesToRadians) * kMeanGravity); | |
410 TriggerBaseAndLidUpdate(gravity, gravity); | |
411 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
412 } | |
413 | 317 |
414 // Tests that the screen only rotates when maximize mode is engaged, and will | 318 // Tests that the screen only rotates when maximize mode is engaged, and will |
415 // return to the standard orientation on exiting maximize mode. | 319 // return to the standard orientation on exiting maximize mode. |
416 TEST_F(MaximizeModeControllerTest, RotationOnlyInMaximizeMode) { | 320 TEST_F(MaximizeModeControllerTest, RotationOnlyInMaximizeMode) { |
417 // Rotate on side with lid only open 90 degrees. | 321 // Rotate on side with lid only open 90 degrees. |
418 TriggerBaseAndLidUpdate(gfx::Vector3dF(-9.5f, 0.0f, -3.5f), | 322 TriggerAccelerometerController(gfx::Vector3dF(-9.5f, 0.0f, -3.5f), |
419 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); | 323 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); |
420 ASSERT_FALSE(IsMaximizeModeStarted()); | 324 ASSERT_FALSE(IsMaximizeModeStarted()); |
421 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | 325 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); |
422 | 326 |
423 // Open lid, screen should now rotate to match orientation. | 327 // Open lid, screen should now rotate to match orientation. |
424 TriggerBaseAndLidUpdate(gfx::Vector3dF(-9.5f, 0.0f, 3.5f), | 328 TriggerAccelerometerController(gfx::Vector3dF(-9.5f, 0.0f, 3.5f), |
425 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); | 329 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); |
426 ASSERT_TRUE(IsMaximizeModeStarted()); | 330 ASSERT_TRUE(IsMaximizeModeStarted()); |
427 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | 331 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); |
428 | 332 |
429 // Close lid back to 90, screen should rotate back. | 333 // Close lid back to 90, screen should rotate back. |
430 TriggerBaseAndLidUpdate(gfx::Vector3dF(-9.5f, 0.0f, -3.5f), | 334 TriggerAccelerometerController(gfx::Vector3dF(-9.5f, 0.0f, -3.5f), |
431 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); | 335 gfx::Vector3dF(-9.5f, -3.5f, 0.0f)); |
432 ASSERT_FALSE(IsMaximizeModeStarted()); | 336 ASSERT_FALSE(IsMaximizeModeStarted()); |
433 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | 337 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); |
434 } | 338 } |
435 | 339 #endif // OS_CHROMEOS |
436 | 340 |
437 TEST_F(MaximizeModeControllerTest, LaptopTest) { | 341 TEST_F(MaximizeModeControllerTest, LaptopTest) { |
438 // Feeds in sample accelerometer data and verifies that there are no | 342 // Feeds in sample accelerometer data and verifies that there are no |
439 // transitions into touchview / maximize mode while shaking the device around | 343 // transitions into touchview / maximize mode while shaking the device around |
440 // with the hinge at less than 180 degrees. Note the conversion from device | 344 // with the hinge at less than 180 degrees. Note the conversion from device |
441 // data to accelerometer updates consistent with accelerometer_reader.cc. | 345 // data to accelerometer updates consistent with accelerometer_reader.cc. |
442 ASSERT_EQ(0u, kAccelerometerLaptopModeTestDataLength % 6); | 346 ASSERT_EQ(0u, kAccelerometerLaptopModeTestDataLength % 6); |
443 for (size_t i = 0; i < kAccelerometerLaptopModeTestDataLength / 6; ++i) { | 347 for (size_t i = 0; i < kAccelerometerLaptopModeTestDataLength / 6; ++i) { |
444 gfx::Vector3dF base(-kAccelerometerLaptopModeTestData[i * 6 + 1], | 348 gfx::Vector3dF base(-kAccelerometerLaptopModeTestData[i * 6 + 1], |
445 -kAccelerometerLaptopModeTestData[i * 6], | 349 -kAccelerometerLaptopModeTestData[i * 6], |
(...skipping 30 matching lines...) Expand all Loading... |
476 kAccelerometerFullyOpenTestData[i * 6 + 3], | 380 kAccelerometerFullyOpenTestData[i * 6 + 3], |
477 kAccelerometerFullyOpenTestData[i * 6 + 5]); | 381 kAccelerometerFullyOpenTestData[i * 6 + 5]); |
478 lid.Scale(kMeanGravity); | 382 lid.Scale(kMeanGravity); |
479 TriggerBaseAndLidUpdate(base, lid); | 383 TriggerBaseAndLidUpdate(base, lid); |
480 // There are a lot of samples, so ASSERT rather than EXPECT to only generate | 384 // There are a lot of samples, so ASSERT rather than EXPECT to only generate |
481 // one failure rather than potentially hundreds. | 385 // one failure rather than potentially hundreds. |
482 ASSERT_TRUE(IsMaximizeModeStarted()); | 386 ASSERT_TRUE(IsMaximizeModeStarted()); |
483 } | 387 } |
484 } | 388 } |
485 | 389 |
486 // Tests that the display will stick to its current orientation when the | |
487 // rotation lock has been set. | |
488 TEST_F(MaximizeModeControllerTest, RotationLockPreventsRotation) { | |
489 // Trigger maximize mode by opening to 270. | |
490 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
491 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
492 ASSERT_TRUE(IsMaximizeModeStarted()); | |
493 | |
494 gfx::Vector3dF gravity(-kMeanGravity, 0.0f, 0.0f); | |
495 | |
496 maximize_mode_controller()->SetRotationLocked(true); | |
497 | |
498 // Turn past the threshold for rotation. | |
499 float degrees = 90.0; | |
500 gravity.set_x(-sin(degrees * kDegreesToRadians) * kMeanGravity); | |
501 gravity.set_y(-cos(degrees * kDegreesToRadians) * kMeanGravity); | |
502 TriggerBaseAndLidUpdate(gravity, gravity); | |
503 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
504 | |
505 maximize_mode_controller()->SetRotationLocked(false); | |
506 TriggerBaseAndLidUpdate(gravity, gravity); | |
507 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
508 } | |
509 | |
510 // Tests that when MaximizeModeController turns off MaximizeMode that on the | |
511 // next accelerometer update the rotation lock is cleared. | |
512 TEST_F(MaximizeModeControllerTest, ExitingMaximizeModeClearRotationLock) { | |
513 // Trigger maximize mode by opening to 270. | |
514 OpenLidToAngle(270.0f); | |
515 ASSERT_TRUE(IsMaximizeModeStarted()); | |
516 | |
517 maximize_mode_controller()->SetRotationLocked(true); | |
518 | |
519 OpenLidToAngle(90.0f); | |
520 EXPECT_FALSE(IsMaximizeModeStarted()); | |
521 | |
522 // Send an update that would not relaunch MaximizeMode. | |
523 OpenLidToAngle(90.0f); | |
524 EXPECT_FALSE(maximize_mode_controller()->rotation_locked()); | |
525 } | |
526 | |
527 // The TrayDisplay class that is responsible for adding/updating MessageCenter | |
528 // notifications is only added to the SystemTray on ChromeOS. | |
529 #if defined(OS_CHROMEOS) | 390 #if defined(OS_CHROMEOS) |
530 // Tests that the screen rotation notifications are suppressed when | |
531 // triggered by the accelerometer. | |
532 TEST_F(MaximizeModeControllerTest, BlockRotationNotifications) { | |
533 test::TestSystemTrayDelegate* tray_delegate = | |
534 static_cast<test::TestSystemTrayDelegate*>( | |
535 Shell::GetInstance()->system_tray_delegate()); | |
536 tray_delegate->set_should_show_display_notification(true); | |
537 | |
538 message_center::MessageCenter* message_center = | |
539 message_center::MessageCenter::Get(); | |
540 | |
541 // Make sure notifications are still displayed when | |
542 // adjusting the screen rotation directly when not in maximize mode | |
543 ASSERT_FALSE(IsMaximizeModeStarted()); | |
544 ASSERT_NE(gfx::Display::ROTATE_180, GetInternalDisplayRotation()); | |
545 ASSERT_EQ(0u, message_center->NotificationCount()); | |
546 ASSERT_FALSE(message_center->HasPopupNotifications()); | |
547 SetInternalDisplayRotation(gfx::Display::ROTATE_180); | |
548 EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation()); | |
549 EXPECT_EQ(1u, message_center->NotificationCount()); | |
550 EXPECT_TRUE(message_center->HasPopupNotifications()); | |
551 | |
552 // Reset the screen rotation. | |
553 SetInternalDisplayRotation(gfx::Display::ROTATE_0); | |
554 // Clear all notifications | |
555 message_center->RemoveAllNotifications(false); | |
556 // Trigger maximize mode by opening to 270. | |
557 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
558 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
559 EXPECT_TRUE(IsMaximizeModeStarted()); | |
560 EXPECT_EQ(0u, message_center->NotificationCount()); | |
561 EXPECT_FALSE(message_center->HasPopupNotifications()); | |
562 | |
563 // Make sure notifications are still displayed when | |
564 // adjusting the screen rotation directly when in maximize mode | |
565 ASSERT_NE(gfx::Display::ROTATE_270, GetInternalDisplayRotation()); | |
566 SetInternalDisplayRotation(gfx::Display::ROTATE_270); | |
567 maximize_mode_controller()->SetRotationLocked(false); | |
568 EXPECT_EQ(gfx::Display::ROTATE_270, GetInternalDisplayRotation()); | |
569 EXPECT_EQ(1u, message_center->NotificationCount()); | |
570 EXPECT_TRUE(message_center->HasPopupNotifications()); | |
571 | |
572 // Clear all notifications | |
573 message_center->RemoveAllNotifications(false); | |
574 EXPECT_EQ(0u, message_center->NotificationCount()); | |
575 EXPECT_FALSE(message_center->HasPopupNotifications()); | |
576 | |
577 // Make sure notifications are blocked when adjusting the screen rotation | |
578 // via the accelerometer while in maximize mode | |
579 // Rotate the screen 90 degrees | |
580 ASSERT_NE(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
581 TriggerBaseAndLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f), | |
582 gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); | |
583 ASSERT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
584 EXPECT_EQ(0u, message_center->NotificationCount()); | |
585 EXPECT_FALSE(message_center->HasPopupNotifications()); | |
586 } | |
587 #endif | |
588 | |
589 // Tests that if a user has set a display rotation that it is restored upon | |
590 // exiting maximize mode. | |
591 TEST_F(MaximizeModeControllerTest, ResetUserRotationUponExit) { | |
592 DisplayManager* display_manager = Shell::GetInstance()->display_manager(); | |
593 display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(), | |
594 gfx::Display::ROTATE_90); | |
595 | |
596 // Trigger maximize mode | |
597 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
598 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
599 ASSERT_TRUE(IsMaximizeModeStarted()); | |
600 | |
601 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f), | |
602 gfx::Vector3dF(0.0f, kMeanGravity, 0.0f)); | |
603 EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation()); | |
604 | |
605 // Exit maximize mode | |
606 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, -kMeanGravity), | |
607 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
608 EXPECT_FALSE(IsMaximizeModeStarted()); | |
609 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
610 } | |
611 | |
612 // Tests that if a user sets a display rotation that accelerometer rotation | |
613 // becomes locked. | |
614 TEST_F(MaximizeModeControllerTest, | |
615 NonAccelerometerRotationChangesLockRotation) { | |
616 // Trigger maximize mode by opening to 270. | |
617 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
618 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
619 ASSERT_FALSE(maximize_mode_controller()->rotation_locked()); | |
620 SetInternalDisplayRotation(gfx::Display::ROTATE_270); | |
621 EXPECT_TRUE(maximize_mode_controller()->rotation_locked()); | |
622 } | |
623 | |
624 // Tests that if a user changes the display rotation, while rotation is locked, | |
625 // that the updates are recorded. Upon exiting maximize mode the latest user | |
626 // rotation should be applied. | |
627 TEST_F(MaximizeModeControllerTest, UpdateUserRotationWhileRotationLocked) { | |
628 // Trigger maximize mode by opening to 270. | |
629 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, kMeanGravity), | |
630 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
631 SetInternalDisplayRotation(gfx::Display::ROTATE_270); | |
632 // User sets rotation to the same rotation that the display was at when | |
633 // maximize mode was activated. | |
634 SetInternalDisplayRotation(gfx::Display::ROTATE_0); | |
635 // Exit maximize mode | |
636 TriggerBaseAndLidUpdate(gfx::Vector3dF(0.0f, 0.0f, -kMeanGravity), | |
637 gfx::Vector3dF(0.0f, -kMeanGravity, 0.0f)); | |
638 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation()); | |
639 } | |
640 | |
641 class MaximizeModeControllerSwitchesTest : public MaximizeModeControllerTest { | 391 class MaximizeModeControllerSwitchesTest : public MaximizeModeControllerTest { |
642 public: | 392 public: |
643 MaximizeModeControllerSwitchesTest() {} | 393 MaximizeModeControllerSwitchesTest() {} |
644 ~MaximizeModeControllerSwitchesTest() override {} | 394 ~MaximizeModeControllerSwitchesTest() override {} |
645 | 395 |
646 void SetUp() override { | 396 void SetUp() override { |
647 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 397 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
648 switches::kAshEnableTouchViewTesting); | 398 switches::kAshEnableTouchViewTesting); |
649 MaximizeModeControllerTest::SetUp(); | 399 MaximizeModeControllerTest::SetUp(); |
650 } | 400 } |
651 private: | 401 private: |
652 DISALLOW_COPY_AND_ASSIGN(MaximizeModeControllerSwitchesTest); | 402 DISALLOW_COPY_AND_ASSIGN(MaximizeModeControllerSwitchesTest); |
653 }; | 403 }; |
654 | 404 |
655 // Tests that when the command line switch for testing maximize mode is on, that | 405 // Tests that when the command line switch for testing maximize mode is on, that |
656 // accelerometer updates which would normally cause it to exit do not, and that | 406 // accelerometer updates which would normally cause it to exit do not. |
657 // screen rotations still occur. | |
658 TEST_F(MaximizeModeControllerSwitchesTest, IgnoreHingeAngles) { | 407 TEST_F(MaximizeModeControllerSwitchesTest, IgnoreHingeAngles) { |
659 maximize_mode_controller()->EnableMaximizeModeWindowManager(true); | 408 maximize_mode_controller()->EnableMaximizeModeWindowManager(true); |
660 | 409 |
661 // Would normally trigger an exit from maximize mode. | 410 // Would normally trigger an exit from maximize mode. |
662 OpenLidToAngle(90.0f); | 411 OpenLidToAngle(90.0f); |
663 EXPECT_TRUE(IsMaximizeModeStarted()); | 412 EXPECT_TRUE(IsMaximizeModeStarted()); |
664 | |
665 TriggerBaseAndLidUpdate(gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f), | |
666 gfx::Vector3dF(-kMeanGravity, 0.0f, 0.0f)); | |
667 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation()); | |
668 } | 413 } |
| 414 #endif // OS_CHROMEOS |
669 | 415 |
670 } // namespace ash | 416 } // namespace ash |
OLD | NEW |