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

Side by Side Diff: ash/display/display_manager_unittest.cc

Issue 196413017: Auto rotate on lid rotation changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Stick to current rotation and add tests. Created 6 years, 8 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/display/display_manager.h" 5 #include "ash/display/display_manager.h"
6 6
7 #include "ash/accelerometer/accelerometer_controller.h"
7 #include "ash/display/display_controller.h" 8 #include "ash/display/display_controller.h"
8 #include "ash/display/display_layout_store.h" 9 #include "ash/display/display_layout_store.h"
9 #include "ash/screen_util.h" 10 #include "ash/screen_util.h"
10 #include "ash/shell.h" 11 #include "ash/shell.h"
11 #include "ash/test/ash_test_base.h" 12 #include "ash/test/ash_test_base.h"
12 #include "ash/test/display_manager_test_api.h" 13 #include "ash/test/display_manager_test_api.h"
13 #include "ash/test/mirror_window_test_api.h" 14 #include "ash/test/mirror_window_test_api.h"
14 #include "base/format_macros.h" 15 #include "base/format_macros.h"
15 #include "base/strings/string_number_conversions.h" 16 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/stringprintf.h" 17 #include "base/strings/stringprintf.h"
17 #include "ui/aura/env.h" 18 #include "ui/aura/env.h"
18 #include "ui/aura/test/event_generator.h" 19 #include "ui/aura/test/event_generator.h"
19 #include "ui/aura/window_observer.h" 20 #include "ui/aura/window_observer.h"
20 #include "ui/aura/window_tree_host.h" 21 #include "ui/aura/window_tree_host.h"
21 #include "ui/gfx/display_observer.h" 22 #include "ui/gfx/display_observer.h"
22 #include "ui/gfx/display.h" 23 #include "ui/gfx/display.h"
23 #include "ui/gfx/screen.h" 24 #include "ui/gfx/screen.h"
24 #include "ui/gfx/screen_type_delegate.h" 25 #include "ui/gfx/screen_type_delegate.h"
26 #include "ui/gfx/vector3d_f.h"
25 27
26 namespace ash { 28 namespace ash {
27 namespace internal { 29 namespace internal {
28 30
29 using std::vector; 31 using std::vector;
30 using std::string; 32 using std::string;
31 33
32 using base::StringPrintf; 34 using base::StringPrintf;
33 35
34 namespace { 36 namespace {
35 37
36 std::string ToDisplayName(int64 id) { 38 std::string ToDisplayName(int64 id) {
37 return "x-" + base::Int64ToString(id); 39 return "x-" + base::Int64ToString(id);
38 } 40 }
39 41
42 const float DegreesToRadians(float degrees) {
43 return degrees * 3.1415926f / 180.0f;
44 }
45
40 } // namespace 46 } // namespace
41 47
42 class DisplayManagerTest : public test::AshTestBase, 48 class DisplayManagerTest : public test::AshTestBase,
43 public gfx::DisplayObserver, 49 public gfx::DisplayObserver,
44 public aura::WindowObserver { 50 public aura::WindowObserver {
45 public: 51 public:
46 DisplayManagerTest() 52 DisplayManagerTest()
47 : removed_count_(0U), 53 : removed_count_(0U),
48 root_window_destroyed_(false) { 54 root_window_destroyed_(false) {
49 } 55 }
50 virtual ~DisplayManagerTest() {} 56 virtual ~DisplayManagerTest() {}
51 57
52 virtual void SetUp() OVERRIDE { 58 virtual void SetUp() OVERRIDE {
53 AshTestBase::SetUp(); 59 AshTestBase::SetUp();
54 Shell::GetScreen()->AddObserver(this); 60 Shell::GetScreen()->AddObserver(this);
55 Shell::GetPrimaryRootWindow()->AddObserver(this); 61 Shell::GetPrimaryRootWindow()->AddObserver(this);
62
63 // Set the primary display to be the internal display for the accelerometer
64 // tests.
65 gfx::Display::SetInternalDisplayId(display_manager()->GetDisplayAt(0).id());
66
67 // Remove the accelerometer observer so that tests can deliver test values.
68 Shell::GetInstance()->accelerometer_controller()->RemoveObserver(
69 display_manager());
56 } 70 }
57 virtual void TearDown() OVERRIDE { 71 virtual void TearDown() OVERRIDE {
72 Shell::GetInstance()->accelerometer_controller()->AddObserver(
73 display_manager());
58 Shell::GetPrimaryRootWindow()->RemoveObserver(this); 74 Shell::GetPrimaryRootWindow()->RemoveObserver(this);
59 Shell::GetScreen()->RemoveObserver(this); 75 Shell::GetScreen()->RemoveObserver(this);
60 AshTestBase::TearDown(); 76 AshTestBase::TearDown();
61 } 77 }
62 78
63 DisplayManager* display_manager() { 79 DisplayManager* display_manager() {
64 return Shell::GetInstance()->display_manager(); 80 return Shell::GetInstance()->display_manager();
65 } 81 }
82 const DisplayManager* display_manager() const {
83 return Shell::GetInstance()->display_manager();
84 }
66 const vector<gfx::Display>& changed() const { return changed_; } 85 const vector<gfx::Display>& changed() const { return changed_; }
67 const vector<gfx::Display>& added() const { return added_; } 86 const vector<gfx::Display>& added() const { return added_; }
68 87
69 string GetCountSummary() const { 88 string GetCountSummary() const {
70 return StringPrintf("%" PRIuS " %" PRIuS " %" PRIuS, 89 return StringPrintf("%" PRIuS " %" PRIuS " %" PRIuS,
71 changed_.size(), added_.size(), removed_count_); 90 changed_.size(), added_.size(), removed_count_);
72 } 91 }
73 92
74 void reset() { 93 void reset() {
75 changed_.clear(); 94 changed_.clear();
76 added_.clear(); 95 added_.clear();
77 removed_count_ = 0U; 96 removed_count_ = 0U;
78 root_window_destroyed_ = false; 97 root_window_destroyed_ = false;
79 } 98 }
80 99
100 void TriggerAccelerometerUpdate(const gfx::Vector3dF& base,
101 const gfx::Vector3dF& lid) {
102 display_manager()->OnAccelerometerUpdated(base, lid);
103 }
104
105 gfx::Display::Rotation GetInternalDisplayRotation() const {
106 return display_manager()->GetDisplayInfo(
107 gfx::Display::InternalDisplayId()).rotation();
108 }
109
81 bool root_window_destroyed() const { 110 bool root_window_destroyed() const {
82 return root_window_destroyed_; 111 return root_window_destroyed_;
83 } 112 }
84 113
85 const DisplayInfo& GetDisplayInfo(const gfx::Display& display) { 114 const DisplayInfo& GetDisplayInfo(const gfx::Display& display) {
86 return display_manager()->GetDisplayInfo(display.id()); 115 return display_manager()->GetDisplayInfo(display.id());
87 } 116 }
88 117
89 const DisplayInfo& GetDisplayInfoAt(int index) { 118 const DisplayInfo& GetDisplayInfoAt(int index) {
90 return GetDisplayInfo(display_manager()->GetDisplayAt(index)); 119 return GetDisplayInfo(display_manager()->GetDisplayAt(index));
(...skipping 1099 matching lines...) Expand 10 before | Expand all | Expand 10 after
1190 EXPECT_EQ("300x400", host1->GetBounds().size().ToString()); 1219 EXPECT_EQ("300x400", host1->GetBounds().size().ToString());
1191 1220
1192 UpdateDisplay("100+200-100x200,300+500-200x300"); 1221 UpdateDisplay("100+200-100x200,300+500-200x300");
1193 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays()); 1222 ASSERT_EQ(2, Shell::GetScreen()->GetNumDisplays());
1194 EXPECT_EQ("100,200", host0->GetBounds().origin().ToString()); 1223 EXPECT_EQ("100,200", host0->GetBounds().origin().ToString());
1195 EXPECT_EQ("100x200", host0->GetBounds().size().ToString()); 1224 EXPECT_EQ("100x200", host0->GetBounds().size().ToString());
1196 EXPECT_EQ("300,500", host1->GetBounds().origin().ToString()); 1225 EXPECT_EQ("300,500", host1->GetBounds().origin().ToString());
1197 EXPECT_EQ("200x300", host1->GetBounds().size().ToString()); 1226 EXPECT_EQ("200x300", host1->GetBounds().size().ToString());
1198 } 1227 }
1199 1228
1229 // Tests that accelerometer readings in each of the screen angles will trigger
1230 // a rotation of the internal display.
1231 TEST_F(DisplayManagerTest, AccelerometerRotation) {
1232 TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 1.0f, 0.0f),
1233 gfx::Vector3dF(0.0f, 1.0f, 0.0f));
1234 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
1235 TriggerAccelerometerUpdate(gfx::Vector3dF(1.0f, 0.0f, 0.0f),
1236 gfx::Vector3dF(1.0f, 0.0f, 0.0f));
1237 EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation());
1238 TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, -1.0f, 0.0f),
1239 gfx::Vector3dF(0.0f, -1.0f, 0.0f));
1240 EXPECT_EQ(gfx::Display::ROTATE_270, GetInternalDisplayRotation());
1241 TriggerAccelerometerUpdate(gfx::Vector3dF(-1.0f, 0.0f, 0.0f),
1242 gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
1243 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1244 }
1245
1246 // Tests that low angles are ignored by the accelerometer (i.e. when the device
1247 // is almost laying flat).
1248 TEST_F(DisplayManagerTest, AccelerometerIgnoresLowAngles) {
1249 TriggerAccelerometerUpdate(gfx::Vector3dF(-1.0f, 0.0f, -1.0f),
1250 gfx::Vector3dF(-1.0f, 0.0f, -1.0f));
1251 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1252 TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 0.2f, -1.0f),
1253 gfx::Vector3dF(0.0f, 0.2f, -1.0f));
1254 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1255 TriggerAccelerometerUpdate(gfx::Vector3dF(0.2f, 0.0f, -1.0f),
1256 gfx::Vector3dF(0.2f, 0.0f, -1.0f));
1257 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1258 TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, -0.2f, -1.0f),
1259 gfx::Vector3dF(0.0f, -0.2f, -1.0f));
1260 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1261 TriggerAccelerometerUpdate(gfx::Vector3dF(-0.2f, 0.0f, -1.0f),
1262 gfx::Vector3dF(-0.2f, 0.0f, -1.0f));
1263 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1264 }
1265
1266 // Tests that the display will stick to the current orientation beyond the
1267 // halfway point, preventing frequent updates back and forth.
1268 TEST_F(DisplayManagerTest, AccelerometerSticky) {
1269 gfx::Vector3dF gravity(-1.0f, 0.0f, 0.0f);
1270 TriggerAccelerometerUpdate(gravity, gravity);
1271 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1272
1273 // Turn past half-way point to next direction and rotation should remain
1274 // the same.
1275 float degrees = 50.0;
1276 gravity.set_x(-cos(DegreesToRadians(degrees)));
1277 gravity.set_y(sin(DegreesToRadians(degrees)));
1278 TriggerAccelerometerUpdate(gravity, gravity);
1279 EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
1280
1281 // Turn more and the screen should rotate.
1282 degrees = 70.0;
1283 gravity.set_x(-cos(DegreesToRadians(degrees)));
1284 gravity.set_y(sin(DegreesToRadians(degrees)));
1285 TriggerAccelerometerUpdate(gravity, gravity);
1286 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
1287
1288 // Turn back just beyond the half-way point and the new rotation should
1289 // still be in effect.
1290 degrees = 40.0;
1291 gravity.set_x(-cos(DegreesToRadians(degrees)));
1292 gravity.set_y(sin(DegreesToRadians(degrees)));
1293 TriggerAccelerometerUpdate(gravity, gravity);
1294 EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
1295 }
1200 1296
1201 class ScreenShutdownTest : public test::AshTestBase { 1297 class ScreenShutdownTest : public test::AshTestBase {
1202 public: 1298 public:
1203 ScreenShutdownTest() { 1299 ScreenShutdownTest() {
1204 } 1300 }
1205 virtual ~ScreenShutdownTest() {} 1301 virtual ~ScreenShutdownTest() {}
1206 1302
1207 virtual void TearDown() OVERRIDE { 1303 virtual void TearDown() OVERRIDE {
1208 gfx::Screen* orig_screen = 1304 gfx::Screen* orig_screen =
1209 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE); 1305 gfx::Screen::GetScreenByType(gfx::SCREEN_TYPE_ALTERNATE);
(...skipping 15 matching lines...) Expand all
1225 }; 1321 };
1226 1322
1227 TEST_F(ScreenShutdownTest, ScreenAfterShutdown) { 1323 TEST_F(ScreenShutdownTest, ScreenAfterShutdown) {
1228 if (!SupportsMultipleDisplays()) 1324 if (!SupportsMultipleDisplays())
1229 return; 1325 return;
1230 UpdateDisplay("500x300,800x400"); 1326 UpdateDisplay("500x300,800x400");
1231 } 1327 }
1232 1328
1233 } // namespace internal 1329 } // namespace internal
1234 } // namespace ash 1330 } // namespace ash
OLDNEW
« ash/display/display_manager.h ('K') | « ash/display/display_manager.cc ('k') | ash/shell.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698