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

Unified 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, 9 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 side-by-side diff with in-line comments
Download patch
Index: ash/display/display_manager_unittest.cc
diff --git a/ash/display/display_manager_unittest.cc b/ash/display/display_manager_unittest.cc
index 85df8bb553ceb1610d871e93a44fb26b18b7aae4..41f52eff03b61cd634d69d4224682ee07ba0763d 100644
--- a/ash/display/display_manager_unittest.cc
+++ b/ash/display/display_manager_unittest.cc
@@ -4,6 +4,7 @@
#include "ash/display/display_manager.h"
+#include "ash/accelerometer/accelerometer_controller.h"
#include "ash/display/display_controller.h"
#include "ash/display/display_layout_store.h"
#include "ash/screen_util.h"
@@ -22,6 +23,7 @@
#include "ui/gfx/display.h"
#include "ui/gfx/screen.h"
#include "ui/gfx/screen_type_delegate.h"
+#include "ui/gfx/vector3d_f.h"
namespace ash {
namespace internal {
@@ -37,6 +39,10 @@ std::string ToDisplayName(int64 id) {
return "x-" + base::Int64ToString(id);
}
+const float DegreesToRadians(float degrees) {
+ return degrees * 3.1415926f / 180.0f;
+}
+
} // namespace
class DisplayManagerTest : public test::AshTestBase,
@@ -53,8 +59,18 @@ class DisplayManagerTest : public test::AshTestBase,
AshTestBase::SetUp();
Shell::GetScreen()->AddObserver(this);
Shell::GetPrimaryRootWindow()->AddObserver(this);
+
+ // Set the primary display to be the internal display for the accelerometer
+ // tests.
+ gfx::Display::SetInternalDisplayId(display_manager()->GetDisplayAt(0).id());
+
+ // Remove the accelerometer observer so that tests can deliver test values.
+ Shell::GetInstance()->accelerometer_controller()->RemoveObserver(
+ display_manager());
}
virtual void TearDown() OVERRIDE {
+ Shell::GetInstance()->accelerometer_controller()->AddObserver(
+ display_manager());
Shell::GetPrimaryRootWindow()->RemoveObserver(this);
Shell::GetScreen()->RemoveObserver(this);
AshTestBase::TearDown();
@@ -63,6 +79,9 @@ class DisplayManagerTest : public test::AshTestBase,
DisplayManager* display_manager() {
return Shell::GetInstance()->display_manager();
}
+ const DisplayManager* display_manager() const {
+ return Shell::GetInstance()->display_manager();
+ }
const vector<gfx::Display>& changed() const { return changed_; }
const vector<gfx::Display>& added() const { return added_; }
@@ -78,6 +97,16 @@ class DisplayManagerTest : public test::AshTestBase,
root_window_destroyed_ = false;
}
+ void TriggerAccelerometerUpdate(const gfx::Vector3dF& base,
+ const gfx::Vector3dF& lid) {
+ display_manager()->OnAccelerometerUpdated(base, lid);
+ }
+
+ gfx::Display::Rotation GetInternalDisplayRotation() const {
+ return display_manager()->GetDisplayInfo(
+ gfx::Display::InternalDisplayId()).rotation();
+ }
+
bool root_window_destroyed() const {
return root_window_destroyed_;
}
@@ -1197,6 +1226,73 @@ TEST_F(DisplayManagerTest, MAYBE_UpdateDisplayWithHostOrigin) {
EXPECT_EQ("200x300", host1->GetBounds().size().ToString());
}
+// Tests that accelerometer readings in each of the screen angles will trigger
+// a rotation of the internal display.
+TEST_F(DisplayManagerTest, AccelerometerRotation) {
+ TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 1.0f, 0.0f),
+ gfx::Vector3dF(0.0f, 1.0f, 0.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(1.0f, 0.0f, 0.0f),
+ gfx::Vector3dF(1.0f, 0.0f, 0.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_180, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, -1.0f, 0.0f),
+ gfx::Vector3dF(0.0f, -1.0f, 0.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_270, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(-1.0f, 0.0f, 0.0f),
+ gfx::Vector3dF(-1.0f, 0.0f, 0.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+}
+
+// Tests that low angles are ignored by the accelerometer (i.e. when the device
+// is almost laying flat).
+TEST_F(DisplayManagerTest, AccelerometerIgnoresLowAngles) {
+ TriggerAccelerometerUpdate(gfx::Vector3dF(-1.0f, 0.0f, -1.0f),
+ gfx::Vector3dF(-1.0f, 0.0f, -1.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, 0.2f, -1.0f),
+ gfx::Vector3dF(0.0f, 0.2f, -1.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(0.2f, 0.0f, -1.0f),
+ gfx::Vector3dF(0.2f, 0.0f, -1.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(0.0f, -0.2f, -1.0f),
+ gfx::Vector3dF(0.0f, -0.2f, -1.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+ TriggerAccelerometerUpdate(gfx::Vector3dF(-0.2f, 0.0f, -1.0f),
+ gfx::Vector3dF(-0.2f, 0.0f, -1.0f));
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+}
+
+// Tests that the display will stick to the current orientation beyond the
+// halfway point, preventing frequent updates back and forth.
+TEST_F(DisplayManagerTest, AccelerometerSticky) {
+ gfx::Vector3dF gravity(-1.0f, 0.0f, 0.0f);
+ TriggerAccelerometerUpdate(gravity, gravity);
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+
+ // Turn past half-way point to next direction and rotation should remain
+ // the same.
+ float degrees = 50.0;
+ gravity.set_x(-cos(DegreesToRadians(degrees)));
+ gravity.set_y(sin(DegreesToRadians(degrees)));
+ TriggerAccelerometerUpdate(gravity, gravity);
+ EXPECT_EQ(gfx::Display::ROTATE_0, GetInternalDisplayRotation());
+
+ // Turn more and the screen should rotate.
+ degrees = 70.0;
+ gravity.set_x(-cos(DegreesToRadians(degrees)));
+ gravity.set_y(sin(DegreesToRadians(degrees)));
+ TriggerAccelerometerUpdate(gravity, gravity);
+ EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
+
+ // Turn back just beyond the half-way point and the new rotation should
+ // still be in effect.
+ degrees = 40.0;
+ gravity.set_x(-cos(DegreesToRadians(degrees)));
+ gravity.set_y(sin(DegreesToRadians(degrees)));
+ TriggerAccelerometerUpdate(gravity, gravity);
+ EXPECT_EQ(gfx::Display::ROTATE_90, GetInternalDisplayRotation());
+}
class ScreenShutdownTest : public test::AshTestBase {
public:
« 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