#include "ash/app_list/test/app_list_test_helper.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/controls/contextual_tooltip.h"
#include "ash/public/cpp/shelf_types.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shelf/drag_handle.h"
#include "ash/shelf/drag_window_from_shelf_controller.h"
#include "ash/shelf/drag_window_from_shelf_controller_test_api.h"
#include "ash/shelf/shelf_layout_manager.h"
#include "ash/shelf/test/shelf_layout_manager_test_base.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "ash/wm/overview/overview_controller.h"
#include "ash/wm/tablet_mode/tablet_mode_controller_test_api.h"
#include "base/functional/bind.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
#include "ui/gfx/scoped_animation_duration_scale_mode.h"
#include "ui/wm/core/window_util.h"
namespace ash {
namespace {
ShelfWidget* GetShelfWidget() {
return AshTestBase::GetPrimaryShelf()->shelf_widget();
}
ShelfLayoutManager* GetShelfLayoutManager() {
return AshTestBase::GetPrimaryShelf()->shelf_layout_manager();
}
}
class DragHandleContextualNudgeTest : public ShelfLayoutManagerTestBase {
public:
DragHandleContextualNudgeTest() {
scoped_feature_list_.InitAndEnableFeature(
features::kHideShelfControlsInTabletMode);
}
~DragHandleContextualNudgeTest() override = default;
DragHandleContextualNudgeTest(const DragHandleContextualNudgeTest& other) =
delete;
DragHandleContextualNudgeTest& operator=(
const DragHandleContextualNudgeTest& other) = delete;
void SetUp() override {
ShelfLayoutManagerTestBase::SetUp();
test_clock_.Advance(base::Hours(2));
contextual_tooltip::OverrideClockForTesting(&test_clock_);
}
void TearDown() override {
contextual_tooltip::ClearClockOverrideForTesting();
AshTestBase::TearDown();
}
base::SimpleTestClock test_clock_;
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
class DragHandleContextualNudgeTestA11yPrefs
: public DragHandleContextualNudgeTest,
public ::testing::WithParamInterface<std::string> {};
INSTANTIATE_TEST_SUITE_P(
All,
DragHandleContextualNudgeTestA11yPrefs,
testing::Values(prefs::kAccessibilityAutoclickEnabled,
prefs::kAccessibilitySpokenFeedbackEnabled,
prefs::kAccessibilitySwitchAccessEnabled));
TEST_F(DragHandleContextualNudgeTest, ShowDragHandleNudgeWithTimer) {
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, HideDragHandleNudgeHiddenOnMinimize) {
base::HistogramTester histogram_tester;
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
widget->Minimize();
EXPECT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeHiddenOnClose) {
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
DragHandle* const drag_handle = GetShelfWidget()->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
widget->CloseWithReason(views::Widget::ClosedReason::kCloseButtonClicked);
EXPECT_FALSE(drag_handle->GetVisible());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest,
HideDragHandleDoesNotInteruptShowNudgeAnimation) {
GetPrimaryShelf()->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
gfx::ScopedAnimationDurationScaleMode normal_animation_duration(
gfx::ScopedAnimationDurationScaleMode::SLOW_DURATION);
GetShelfWidget()->GetDragHandle()->MaybeShowDragHandleNudge();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->show_nudge_animation_in_progress());
GetShelfLayoutManager()->UpdateAutoHideState();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->show_nudge_animation_in_progress());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNotShownForAutoHideShelf) {
GetPrimaryShelf()->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->show_nudge_animation_in_progress());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, DoNotShowNudgeWithoutDragHandle) {
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
widget->Minimize();
EXPECT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest,
ContinueShowingDragHandleNudgeOnActiveWidgetChanged) {
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
views::Widget* new_widget = CreateTestWidget();
new_widget->Maximize();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeShownInAppShelf) {
base::HistogramTester histogram_tester;
views::Widget* widget = CreateTestWidget();
widget->Maximize();
EXPECT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_TRUE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_FALSE(GetShelfWidget()
->GetDragHandle()
->has_hide_drag_handle_timer_for_testing());
TabletModeControllerTestApi().LeaveTabletMode();
EXPECT_FALSE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_FALSE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
test_clock_.Advance(base::Hours(25));
TabletModeControllerTestApi().LeaveTabletMode();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_TRUE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_FALSE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
EXPECT_TRUE(GetShelfWidget()
->GetDragHandle()
->has_hide_drag_handle_timer_for_testing());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeShownOnTap) {
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_TRUE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
TabletModeControllerTestApi().LeaveTabletMode();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
GetEventGenerator()->GestureTapAt(
GetShelfWidget()->GetDragHandle()->GetBoundsInScreen().CenterPoint());
EXPECT_FALSE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_TRUE(GetShelfWidget()
->GetDragHandle()
->has_hide_drag_handle_timer_for_testing());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeNotShownForHiddenShelf) {
GetPrimaryShelf()->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EXPECT_TRUE(drag_handle->GetVisible());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
EXPECT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
PrefService* const prefs =
Shell::Get()->session_controller()->GetLastActiveUserPrefService();
EXPECT_TRUE(contextual_tooltip::ShouldShowNudge(
prefs, contextual_tooltip::TooltipType::kBackGesture, nullptr));
SwipeUpOnShelf();
EXPECT_FALSE(contextual_tooltip::ShouldShowNudge(
prefs, contextual_tooltip::TooltipType::kBackGesture, nullptr));
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest,
DragHandleNudgeTapDoesNotHideAutoHiddenShelf) {
GetPrimaryShelf()->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EXPECT_TRUE(GetPrimaryShelf()->GetAutoHideState() ==
ShelfAutoHideState::SHELF_AUTO_HIDE_HIDDEN);
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
EXPECT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
SwipeUpOnShelf();
EXPECT_TRUE(GetPrimaryShelf()->GetAutoHideState() ==
ShelfAutoHideState::SHELF_AUTO_HIDE_SHOWN);
EXPECT_EQ(HotseatState::kExtended, GetShelfLayoutManager()->hotseat_state());
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
EXPECT_TRUE(drag_handle->drag_handle_nudge() != nullptr);
GetEventGenerator()->GestureTapAt(
drag_handle->drag_handle_nudge()->GetBoundsInScreen().CenterPoint());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
EXPECT_TRUE(GetPrimaryShelf()->GetAutoHideState() ==
ShelfAutoHideState::SHELF_AUTO_HIDE_SHOWN);
EXPECT_EQ(HotseatState::kExtended, GetShelfLayoutManager()->hotseat_state());
SwipeDownOnShelf();
EXPECT_EQ(HotseatState::kHidden, GetShelfLayoutManager()->hotseat_state());
EXPECT_TRUE(GetPrimaryShelf()->GetAutoHideState() ==
ShelfAutoHideState::SHELF_AUTO_HIDE_HIDDEN);
SwipeUpOnShelf();
EXPECT_TRUE(GetPrimaryShelf()->GetAutoHideState() ==
ShelfAutoHideState::SHELF_AUTO_HIDE_SHOWN);
EXPECT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
EXPECT_TRUE(drag_handle->drag_handle_nudge() == nullptr);
EXPECT_EQ(HotseatState::kExtended, GetShelfLayoutManager()->hotseat_state());
}
TEST_F(DragHandleContextualNudgeTest, HidingShelfCancelsDragHandleShow) {
GetPrimaryShelf()->SetAutoHideBehavior(ShelfAutoHideBehavior::kAlways);
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EXPECT_TRUE(drag_handle->GetVisible());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
EXPECT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
SwipeUpOnShelf();
EXPECT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
SwipeDownOnShelf();
EXPECT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
PrefService* const prefs =
Shell::Get()->session_controller()->GetLastActiveUserPrefService();
EXPECT_TRUE(contextual_tooltip::ShouldShowNudge(
prefs, contextual_tooltip::TooltipType::kBackGesture, nullptr));
}
TEST_F(DragHandleContextualNudgeTest,
DragHandleNudgeNotHiddenByExtendingHotseat) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
SwipeUpOnShelf();
EXPECT_TRUE(drag_handle->GetVisible());
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeBoundsInScreen) {
UpdateDisplay("675x1200");
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EXPECT_TRUE(drag_handle->GetVisible());
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
auto margin_diff = [](const gfx::Rect& inner, const gfx::Rect& outer) -> int {
const int left = inner.x() - outer.x();
EXPECT_GE(left, 0);
const int right = outer.right() - inner.right();
EXPECT_GE(right, 0);
return std::abs(left - right);
};
gfx::Rect shelf_bounds = shelf_widget->GetWindowBoundsInScreen();
gfx::Rect nudge_bounds =
drag_handle->drag_handle_nudge()->label()->GetBoundsInScreen();
EXPECT_LE(margin_diff(nudge_bounds, shelf_bounds), 1);
gfx::Rect drag_handle_bounds = drag_handle->GetBoundsInScreen();
EXPECT_LE(shelf_bounds.y(), nudge_bounds.y());
EXPECT_LE(nudge_bounds.bottom(), drag_handle_bounds.y());
UpdateDisplay("1200x675");
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
shelf_bounds = shelf_widget->GetWindowBoundsInScreen();
nudge_bounds = drag_handle->drag_handle_nudge()->label()->GetBoundsInScreen();
EXPECT_LE(margin_diff(nudge_bounds, shelf_bounds), 1);
drag_handle_bounds = drag_handle->GetBoundsInScreen();
EXPECT_LE(shelf_bounds.y(), nudge_bounds.y());
EXPECT_LE(nudge_bounds.bottom(), drag_handle_bounds.y());
}
TEST_F(DragHandleContextualNudgeTest,
DragHandleNudgeNotHiddenDuringWindowDragFromShelf) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
TabletModeControllerTestApi().LeaveTabletMode();
test_clock_.Advance(base::Hours(25));
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->has_hide_drag_handle_timer_for_testing());
const gfx::Point start = drag_handle->GetBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -200), base::Milliseconds(50),
6,
base::BindRepeating(
[](DragHandle* drag_handle, ui::EventType type,
const gfx::Vector2dF& offset) {
DragWindowFromShelfController* window_drag_controller =
GetShelfLayoutManager()->window_drag_controller_for_testing();
if (window_drag_controller &&
window_drag_controller->dragged_window()) {
EXPECT_FALSE(
drag_handle->has_hide_drag_handle_timer_for_testing());
}
const bool scroll_end = type == ui::EventType::kGestureScrollEnd;
EXPECT_EQ(!scroll_end,
drag_handle->gesture_nudge_target_visibility());
},
drag_handle));
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest,
DragHandleNudgeNotShownDuringWindowDragFromShelf) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EXPECT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
const gfx::Point start =
GetShelfWidget()->GetWindowBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -200), base::Milliseconds(50),
6,
base::BindRepeating(
[](DragHandle* drag_handle, ui::EventType type,
const gfx::Vector2dF& offset) {
DragWindowFromShelfController* window_drag_controller =
GetShelfLayoutManager()->window_drag_controller_for_testing();
if (window_drag_controller &&
window_drag_controller->dragged_window()) {
EXPECT_FALSE(
drag_handle->has_show_drag_handle_timer_for_testing());
if (type != ui::EventType::kGestureScrollEnd) {
drag_handle->ScheduleShowDragHandleNudge();
EXPECT_FALSE(
drag_handle->has_show_drag_handle_timer_for_testing());
}
}
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
},
drag_handle));
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, GestureSwipeHidesDragHandleNudge) {
base::HistogramTester histogram_tester;
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
const gfx::Point start = drag_handle->GetBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequence(
start, start + gfx::Vector2d(0, -300), base::Milliseconds(10),
5);
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
GetAppListTestHelper()->CheckVisibility(true);
}
TEST_F(DragHandleContextualNudgeTest, FlingFromShelfToHomeHidesTheNudge) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
const gfx::Point start = drag_handle->GetBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -300), base::Milliseconds(10),
6,
base::BindRepeating(
[](DragHandle* drag_handle, ui::EventType type,
const gfx::Vector2dF& offset) {
const bool scroll_end = type == ui::EventType::kGestureScrollEnd;
EXPECT_EQ(!scroll_end,
drag_handle->gesture_nudge_target_visibility());
},
drag_handle));
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
GetAppListTestHelper()->CheckVisibility(true);
}
TEST_F(DragHandleContextualNudgeTest, DragFromShelfToHomeHidesTheNudge) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
const gfx::Point start = drag_handle->GetBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -150), base::Milliseconds(500),
20,
base::BindRepeating(
[](DragHandle* drag_handle, ui::EventType type,
const gfx::Vector2dF& offset) {
DragWindowFromShelfController* window_drag_controller =
GetShelfLayoutManager()->window_drag_controller_for_testing();
if (window_drag_controller &&
window_drag_controller->dragged_window()) {
DragWindowFromShelfControllerTestApi().WaitUntilOverviewIsShown(
window_drag_controller);
}
const bool scroll_end = type == ui::EventType::kGestureScrollEnd;
EXPECT_EQ(!scroll_end,
drag_handle->gesture_nudge_target_visibility());
},
drag_handle));
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
GetAppListTestHelper()->CheckVisibility(false);
EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
}
TEST_F(DragHandleContextualNudgeTest, OverviewCancelsNudgeShow) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
EnterOverview();
ASSERT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleTapShowNudgeInOverview) {
TabletModeControllerTestApi().EnterTabletMode();
views::Widget* widget = CreateTestWidget();
widget->Maximize();
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
ASSERT_TRUE(drag_handle->has_show_drag_handle_timer_for_testing());
drag_handle->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
TabletModeControllerTestApi().LeaveTabletMode();
TabletModeControllerTestApi().EnterTabletMode();
EnterOverview();
ASSERT_FALSE(drag_handle->has_show_drag_handle_timer_for_testing());
GetEventGenerator()->GestureTapAt(
drag_handle->GetBoundsInScreen().CenterPoint());
EXPECT_TRUE(drag_handle->GetVisible());
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
EXPECT_TRUE(drag_handle->has_hide_drag_handle_timer_for_testing());
drag_handle->fire_hide_drag_handle_timer_for_testing();
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
GetEventGenerator()->GestureTapAt(
drag_handle->GetBoundsInScreen().CenterPoint());
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest,
DragHandleTapDoesNotShowNudgeForSplitScreen) {
TabletModeControllerTestApi().EnterTabletMode();
std::unique_ptr<aura::Window> window =
AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
EnterOverview();
SplitViewController* split_view_controller =
SplitViewController::Get(shelf_widget->GetNativeWindow());
split_view_controller->SnapWindow(window.get(), SnapPosition::kPrimary);
EXPECT_TRUE(split_view_controller->InSplitViewMode());
GetEventGenerator()->GestureTapAt(
drag_handle->GetBoundsInScreen().CenterPoint());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
}
TEST_F(DragHandleContextualNudgeTest, DragHandleNudgeHiddenOnSplitScreen) {
TabletModeControllerTestApi().EnterTabletMode();
std::unique_ptr<aura::Window> window =
AshTestBase::CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
ShelfWidget* const shelf_widget = GetShelfWidget();
DragHandle* const drag_handle = shelf_widget->GetDragHandle();
GetEventGenerator()->GestureTapAt(
drag_handle->GetBoundsInScreen().CenterPoint());
EXPECT_TRUE(drag_handle->gesture_nudge_target_visibility());
EnterOverview();
SplitViewController* split_view_controller =
SplitViewController::Get(shelf_widget->GetNativeWindow());
split_view_controller->SnapWindow(window.get(), SnapPosition::kPrimary);
EXPECT_TRUE(split_view_controller->InSplitViewMode());
EXPECT_FALSE(drag_handle->gesture_nudge_target_visibility());
}
TEST_P(DragHandleContextualNudgeTestA11yPrefs, HideNudgesForShelfControls) {
SCOPED_TRACE(testing::Message() << "Pref=" << GetParam());
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
GetShelfWidget()->GetDragHandle()->fire_show_drag_handle_timer_for_testing();
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_TRUE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
Shell::Get()
->session_controller()
->GetLastActiveUserPrefService()
->SetBoolean(GetParam(), true);
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
}
TEST_P(DragHandleContextualNudgeTestA11yPrefs, DisableNudgesForShelfControls) {
SCOPED_TRACE(testing::Message() << "Pref=" << GetParam());
Shell::Get()
->session_controller()
->GetLastActiveUserPrefService()
->SetBoolean(GetParam(), true);
views::Widget* widget = CreateTestWidget();
widget->Maximize();
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_EQ(ShelfBackgroundType::kInApp,
GetShelfLayoutManager()->shelf_background_type());
EXPECT_TRUE(GetShelfWidget()->GetDragHandle()->GetVisible());
EXPECT_FALSE(
GetShelfWidget()->GetDragHandle()->gesture_nudge_target_visibility());
EXPECT_FALSE(GetShelfWidget()
->GetDragHandle()
->has_show_drag_handle_timer_for_testing());
}
}