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

Unified Diff: ash/wm/maximize_mode/maximize_mode_controller.cc

Issue 412013002: Prevent entering maximize mode when the lid is closed or has recently opened. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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/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 36f6f2514ca137a01e7595f34a8e5176994367ae..3801bd59d5d8222b315ace1317c8bb3adb40775b 100644
--- a/ash/wm/maximize_mode/maximize_mode_controller.cc
+++ b/ash/wm/maximize_mode/maximize_mode_controller.cc
@@ -15,6 +15,7 @@
#include "base/auto_reset.h"
#include "base/command_line.h"
#include "base/metrics/histogram.h"
+#include "chromeos/dbus/dbus_thread_manager.h"
jonross 2014/07/24 14:22:00 Can you confirm via gyp files that this will alway
bruthig 2014/07/24 19:57:06 Done.
#include "ui/base/accelerators/accelerator.h"
#include "ui/events/event.h"
#include "ui/events/event_handler.h"
@@ -36,11 +37,18 @@ const float kEnterMaximizeModeAngle = 200.0f;
// angle to enter maximize mode to prevent rapid toggling when near the angle.
const float kExitMaximizeModeAngle = 160.0f;
-// When the lid is fully open 360 degrees, the accelerometer readings can
-// occasionally appear as though the lid is almost closed. If the lid appears
-// near closed but the device is on we assume it is an erroneous reading from
-// it being open 360 degrees.
-const float kFullyOpenAngleErrorTolerance = 20.0f;
+// Defines a range for which accelerometer readings are considered accurate.
+// When the lid is near open (or near closed) the acceleromter readings may be
+// inaccurate and a lid that is fully open may appear to be near closed (and
+// vice versa).
+const float kMinStableAngle = 20.0f;
+const float kMaxStableAngle = 340.0f;
+
+// The time in seconds to consider the lid to be recently opened.
+// This is used to prevent entering maximize mode if an erroneous accelerometer
+// reading makes the lid appear to be fully open when the user is opening the
+// lid from a closed position.
+const int kLidRecentlyOpenedTolerance = 2;
jonross 2014/07/24 14:22:00 For constants representing a time duration we appe
bruthig 2014/07/24 19:57:06 Done.
// When the device approaches vertical orientation (i.e. portrait orientation)
// the accelerometers for the base and lid approach the same values (i.e.
@@ -139,19 +147,30 @@ void ScreenshotActionHandler::OnKeyEvent(ui::KeyEvent* event) {
} // namespace
+base::TimeTicks MaximizeModeController::TimeTickProviderImpl::Now() const {
+ return base::TimeTicks::Now();
+}
+
MaximizeModeController::MaximizeModeController()
: rotation_locked_(false),
have_seen_accelerometer_data_(false),
in_set_screen_rotation_(false),
user_rotation_(gfx::Display::ROTATE_0),
- last_touchview_transition_time_(base::Time::Now()) {
+ last_touchview_transition_time_(base::Time::Now()),
+ last_lid_open_time_(),
+ time_tick_provider_(new TimeTickProviderImpl()),
+ lid_is_closed_(false) {
Shell::GetInstance()->accelerometer_controller()->AddObserver(this);
Shell::GetInstance()->AddShellObserver(this);
+ chromeos::DBusThreadManager::Get()->
+ GetPowerManagerClient()->AddObserver(this);
}
MaximizeModeController::~MaximizeModeController() {
Shell::GetInstance()->RemoveShellObserver(this);
Shell::GetInstance()->accelerometer_controller()->RemoveObserver(this);
+ chromeos::DBusThreadManager::Get()->
+ GetPowerManagerClient()->RemoveObserver(this);
}
void MaximizeModeController::SetRotationLocked(bool rotation_locked) {
@@ -239,10 +258,28 @@ void MaximizeModeController::OnDisplayConfigurationChanged() {
}
}
+void MaximizeModeController::LidEventReceived(bool open,
+ const base::TimeTicks& time) {
+ if (open)
+ last_lid_open_time_ = time;
+ lid_is_closed_ = !open;
+ LeaveMaximizeMode();
+}
+
+void MaximizeModeController::SuspendImminent() {
+ RecordTouchViewStateTransition();
+}
+
+void MaximizeModeController::SuspendDone(
+ const base::TimeDelta& sleep_duration) {
+ last_touchview_transition_time_ = base::Time::Now();
+ // A lid open event won't always occur when coming out of a suspend state.
jonross 2014/07/24 14:22:00 If it does not, is there a way to poll lid state u
bruthig 2014/07/24 19:57:06 I'm not sure if there is a way or not but I don't
jonross 2014/07/25 13:39:06 Acknowledged.
+ lid_is_closed_ = false;
+}
+
void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base,
const gfx::Vector3dF& lid) {
static const gfx::Vector3dF hinge_vector(0.0f, 1.0f, 0.0f);
- bool maximize_mode_engaged = IsMaximizeModeWindowManagerEnabled();
// Ignore the component of acceleration parallel to the hinge for the purposes
// of hinge angle calculation.
gfx::Vector3dF base_flattened(base);
@@ -261,18 +298,29 @@ void MaximizeModeController::HandleHingeRotation(const gfx::Vector3dF& base,
// Compute the angle between the base and the lid.
float angle = ClockwiseAngleBetweenVectorsInDegrees(base_flattened,
lid_flattened, hinge_vector);
-
// Toggle maximize mode on or off when corresponding thresholds are passed.
// TODO(flackr): Make MaximizeModeController own the MaximizeModeWindowManager
// such that observations of state changes occur after the change and shell
// has fewer states to track.
- if (maximize_mode_engaged &&
- angle > kFullyOpenAngleErrorTolerance &&
- angle < kExitMaximizeModeAngle) {
+ if (lid_is_closed_) {
LeaveMaximizeMode();
- } else if (!maximize_mode_engaged &&
- angle > kEnterMaximizeModeAngle) {
- EnterMaximizeMode();
+ } else if (angle > kMinStableAngle &&
jonross 2014/07/24 14:22:00 Should we exit MaximizeMode if angle <kMinStableAn
bruthig 2014/07/24 19:57:06 No we don't want to exit MaximizeMode in this case
jonross 2014/07/25 13:39:06 Acknowledged.
+ angle < kMaxStableAngle) {
+ // Clear the last_lid_open_time_ for a stable reading so that there is less
+ // chance of a delay if the lid is moved from the close state to the fully
+ // open state very quickly.
+ last_lid_open_time_ = base::TimeTicks();
jonross 2014/07/24 14:22:00 This moves the lid open time to be later than when
bruthig 2014/07/24 19:57:06 I don't think this is doing what you think. It's
jonross 2014/07/25 13:39:06 My misreading.
+ if (angle < kExitMaximizeModeAngle) {
+ LeaveMaximizeMode();
+ } else if (angle > kEnterMaximizeModeAngle) {
+ EnterMaximizeMode();
+ }
+ } else if (angle > kMaxStableAngle) {
+ if (WasLidOpenedRecently()) {
+ LeaveMaximizeMode();
+ } else {
+ EnterMaximizeMode();
+ }
}
}
@@ -350,6 +398,8 @@ void MaximizeModeController::SetDisplayRotation(
}
void MaximizeModeController::EnterMaximizeMode() {
+ if (IsMaximizeModeWindowManagerEnabled())
jonross 2014/07/24 14:22:00 We should stop calling this twice.
bruthig 2014/07/24 19:57:06 In order to stop calling it twice each spot that c
+ return;
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
current_rotation_ = user_rotation_ = display_manager->
GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
@@ -364,6 +414,8 @@ void MaximizeModeController::EnterMaximizeMode() {
}
void MaximizeModeController::LeaveMaximizeMode() {
+ if (!IsMaximizeModeWindowManagerEnabled())
+ return;
DisplayManager* display_manager = Shell::GetInstance()->display_manager();
gfx::Display::Rotation current_rotation = display_manager->
GetDisplayInfo(gfx::Display::InternalDisplayId()).rotation();
@@ -373,14 +425,7 @@ void MaximizeModeController::LeaveMaximizeMode() {
EnableMaximizeModeWindowManager(false);
event_blocker_.reset();
event_handler_.reset();
-}
-
-void MaximizeModeController::OnSuspend() {
- RecordTouchViewStateTransition();
-}
-
-void MaximizeModeController::OnResume() {
- last_touchview_transition_time_ = base::Time::Now();
+ Shell::GetInstance()->display_controller()->RemoveObserver(this);
jonross 2014/07/24 14:22:00 Nice fix.
}
// Called after maximize mode has started, windows might still animate though.
@@ -428,4 +473,22 @@ void MaximizeModeController::OnAppTerminating() {
Shell::GetInstance()->display_controller()->RemoveObserver(this);
}
+bool MaximizeModeController::WasLidOpenedRecently() const {
+ bool was_lid_recently_opened = false;
+ if (!last_lid_open_time_.is_null()) {
jonross 2014/07/24 14:22:00 Quick exits are prefered. if (last_lid_open_time_
bruthig 2014/07/24 19:57:06 Done.
+ base::TimeTicks now = time_tick_provider_->Now();
+ DCHECK(now >= last_lid_open_time_);
+ base::TimeDelta elapsed_time = now - last_lid_open_time_;
+ was_lid_recently_opened =
+ elapsed_time <= base::TimeDelta::FromSeconds(kLidRecentlyOpenedTolerance);
+ }
+ return was_lid_recently_opened;
+}
+
+void MaximizeModeController::SetTimeTickProviderForTest(
+ TimeTickProvider* provider) {
+ DCHECK(provider);
+ time_tick_provider_.reset(provider);
+}
+
} // namespace ash

Powered by Google App Engine
This is Rietveld 408576698