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

Unified Diff: ash/display/screen_orientation_controller_chromeos.cc

Issue 2757493002: User orientation lock (Closed)
Patch Set: . Created 3 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/screen_orientation_controller_chromeos.cc
diff --git a/ash/display/screen_orientation_controller_chromeos.cc b/ash/display/screen_orientation_controller_chromeos.cc
index 1d21455d03144547cd197229bb60447f3be8b06d..2b5bebfd9616f68898b1822b337f3083d5d36c9d 100644
--- a/ash/display/screen_orientation_controller_chromeos.cc
+++ b/ash/display/screen_orientation_controller_chromeos.cc
@@ -6,9 +6,12 @@
#include "ash/common/ash_switches.h"
#include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
+#include "ash/common/wm/mru_window_tracker.h"
+#include "ash/common/wm/window_state.h"
#include "ash/common/wm_shell.h"
#include "ash/common/wm_window.h"
#include "ash/display/display_configuration_controller.h"
+#include "ash/shared/app_types.h"
#include "ash/shell.h"
#include "base/auto_reset.h"
#include "base/command_line.h"
@@ -114,7 +117,7 @@ void ScreenOrientationController::UnlockAll() {
pair.first->aura_window()->RemoveObserver(this);
locking_windows_.clear();
Shell::GetInstance()->activation_client()->RemoveObserver(this);
- SetRotationLocked(false);
+ SetRotationLockedInternal(false);
if (user_rotation_ != current_rotation_)
SetDisplayRotation(user_rotation_, display::Display::ROTATION_SOURCE_USER);
}
@@ -127,33 +130,60 @@ bool ScreenOrientationController::ScreenOrientationProviderSupported() const {
switches::kAshDisableScreenOrientationLock);
}
-void ScreenOrientationController::SetRotationLocked(bool rotation_locked) {
- if (rotation_locked_ == rotation_locked)
- return;
- rotation_locked_ = rotation_locked;
- if (!rotation_locked_)
- rotation_locked_orientation_ = blink::WebScreenOrientationLockAny;
- for (auto& observer : observers_)
- observer.OnRotationLockChanged(rotation_locked_);
- if (!display::Display::HasInternalDisplay())
- return;
- base::AutoReset<bool> auto_ignore_display_configuration_updates(
- &ignore_display_configuration_updates_, true);
- Shell::GetInstance()->display_manager()->RegisterDisplayRotationProperties(
jonross 2017/03/21 14:56:43 Were you planning to land this in a follow up chan
oshima 2017/03/21 15:10:57 Yes. I mentioned it in the CL description. (note t
jonross 2017/03/22 23:51:55 SGTM
- rotation_locked_, current_rotation_);
-}
-
-void ScreenOrientationController::SetDisplayRotation(
- display::Display::Rotation rotation,
- display::Display::RotationSource source) {
- if (!display::Display::HasInternalDisplay())
- return;
- current_rotation_ = rotation;
- base::AutoReset<bool> auto_ignore_display_configuration_updates(
- &ignore_display_configuration_updates_, true);
+void ScreenOrientationController::ToggleUserRotationLock() {
+ if (user_rotation_locked()) {
+ user_locked_orientation_ = blink::WebScreenOrientationLockAny;
+ } else {
+ display::Display::Rotation current_rotation =
+ WmShell::Get()
+ ->GetDisplayInfo(display::Display::InternalDisplayId())
+ .GetActiveRotation();
+ blink::WebScreenOrientationLockType natural =
+ GetDisplayNaturalOrientation();
+ if (natural == blink::WebScreenOrientationLockLandscape) {
+ switch (current_rotation) {
+ case display::Display::ROTATE_0:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockLandscapePrimary;
+ break;
+ case display::Display::ROTATE_90:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockPortraitPrimary;
+ break;
+ case display::Display::ROTATE_180:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockLandscapeSecondary;
+ break;
+ case display::Display::ROTATE_270:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockPortraitSecondary;
+ break;
+ }
+ } else { // Natural portrait
+ switch (current_rotation) {
+ case display::Display::ROTATE_0:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockPortraitPrimary;
+ break;
+ case display::Display::ROTATE_90:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockLandscapePrimary;
+ break;
+ case display::Display::ROTATE_180:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockPortraitSecondary;
+ break;
+ case display::Display::ROTATE_270:
+ user_locked_orientation_ =
+ blink::WebScreenOrientationLockLandscapeSecondary;
+ break;
+ }
+ }
+ }
+ ApplyLockForActiveWindow();
- Shell::GetInstance()->display_configuration_controller()->SetDisplayRotation(
- display::Display::InternalDisplayId(), rotation, source);
+ for (auto& observer : observers_)
+ observer.OnUserRotationLockChanged();
}
void ScreenOrientationController::OnWindowActivated(ActivationReason reason,
@@ -205,10 +235,13 @@ void ScreenOrientationController::OnDisplayConfigurationChanged() {
->GetDisplayInfo(display::Display::InternalDisplayId())
.GetActiveRotation();
if (user_rotation != current_rotation_) {
+ // TODO(oshima): We should disable the orientation change in settings
+ // because application may not work correctly.
+
// 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);
+ SetRotationLockedInternal(true);
jonross 2017/03/21 14:56:43 So currently we have been treating the settings ap
oshima 2017/03/21 15:10:57 I'll make two changes: - Disable the rotation chan
jonross 2017/03/22 23:51:55 SGTM
user_rotation_ = current_rotation_ = user_rotation;
}
}
@@ -236,10 +269,38 @@ void ScreenOrientationController::OnMaximizeModeEnded() {
SetDisplayRotation(user_rotation_, display::Display::ROTATION_SOURCE_USER);
}
+void ScreenOrientationController::SetDisplayRotation(
+ display::Display::Rotation rotation,
+ display::Display::RotationSource source) {
+ if (!display::Display::HasInternalDisplay())
+ return;
+ current_rotation_ = rotation;
+ base::AutoReset<bool> auto_ignore_display_configuration_updates(
+ &ignore_display_configuration_updates_, true);
+
+ Shell::GetInstance()->display_configuration_controller()->SetDisplayRotation(
+ display::Display::InternalDisplayId(), rotation, source);
+}
+
+void ScreenOrientationController::SetRotationLockedInternal(
+ bool rotation_locked) {
+ if (rotation_locked_ == rotation_locked)
+ return;
+ rotation_locked_ = rotation_locked;
+ if (!rotation_locked_)
+ rotation_locked_orientation_ = blink::WebScreenOrientationLockAny;
+ if (!display::Display::HasInternalDisplay())
+ return;
+ base::AutoReset<bool> auto_ignore_display_configuration_updates(
+ &ignore_display_configuration_updates_, true);
+ Shell::GetInstance()->display_manager()->RegisterDisplayRotationProperties(
+ rotation_locked_, current_rotation_);
+}
+
void ScreenOrientationController::LockRotation(
display::Display::Rotation rotation,
display::Display::RotationSource source) {
- SetRotationLocked(true);
+ SetRotationLockedInternal(true);
SetDisplayRotation(rotation, source);
}
@@ -248,7 +309,7 @@ void ScreenOrientationController::LockRotationToOrientation(
rotation_locked_orientation_ = lock_orientation;
switch (lock_orientation) {
case blink::WebScreenOrientationLockAny:
- SetRotationLocked(false);
+ SetRotationLockedInternal(false);
break;
case blink::WebScreenOrientationLockDefault:
NOTREACHED();
@@ -310,7 +371,7 @@ void ScreenOrientationController::LockToRotationMatchingOrientation(
if (natural_orientation_ == lock_orientation) {
if (rotation == display::Display::ROTATE_0 ||
rotation == display::Display::ROTATE_180) {
- SetRotationLocked(true);
+ SetRotationLockedInternal(true);
} else {
LockRotation(display::Display::ROTATE_0,
display::Display::ROTATION_SOURCE_ACTIVE);
@@ -318,7 +379,7 @@ void ScreenOrientationController::LockToRotationMatchingOrientation(
} else {
if (rotation == display::Display::ROTATE_90 ||
rotation == display::Display::ROTATE_270) {
- SetRotationLocked(true);
+ SetRotationLockedInternal(true);
} else {
LockRotation(display::Display::ROTATE_90,
display::Display::ROTATION_SOURCE_ACTIVE);
@@ -385,21 +446,37 @@ void ScreenOrientationController::LoadDisplayRotationProperties() {
return;
SetDisplayRotation(display_manager->registered_internal_display_rotation(),
display::Display::ROTATION_SOURCE_ACCELEROMETER);
- SetRotationLocked(true);
+ SetRotationLockedInternal(true);
}
void ScreenOrientationController::ApplyLockForActiveWindow() {
- WmWindow* active_window = WmShell::Get()->GetActiveWindow();
- if (active_window) {
- for (auto const& windows : locking_windows_) {
- if (windows.first->GetTargetVisibility() &&
- active_window->Contains(windows.first)) {
- LockRotationToOrientation(windows.second);
+ MruWindowTracker::WindowList mru_windows(
+ WmShell::Get()->mru_window_tracker()->BuildMruWindowList());
+
+ for (WmWindow* window : mru_windows) {
+ if (!window->GetTargetVisibility())
+ continue;
+ // TODO(oshima): If the application's orientation is landscape
+ // and user_locked_orientation_ is landscape primary or secondary,
+ // it should lock to the specific orientation. (and same for portrait).
+ for (auto const& pair : locking_windows_) {
jonross 2017/03/21 14:56:43 The ARC++ app windows are being registered with lo
oshima 2017/03/21 15:10:57 Yes, ARC++ apps always set the orientation.
jonross 2017/03/22 23:51:55 Good to know, I wasn't 100% which path the took. S
+ if (pair.first->GetTargetVisibility() && window->Contains(pair.first)) {
+ LockRotationToOrientation(pair.second ==
+ blink::WebScreenOrientationLockAny
+ ? user_locked_orientation_
+ : pair.second);
return;
}
}
+ // The default orientation for all chrome browser/apps windows is
+ // ANY, so use the user_locked_orientation_;
+ if (window->GetTargetVisibility() &&
+ static_cast<AppType>(window->GetAppType()) != AppType::OTHERS) {
+ LockRotationToOrientation(user_locked_orientation_);
+ return;
+ }
}
- SetRotationLocked(false);
+ LockRotationToOrientation(user_locked_orientation_);
}
bool ScreenOrientationController::IsRotationAllowedInLockedState(

Powered by Google App Engine
This is Rietveld 408576698