Commit 47649526 authored by Xiaodan Zhu's avatar Xiaodan Zhu Committed by Commit Bot

Keep split window snapped after dragging is cancelled

Bug: 1033309
Change-Id: I0a94a67e18a97137588ad27d49288673727eb68b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2342466
Commit-Queue: Xiaodan Zhu <zxdan@chromium.org>
Reviewed-by: default avatarXiaoqian Dai <xdai@chromium.org>
Cr-Commit-Position: refs/heads/master@{#796608}
parent ebec9837
...@@ -306,9 +306,11 @@ void DragWindowFromShelfController::CancelDrag() { ...@@ -306,9 +306,11 @@ void DragWindowFromShelfController::CancelDrag() {
ReshowHiddenWindowsOnDragEnd(); ReshowHiddenWindowsOnDragEnd();
window_drag_result_ = ShelfWindowDragResult::kDragCanceled; window_drag_result_ = ShelfWindowDragResult::kDragCanceled;
// When the drag is cancelled, the window should restore to its original snap
// position.
OnDragEnded(previous_location_in_screen_, OnDragEnded(previous_location_in_screen_,
/*should_drop_window_in_overview=*/false, /*should_drop_window_in_overview=*/false,
/*snap_position=*/SplitViewController::NONE); /*snap_position=*/initial_snap_position_);
WindowState::Get(window_)->DeleteDragDetails(); WindowState::Get(window_)->DeleteDragDetails();
} }
...@@ -376,6 +378,11 @@ void DragWindowFromShelfController::OnDragStarted( ...@@ -376,6 +378,11 @@ void DragWindowFromShelfController::OnDragStarted(
// to be detached from splitview before start dragging. // to be detached from splitview before start dragging.
SplitViewController* split_view_controller = SplitViewController* split_view_controller =
SplitViewController::Get(Shell::GetPrimaryRootWindow()); SplitViewController::Get(Shell::GetPrimaryRootWindow());
// Preserve initial snap position
if (split_view_controller->IsWindowInSplitView(window_)) {
initial_snap_position_ =
split_view_controller->GetPositionOfSnappedWindow(window_);
}
split_view_controller->OnWindowDragStarted(window_); split_view_controller->OnWindowDragStarted(window_);
// Note SplitViewController::OnWindowDragStarted() may open overview. // Note SplitViewController::OnWindowDragStarted() may open overview.
if (Shell::Get()->overview_controller()->InOverviewSession()) if (Shell::Get()->overview_controller()->InOverviewSession())
...@@ -569,11 +576,15 @@ DragWindowFromShelfController::GetSnapPositionOnDragEnd( ...@@ -569,11 +576,15 @@ DragWindowFromShelfController::GetSnapPositionOnDragEnd(
const gfx::PointF& location_in_screen, const gfx::PointF& location_in_screen,
base::Optional<float> velocity_y) const { base::Optional<float> velocity_y) const {
if (!Shell::Get()->overview_controller()->InOverviewSession() || if (!Shell::Get()->overview_controller()->InOverviewSession() ||
ShouldRestoreToOriginalBounds(location_in_screen) ||
ShouldGoToHomeScreen(location_in_screen, velocity_y)) { ShouldGoToHomeScreen(location_in_screen, velocity_y)) {
return SplitViewController::NONE; return SplitViewController::NONE;
} }
// When dragging ends but restore to original bounds, we should restore
// window's initial snap position
if (ShouldRestoreToOriginalBounds(location_in_screen))
return initial_snap_position_;
return GetSnapPosition(location_in_screen); return GetSnapPosition(location_in_screen);
} }
......
...@@ -205,6 +205,9 @@ class ASH_EXPORT DragWindowFromShelfController : public aura::WindowObserver { ...@@ -205,6 +205,9 @@ class ASH_EXPORT DragWindowFromShelfController : public aura::WindowObserver {
bool during_window_restoration_callback_ = false; bool during_window_restoration_callback_ = false;
SplitViewController::SnapPosition initial_snap_position_ =
SplitViewController::NONE;
SplitViewController::SnapPosition end_snap_position_ = SplitViewController::SnapPosition end_snap_position_ =
SplitViewController::NONE; SplitViewController::NONE;
......
...@@ -1154,4 +1154,56 @@ TEST_F(DragWindowFromShelfControllerTest, DropsIntoOverviewAtCorrectPosition) { ...@@ -1154,4 +1154,56 @@ TEST_F(DragWindowFromShelfControllerTest, DropsIntoOverviewAtCorrectPosition) {
parent)); parent));
} }
// Tests that when dragging a snapped window is cancelled, the window
// still keep at the original snap position.
TEST_F(DragWindowFromShelfControllerTest,
KeepSplitWindowSnappedAfterRestoreToOriginalBounds) {
UpdateDisplay("400x400");
const gfx::Rect shelf_bounds =
Shelf::ForWindow(Shell::GetPrimaryRootWindow())->GetIdealBounds();
auto window1 = CreateTestWindow();
auto window2 = CreateTestWindow();
// In splitview mode, the snapped windows will stay visible during dragging.
split_view_controller()->SnapWindow(window1.get(), SplitViewController::LEFT);
split_view_controller()->SnapWindow(window2.get(),
SplitViewController::RIGHT);
// Try to drag a left snapped window from shelf, but finally restore to
// original bounds.
StartDrag(window1.get(), shelf_bounds.left_center(), HotseatState::kExtended);
Drag(gfx::Point(0, 200), 1.f, 1.f);
EndDrag(shelf_bounds.bottom_left(), /*velocity_y=*/base::nullopt);
// Ensure that the window still keep its initial snap position.
EXPECT_TRUE(split_view_controller()->IsWindowInSplitView(window1.get()));
EXPECT_EQ(split_view_controller()->GetPositionOfSnappedWindow(window1.get()),
SplitViewController::LEFT);
// Try to drag a right snapped window from shelf, and finally drop to
// overview.
StartDrag(window2.get(), shelf_bounds.right_center(),
HotseatState::kExtended);
Drag(gfx::Point(400, 200), 1.f, 1.f);
DragWindowFromShelfControllerTestApi().WaitUntilOverviewIsShown(
window_drag_controller());
OverviewController* overview_controller = Shell::Get()->overview_controller();
OverviewSession* overview_session = overview_controller->overview_session();
EndDrag(gfx::Point(200, 200), /*velocity_y=*/base::nullopt);
// Ensure that the window is not in splitview but in overview.
EXPECT_FALSE(split_view_controller()->IsWindowInSplitView(window2.get()));
EXPECT_TRUE(overview_session->IsWindowInOverview(window2.get()));
// Try to drag the left window again within the restore distance.
StartDrag(window1.get(), shelf_bounds.left_center(), HotseatState::kExtended);
Drag(gfx::Point(0, 200), 1.f, 1.f);
EndDrag(shelf_bounds.bottom_left(), /*velocity_y=*/base::nullopt);
// Ensure that the left window still keep snapped.
EXPECT_TRUE(split_view_controller()->IsWindowInSplitView(window1.get()));
EXPECT_EQ(split_view_controller()->GetPositionOfSnappedWindow(window1.get()),
SplitViewController::LEFT);
// Ensure that the right window is still in the overview.
EXPECT_FALSE(split_view_controller()->IsWindowInSplitView(window2.get()));
EXPECT_TRUE(overview_session->IsWindowInOverview(window2.get()));
}
} // namespace ash } // namespace ash
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