Index: ash/wm/maximize_mode/maximize_mode_controller.cc |
diff --git a/ash/wm/maximize_mode/maximize_mode_controller.cc b/ash/wm/maximize_mode/maximize_mode_controller.cc |
index 511df7b94d65201e23329e30b5aea7c71f6ed56b..388f350ec6cadd8d0b1dea2aaef9739f4beabc8d 100644 |
--- a/ash/wm/maximize_mode/maximize_mode_controller.cc |
+++ b/ash/wm/maximize_mode/maximize_mode_controller.cc |
@@ -11,7 +11,6 @@ |
#include "ash/shell.h" |
#include "ash/wm/maximize_mode/maximize_mode_window_manager.h" |
#include "ash/wm/maximize_mode/scoped_disable_internal_mouse_and_keyboard.h" |
-#include "base/auto_reset.h" |
#include "base/command_line.h" |
#include "base/metrics/histogram.h" |
#include "base/time/default_tick_clock.h" |
@@ -63,13 +62,6 @@ const base::TimeDelta kLidRecentlyOpenedDuration = |
const float kHingeAngleDetectionThreshold = 2.5f; |
#if defined(OS_CHROMEOS) |
-// The mean acceleration due to gravity on Earth in m/s^2. |
-const float kMeanGravity = 9.80665f; |
- |
-// The maximum deviation from the acceleration expected due to gravity under |
-// which to detect hinge angle and screen rotation in m/s^2 |
-const float kDeviationFromGravityThreshold = 1.0f; |
- |
// The maximum deviation between the magnitude of the two accelerometers under |
// which to detect hinge angle and screen rotation in m/s^2. These |
// accelerometers are attached to the same physical device and so should be |
@@ -77,51 +69,11 @@ const float kDeviationFromGravityThreshold = 1.0f; |
const float kNoisyMagnitudeDeviation = 1.0f; |
#endif |
-// The angle which the screen has to be rotated past before the display will |
-// rotate to match it (i.e. 45.0f is no stickiness). |
-const float kDisplayRotationStickyAngleDegrees = 60.0f; |
- |
-// The minimum acceleration in m/s^2 in a direction required to trigger screen |
-// rotation. This prevents rapid toggling of rotation when the device is near |
-// flat and there is very little screen aligned force on it. The value is |
-// effectively the sine of the rise angle required times the acceleration due |
-// to gravity, with the current value requiring at least a 25 degree rise. |
-const float kMinimumAccelerationScreenRotation = 4.2f; |
- |
-const float kRadiansToDegrees = 180.0f / 3.14159265f; |
- |
-// Returns the angle between |base| and |other| in degrees. |
-float AngleBetweenVectorsInDegrees(const gfx::Vector3dF& base, |
- const gfx::Vector3dF& other) { |
- return acos(gfx::DotProduct(base, other) / |
- base.Length() / other.Length()) * kRadiansToDegrees; |
-} |
- |
-// Returns the clockwise angle between |base| and |other| where |normal| is the |
-// normal of the virtual surface to measure clockwise according to. |
-float ClockwiseAngleBetweenVectorsInDegrees(const gfx::Vector3dF& base, |
- const gfx::Vector3dF& other, |
- const gfx::Vector3dF& normal) { |
- float angle = AngleBetweenVectorsInDegrees(base, other); |
- gfx::Vector3dF cross(base); |
- cross.Cross(other); |
- // If the dot product of this cross product is normal, it means that the |
- // shortest angle between |base| and |other| was counterclockwise with respect |
- // to the surface represented by |normal| and this angle must be reversed. |
- if (gfx::DotProduct(cross, normal) > 0.0f) |
- angle = 360.0f - angle; |
- return angle; |
-} |
- |
} // namespace |
MaximizeModeController::MaximizeModeController() |
- : rotation_locked_(false), |
- have_seen_accelerometer_data_(false), |
- ignore_display_configuration_updates_(false), |
+ : have_seen_accelerometer_data_(false), |
lid_open_past_180_(false), |
- shutting_down_(false), |
- user_rotation_(gfx::Display::ROTATE_0), |
last_touchview_transition_time_(base::Time::Now()), |
tick_clock_(new base::DefaultTickClock()), |
lid_is_closed_(false) { |
@@ -142,31 +94,6 @@ MaximizeModeController::~MaximizeModeController() { |
#endif // OS_CHROMEOS |
} |
-void MaximizeModeController::SetRotationLocked(bool rotation_locked) { |
- if (rotation_locked_ == rotation_locked) |
- return; |
- base::AutoReset<bool> auto_ignore_display_configuration_updates( |
- &ignore_display_configuration_updates_, true); |
- rotation_locked_ = rotation_locked; |
- Shell::GetInstance()->display_manager()-> |
- RegisterDisplayRotationProperties(rotation_locked_, current_rotation_); |
- FOR_EACH_OBSERVER(Observer, observers_, |
- OnRotationLockChanged(rotation_locked_)); |
-} |
- |
-void MaximizeModeController::LockRotation(gfx::Display::Rotation rotation) { |
- SetRotationLocked(true); |
- SetDisplayRotation(Shell::GetInstance()->display_manager(), rotation); |
-} |
- |
-void MaximizeModeController::AddObserver(Observer* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void MaximizeModeController::RemoveObserver(Observer* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
bool MaximizeModeController::CanEnterMaximizeMode() { |
// If we have ever seen accelerometer data, then HandleHingeRotation may |
// trigger maximize mode at some point in the future. |
@@ -198,72 +125,34 @@ void MaximizeModeController::AddWindow(aura::Window* window) { |
maximize_mode_window_manager_->AddWindow(window); |
} |
-void MaximizeModeController::Shutdown() { |
- shutting_down_ = true; |
- LeaveMaximizeMode(); |
-} |
- |
-void MaximizeModeController::OnDisplayConfigurationChanged() { |
- if (ignore_display_configuration_updates_) |
- return; |
- DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
- gfx::Display::Rotation user_rotation = |
- display_manager->GetDisplayInfo(gfx::Display::InternalDisplayId()) |
- .rotation(); |
- if (user_rotation != current_rotation_) { |
- // A user may change other display configuration settings. When the user |
- // does change the rotation setting, then lock rotation to prevent the |
- // accelerometer from erasing their change. |
- SetRotationLocked(true); |
- user_rotation_ = user_rotation; |
- current_rotation_ = user_rotation; |
- } |
-} |
- |
#if defined(OS_CHROMEOS) |
void MaximizeModeController::OnAccelerometerUpdated( |
const ui::AccelerometerUpdate& update) { |
bool first_accelerometer_update = !have_seen_accelerometer_data_; |
have_seen_accelerometer_data_ = true; |
- // Ignore the reading if it appears unstable. The reading is considered |
- // unstable if it deviates too much from gravity and/or the magnitude of the |
- // reading from the lid differs too much from the reading from the base. |
- float lid_magnitude = update.has(ui::ACCELEROMETER_SOURCE_SCREEN) ? |
- update.get(ui::ACCELEROMETER_SOURCE_SCREEN).Length() : 0.0f; |
- bool lid_stable = update.has(ui::ACCELEROMETER_SOURCE_SCREEN) && |
- std::abs(lid_magnitude - kMeanGravity) <= kDeviationFromGravityThreshold; |
+ if (!update.has(ui::ACCELEROMETER_SOURCE_SCREEN)) |
+ return; |
// Whether or not we enter maximize mode affects whether we handle screen |
// rotation, so determine whether to enter maximize mode first. |
if (!update.has(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD)) { |
- if (first_accelerometer_update && |
- update.has(ui::ACCELEROMETER_SOURCE_SCREEN)) { |
+ if (first_accelerometer_update) |
EnterMaximizeMode(); |
- } |
- } else { // update.has(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) |
- float base_magnitude = |
- update.get(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD).Length(); |
- bool base_angle_stable = lid_stable && |
- std::abs(base_magnitude - lid_magnitude) <= kNoisyMagnitudeDeviation && |
- std::abs(base_magnitude - kMeanGravity) <= |
- kDeviationFromGravityThreshold; |
- if (base_angle_stable) { |
- HandleHingeRotation( |
- update.get(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD), |
- update.get(ui::ACCELEROMETER_SOURCE_SCREEN)); |
- } |
- } |
- |
- if (lid_stable) |
- HandleScreenRotation(update.get(ui::ACCELEROMETER_SOURCE_SCREEN)); |
- |
- if (first_accelerometer_update) { |
- // On the first accelerometer update we will know if we have entered |
- // maximize mode or not. Update the preferences to reflect the current |
- // state. |
- Shell::GetInstance()->display_manager()-> |
- RegisterDisplayRotationProperties(rotation_locked_, current_rotation_); |
+ } else if (chromeos::AccelerometerReader::IsReadingStable( |
+ update, ui::ACCELEROMETER_SOURCE_SCREEN) && |
+ chromeos::AccelerometerReader::IsReadingStable( |
+ update, ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) && |
+ std::abs(update.get(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) |
+ .Length() - |
+ update.get(ui::ACCELEROMETER_SOURCE_SCREEN).Length()) <= |
+ kNoisyMagnitudeDeviation) { |
+ // update.has(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD) |
+ // Ignore the reading if it appears unstable. The reading is considered |
+ // unstable if it deviates too much from gravity and/or the magnitude of the |
+ // reading from the lid differs too much from the reading from the base. |
+ HandleHingeRotation(update.get(ui::ACCELEROMETER_SOURCE_ATTACHED_KEYBOARD), |
+ update.get(ui::ACCELEROMETER_SOURCE_SCREEN)); |
} |
} |
@@ -304,8 +193,8 @@ void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base, |
} |
// Compute the angle between the base and the lid. |
- float lid_angle = 180.0f - ClockwiseAngleBetweenVectorsInDegrees( |
- base_flattened, lid_flattened, hinge_vector); |
+ float lid_angle = 180.0f - gfx::ClockwiseAngleBetweenVectorsInDegrees( |
+ base_flattened, lid_flattened, hinge_vector); |
if (lid_angle < 0.0f) |
lid_angle += 360.0f; |
@@ -341,106 +230,16 @@ void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base, |
} |
} |
-void MaximizeModeController::HandleScreenRotation(const gfx::Vector3dF& lid) { |
- bool maximize_mode_engaged = IsMaximizeModeWindowManagerEnabled(); |
- |
- // TODO(jonross): track the updated rotation angle even when locked. So that |
- // when rotation lock is removed the accelerometer rotation can be applied |
- // without waiting for the next update. |
- if (!maximize_mode_engaged || rotation_locked_) |
- return; |
- |
- DisplayManager* display_manager = |
- Shell::GetInstance()->display_manager(); |
- gfx::Display::Rotation current_rotation = display_manager->GetDisplayInfo( |
- gfx::Display::InternalDisplayId()).rotation(); |
- |
- // After determining maximize mode state, determine if the screen should |
- // be rotated. |
- gfx::Vector3dF lid_flattened(lid.x(), lid.y(), 0.0f); |
- float lid_flattened_length = lid_flattened.Length(); |
- // When the lid is close to being flat, don't change rotation as it is too |
- // sensitive to slight movements. |
- if (lid_flattened_length < kMinimumAccelerationScreenRotation) |
- return; |
- |
- // The reference vector is the angle of gravity when the device is rotated |
- // clockwise by 45 degrees. Computing the angle between this vector and |
- // gravity we can easily determine the expected display rotation. |
- static const gfx::Vector3dF rotation_reference(-1.0f, -1.0f, 0.0f); |
- |
- // Set the down vector to match the expected direction of gravity given the |
- // last configured rotation. This is used to enforce a stickiness that the |
- // user must overcome to rotate the display and prevents frequent rotations |
- // when holding the device near 45 degrees. |
- gfx::Vector3dF down(0.0f, 0.0f, 0.0f); |
- if (current_rotation == gfx::Display::ROTATE_0) |
- down.set_y(-1.0f); |
- else if (current_rotation == gfx::Display::ROTATE_90) |
- down.set_x(-1.0f); |
- else if (current_rotation == gfx::Display::ROTATE_180) |
- down.set_y(1.0f); |
- else |
- down.set_x(1.0f); |
- |
- // Don't rotate if the screen has not passed the threshold. |
- if (AngleBetweenVectorsInDegrees(down, lid_flattened) < |
- kDisplayRotationStickyAngleDegrees) { |
- return; |
- } |
- |
- float angle = ClockwiseAngleBetweenVectorsInDegrees(rotation_reference, |
- lid_flattened, gfx::Vector3dF(0.0f, 0.0f, -1.0f)); |
- |
- gfx::Display::Rotation new_rotation = gfx::Display::ROTATE_90; |
- if (angle < 90.0f) |
- new_rotation = gfx::Display::ROTATE_0; |
- else if (angle < 180.0f) |
- new_rotation = gfx::Display::ROTATE_270; |
- else if (angle < 270.0f) |
- new_rotation = gfx::Display::ROTATE_180; |
- |
- if (new_rotation != current_rotation) |
- SetDisplayRotation(display_manager, new_rotation); |
-} |
- |
-void MaximizeModeController::SetDisplayRotation( |
- DisplayManager* display_manager, |
- gfx::Display::Rotation rotation) { |
- base::AutoReset<bool> auto_ignore_display_configuration_updates( |
- &ignore_display_configuration_updates_, true); |
- current_rotation_ = rotation; |
- display_manager->SetDisplayRotation(gfx::Display::InternalDisplayId(), |
- rotation); |
-} |
- |
void MaximizeModeController::EnterMaximizeMode() { |
if (IsMaximizeModeWindowManagerEnabled()) |
return; |
- DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
- if (display_manager->HasInternalDisplay()) { |
- current_rotation_ = user_rotation_ = display_manager-> |
- GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation(); |
- LoadDisplayRotationProperties(); |
- } |
EnableMaximizeModeWindowManager(true); |
- Shell::GetInstance()->display_controller()->AddObserver(this); |
} |
void MaximizeModeController::LeaveMaximizeMode() { |
if (!IsMaximizeModeWindowManagerEnabled()) |
return; |
- DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
- if (display_manager->HasInternalDisplay()) { |
- gfx::Display::Rotation current_rotation = display_manager-> |
- GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation(); |
- if (current_rotation != user_rotation_) |
- SetDisplayRotation(display_manager, user_rotation_); |
- } |
- if (!shutting_down_) |
- SetRotationLocked(false); |
EnableMaximizeModeWindowManager(false); |
- Shell::GetInstance()->display_controller()->RemoveObserver(this); |
} |
// Called after maximize mode has started, windows might still animate though. |
@@ -469,16 +268,6 @@ void MaximizeModeController::RecordTouchViewStateTransition() { |
} |
} |
-void MaximizeModeController::LoadDisplayRotationProperties() { |
- DisplayManager* display_manager = Shell::GetInstance()->display_manager(); |
- if (!display_manager->registered_internal_display_rotation_lock()) |
- return; |
- |
- SetDisplayRotation(display_manager, |
- display_manager->registered_internal_display_rotation()); |
- SetRotationLocked(true); |
-} |
- |
void MaximizeModeController::OnAppTerminating() { |
if (CanEnterMaximizeMode()) { |
RecordTouchViewStateTransition(); |
@@ -495,7 +284,6 @@ void MaximizeModeController::OnAppTerminating() { |
100 * total_touchview_time_.InSeconds() / total_runtime.InSeconds()); |
} |
} |
- Shell::GetInstance()->display_controller()->RemoveObserver(this); |
} |
bool MaximizeModeController::WasLidOpenedRecently() const { |