Commit c1500889 authored by Min Chen's avatar Min Chen Committed by Commit Bot

[Reland]Adjust the power menu position to avoid being chopped by display.

Bug: 818331
Change-Id: Ifcaa7adcb25fe099047d5f9d73d6b0bd78d7fff8
Reviewed-on: https://chromium-review.googlesource.com/1067508Reviewed-by: default avatarDan Erat <derat@chromium.org>
Reviewed-by: default avatarQiang Xu <warx@google.com>
Commit-Queue: Min Chen <minch@chromium.org>
Cr-Commit-Position: refs/heads/master@{#560316}
parent eb4d7579
...@@ -46,13 +46,13 @@ namespace { ...@@ -46,13 +46,13 @@ namespace {
constexpr double kNonZeroBrightness = 10.; constexpr double kNonZeroBrightness = 10.;
// Width of the display. // Width of the display.
constexpr int kDisplayWidth = 800; constexpr int kDisplayWidth = 2000;
// Height of the display. // Height of the display.
constexpr int kDisplayHeight = 600; constexpr int kDisplayHeight = 1200;
// Power button position offset percentage. // Power button position offset percentage.
constexpr double kPowerButtonPercentage = 0.75f; constexpr double kPowerButtonPercentage = 0.9f;
// Shorthand for some long constants. // Shorthand for some long constants.
constexpr power_manager::BacklightBrightnessChange_Cause kUserCause = constexpr power_manager::BacklightBrightnessChange_Cause kUserCause =
...@@ -1193,7 +1193,7 @@ TEST_P(PowerButtonControllerWithPositionTest, ...@@ -1193,7 +1193,7 @@ TEST_P(PowerButtonControllerWithPositionTest,
// display has different scale factors. // display has different scale factors.
TEST_P(PowerButtonControllerWithPositionTest, MenuShownAtPercentageOfPosition) { TEST_P(PowerButtonControllerWithPositionTest, MenuShownAtPercentageOfPosition) {
const int scale_factor = 2; const int scale_factor = 2;
std::string display = "1000x500*" + std::to_string(scale_factor); std::string display = "4000x2400*" + std::to_string(scale_factor);
UpdateDisplay(display); UpdateDisplay(display);
int64_t primary_id = GetPrimaryDisplay().id(); int64_t primary_id = GetPrimaryDisplay().id();
display::test::ScopedSetInternalDisplayId set_internal(display_manager(), display::test::ScopedSetInternalDisplayId set_internal(display_manager(),
...@@ -1238,6 +1238,63 @@ TEST_P(PowerButtonControllerWithPositionTest, MenuShownAtPercentageOfPosition) { ...@@ -1238,6 +1238,63 @@ TEST_P(PowerButtonControllerWithPositionTest, MenuShownAtPercentageOfPosition) {
} }
} }
TEST_P(PowerButtonControllerWithPositionTest, AdjustMenuShownForDisplaySize) {
OpenPowerButtonMenu();
gfx::Rect menu_bounds = power_button_test_api_->GetMenuBoundsInScreen();
TapToDismissPowerButtonMenu();
// (1 - kPowerButtonPercentage) * display_height < 0.5 * menu_height makes
// sure menu will be cut off by display when button is on LEFT/RIGHT, and (1 -
// kPowerButtonPercentage) * display_width < 0.5 * menu_width makes sure menu
// will be cut off by display when button is on TOP/BOTTOM.
int display_width =
0.5 / (1.0f - kPowerButtonPercentage) * menu_bounds.width() - 5;
int display_height =
0.5 / (1.0f - kPowerButtonPercentage) * menu_bounds.height() - 5;
std::string display =
std::to_string(display_width) + "x" + std::to_string(display_height);
UpdateDisplay(display);
display::test::ScopedSetInternalDisplayId set_internal(
display_manager(), GetPrimaryDisplay().id());
ScreenOrientationControllerTestApi test_api(
Shell::Get()->screen_orientation_controller());
// Set the screen orientation to LANDSCAPE_PRIMARY.
test_api.SetDisplayRotation(display::Display::ROTATE_0,
display::Display::RotationSource::ACTIVE);
EXPECT_EQ(test_api.GetCurrentOrientation(),
OrientationLockType::kLandscapePrimary);
EnableTabletMode(true);
OpenPowerButtonMenu();
// Menu's bounds is always inside the display.
EXPECT_TRUE(GetPrimaryDisplay().bounds().Contains(
power_button_test_api_->GetMenuBoundsInScreen()));
// Rotate the screen by 270 degrees.
test_api.SetDisplayRotation(display::Display::ROTATE_270,
display::Display::RotationSource::ACTIVE);
EXPECT_EQ(test_api.GetCurrentOrientation(),
OrientationLockType::kPortraitPrimary);
EXPECT_TRUE(GetPrimaryDisplay().bounds().Contains(
power_button_test_api_->GetMenuBoundsInScreen()));
// Rotate the screen by 180 degrees.
test_api.SetDisplayRotation(display::Display::ROTATE_180,
display::Display::RotationSource::ACTIVE);
EXPECT_EQ(test_api.GetCurrentOrientation(),
OrientationLockType::kLandscapeSecondary);
EXPECT_TRUE(GetPrimaryDisplay().bounds().Contains(
power_button_test_api_->GetMenuBoundsInScreen()));
// Rotate the screen by 90 degrees.
test_api.SetDisplayRotation(display::Display::ROTATE_90,
display::Display::RotationSource::ACTIVE);
EXPECT_EQ(test_api.GetCurrentOrientation(),
OrientationLockType::kPortraitSecondary);
EXPECT_TRUE(GetPrimaryDisplay().bounds().Contains(
power_button_test_api_->GetMenuBoundsInScreen()));
}
INSTANTIATE_TEST_CASE_P(AshPowerButtonPosition, INSTANTIATE_TEST_CASE_P(AshPowerButtonPosition,
PowerButtonControllerWithPositionTest, PowerButtonControllerWithPositionTest,
testing::Values(PowerButtonPosition::LEFT, testing::Values(PowerButtonPosition::LEFT,
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
namespace ash { namespace ash {
constexpr int PowerButtonMenuView::kMenuViewTransformDistanceDp;
namespace { namespace {
// Color of the fullscreen background shield. // Color of the fullscreen background shield.
...@@ -36,6 +38,21 @@ gfx::Size GetPrimaryDisplayLandscapeSize() { ...@@ -36,6 +38,21 @@ gfx::Size GetPrimaryDisplayLandscapeSize() {
std::min(bounds.width(), bounds.height())); std::min(bounds.width(), bounds.height()));
} }
// Adjust the menu's |actual_position| to be at least kMenuTransformDistanceDp
// from the edge of the display. |menu_size| means the width or height of the
// menu and |actual_position| is x-coordinate or y-coordinate of the menu.
// |display_edge| is the width or height of the display in landscape_primary
// orientation depending on the power button's posotion.
int AdjustMenuEdgeForDisplaySize(int actual_position,
int display_edge,
int menu_size) {
return std::min(display_edge -
PowerButtonMenuView::kMenuViewTransformDistanceDp -
menu_size,
std::max(PowerButtonMenuView::kMenuViewTransformDistanceDp,
actual_position));
}
} // namespace } // namespace
using PowerButtonPosition = PowerButtonController::PowerButtonPosition; using PowerButtonPosition = PowerButtonController::PowerButtonPosition;
...@@ -193,10 +210,12 @@ void PowerButtonMenuScreenView::InitializeMenuBoundsOrigins() { ...@@ -193,10 +210,12 @@ void PowerButtonMenuScreenView::InitializeMenuBoundsOrigins() {
const gfx::Size landscape_size = GetPrimaryDisplayLandscapeSize(); const gfx::Size landscape_size = GetPrimaryDisplayLandscapeSize();
int display_width = landscape_size.width(); int display_width = landscape_size.width();
int display_height = landscape_size.height(); int display_height = landscape_size.height();
int display_edge_for_adjust = landscape_size.height();
if (power_button_position_ == PowerButtonPosition::TOP || if (power_button_position_ == PowerButtonPosition::TOP ||
power_button_position_ == PowerButtonPosition::BOTTOM) { power_button_position_ == PowerButtonPosition::BOTTOM) {
std::swap(display_width, display_height); std::swap(display_width, display_height);
display_edge_for_adjust = landscape_size.width();
} }
int power_button_offset = display_height * power_button_offset_percentage_; int power_button_offset = display_height * power_button_offset_percentage_;
...@@ -254,25 +273,33 @@ void PowerButtonMenuScreenView::InitializeMenuBoundsOrigins() { ...@@ -254,25 +273,33 @@ void PowerButtonMenuScreenView::InitializeMenuBoundsOrigins() {
menu_bounds_origins_.insert(std::make_pair( menu_bounds_origins_.insert(std::make_pair(
left_screen_orientation, left_screen_orientation,
gfx::Point(PowerButtonMenuView::kMenuViewTransformDistanceDp, gfx::Point(PowerButtonMenuView::kMenuViewTransformDistanceDp,
left_power_button_y - menu_size.height() / 2))); AdjustMenuEdgeForDisplaySize(
left_power_button_y - menu_size.height() / 2,
display_edge_for_adjust, menu_size.height()))));
menu_bounds_origins_.insert(std::make_pair( menu_bounds_origins_.insert(std::make_pair(
right_screen_orientation, right_screen_orientation,
gfx::Point(display_width - gfx::Point(display_width -
PowerButtonMenuView::kMenuViewTransformDistanceDp - PowerButtonMenuView::kMenuViewTransformDistanceDp -
menu_size.width(), menu_size.width(),
right_power_button_y - menu_size.height() / 2))); AdjustMenuEdgeForDisplaySize(
right_power_button_y - menu_size.height() / 2,
display_edge_for_adjust, menu_size.height()))));
// Power button position offset from the top when the button is at the top // Power button position offset from the top when the button is at the top
// is always zero. // is always zero.
menu_bounds_origins_.insert(std::make_pair( menu_bounds_origins_.insert(std::make_pair(
top_screen_orientation, top_screen_orientation,
gfx::Point(top_power_button_x - menu_size.width() / 2, gfx::Point(AdjustMenuEdgeForDisplaySize(
top_power_button_x - menu_size.width() / 2,
display_edge_for_adjust, menu_size.width()),
PowerButtonMenuView::kMenuViewTransformDistanceDp))); PowerButtonMenuView::kMenuViewTransformDistanceDp)));
menu_bounds_origins_.insert(std::make_pair( menu_bounds_origins_.insert(std::make_pair(
bottom_screen_orientation, bottom_screen_orientation,
gfx::Point(bottom_power_button_x - menu_size.width() / 2, gfx::Point(AdjustMenuEdgeForDisplaySize(
bottom_power_button_x - menu_size.width() / 2,
display_edge_for_adjust, menu_size.width()),
display_width - display_width -
PowerButtonMenuView::kMenuViewTransformDistanceDp - PowerButtonMenuView::kMenuViewTransformDistanceDp -
menu_size.height()))); menu_size.height())));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment