#include "ash/shelf/home_to_overview_nudge_controller.h"
#include "ash/constants/ash_features.h"
#include "ash/constants/ash_pref_names.h"
#include "ash/controls/contextual_nudge.h"
#include "ash/controls/contextual_tooltip.h"
#include "ash/session/session_controller_impl.h"
#include "ash/shelf/hotseat_widget.h"
#include "ash/shelf/shelf.h"
#include "ash/shelf/shelf_layout_manager.h"
#include "ash/shelf/swipe_home_to_overview_controller.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 "ash/wm/window_state.h"
#include "base/functional/bind.h"
#include "base/memory/weak_ptr.h"
#include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_clock.h"
#include "ui/compositor/layer.h"
#include "ui/compositor/layer_animator.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/geometry/rect_f.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/scoped_animation_duration_scale_mode.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/core/window_util.h"
namespace ash {
class WidgetCloseObserver {
public:
explicit WidgetCloseObserver(views::Widget* widget)
: widget_(widget->GetWeakPtr()) {}
~WidgetCloseObserver() = default;
bool WidgetClosed() const { return !widget_ || widget_->IsClosed(); }
private:
base::WeakPtr<views::Widget> widget_;
};
class HomeToOverviewNudgeControllerWithNudgesDisabledTest
: public NoSessionAshTestBase {
public:
HomeToOverviewNudgeControllerWithNudgesDisabledTest() {
scoped_feature_list_.InitAndDisableFeature(
features::kHideShelfControlsInTabletMode);
}
~HomeToOverviewNudgeControllerWithNudgesDisabledTest() override = default;
HomeToOverviewNudgeControllerWithNudgesDisabledTest(
const HomeToOverviewNudgeControllerWithNudgesDisabledTest& other) =
delete;
HomeToOverviewNudgeControllerWithNudgesDisabledTest& operator=(
const HomeToOverviewNudgeControllerWithNudgesDisabledTest& other) =
delete;
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
class HomeToOverviewNudgeControllerTest : public NoSessionAshTestBase {
public:
HomeToOverviewNudgeControllerTest() {
scoped_feature_list_.InitAndEnableFeature(
features::kHideShelfControlsInTabletMode);
}
~HomeToOverviewNudgeControllerTest() override = default;
HomeToOverviewNudgeControllerTest(
const HomeToOverviewNudgeControllerTest& other) = delete;
HomeToOverviewNudgeControllerTest& operator=(
const HomeToOverviewNudgeControllerTest& other) = delete;
void SetUp() override {
NoSessionAshTestBase::SetUp();
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOGIN_PRIMARY);
test_clock_.Advance(base::Hours(2));
contextual_tooltip::OverrideClockForTesting(&test_clock_);
}
void TearDown() override {
contextual_tooltip::ClearClockOverrideForTesting();
NoSessionAshTestBase::TearDown();
}
HomeToOverviewNudgeController* GetNudgeController() {
return GetPrimaryShelf()
->shelf_layout_manager()
->home_to_overview_nudge_controller_for_testing();
}
views::Widget* GetNudgeWidget() {
if (!GetNudgeController()->nudge_for_testing())
return nullptr;
return GetNudgeController()->nudge_for_testing()->GetWidget();
}
HotseatWidget* GetHotseatWidget() {
return GetPrimaryShelf()->shelf_widget()->hotseat_widget();
}
using ScopedWindowList = std::vector<std::unique_ptr<aura::Window>>;
ScopedWindowList CreateAndMinimizeWindows(int count) {
ScopedWindowList windows;
for (int i = 0; i < count; ++i) {
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
WindowState::Get(window.get())->Minimize();
windows.push_back(std::move(window));
}
return windows;
}
void SanityCheckNudgeBounds() {
views::Widget* const nudge_widget = GetNudgeWidget();
ASSERT_TRUE(nudge_widget);
EXPECT_TRUE(nudge_widget->IsVisible());
const gfx::Rect nudge_bounds =
nudge_widget->GetLayer()->transform().MapRect(
nudge_widget->GetNativeWindow()->GetTargetBounds());
HotseatWidget* const hotseat = GetHotseatWidget();
const gfx::Rect hotseat_bounds =
hotseat->GetLayerForNudgeAnimation()->transform().MapRect(
hotseat->GetNativeWindow()->GetTargetBounds());
EXPECT_EQ(hotseat->GetLayerForNudgeAnimation()->transform(),
nudge_widget->GetLayer()->transform());
EXPECT_LE(hotseat_bounds.bottom(), nudge_bounds.y());
const gfx::Rect display_bounds = GetPrimaryDisplay().bounds();
EXPECT_TRUE(display_bounds.Contains(nudge_bounds))
<< display_bounds.ToString() << " contains " << nudge_bounds.ToString();
EXPECT_LE((nudge_bounds.x() - display_bounds.x()) -
(display_bounds.right() - nudge_bounds.right()),
1)
<< nudge_bounds.ToString() << " within " << display_bounds.ToString();
EXPECT_EQ(
1.0f,
GetNudgeController()->nudge_for_testing()->label()->layer()->opacity());
}
base::SimpleTestClock test_clock_;
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
class HomeToOverviewNudgeControllerTestWithA11yPrefs
: public HomeToOverviewNudgeControllerTest,
public ::testing::WithParamInterface<std::string> {};
INSTANTIATE_TEST_SUITE_P(
all,
HomeToOverviewNudgeControllerTestWithA11yPrefs,
testing::Values(prefs::kAccessibilityAutoclickEnabled,
prefs::kAccessibilitySpokenFeedbackEnabled,
prefs::kAccessibilitySwitchAccessEnabled));
TEST_F(HomeToOverviewNudgeControllerWithNudgesDisabledTest,
NoNudgeOnHomeScreen) {
EXPECT_FALSE(GetPrimaryShelf()
->shelf_layout_manager()
->home_to_overview_nudge_controller_for_testing());
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
std::unique_ptr<aura::Window> window_1 =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
WindowState::Get(window_1.get())->Minimize();
std::unique_ptr<aura::Window> window_2 =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
WindowState::Get(window_2.get())->Minimize();
EXPECT_FALSE(GetPrimaryShelf()
->shelf_layout_manager()
->home_to_overview_nudge_controller_for_testing());
}
TEST_F(HomeToOverviewNudgeControllerTest, NoNudgeBeforeLogin) {
TabletModeControllerTestApi().EnterTabletMode();
EXPECT_FALSE(GetNudgeController());
SimulateUserLogin(kRegularUserLoginInfo);
EXPECT_TRUE(GetNudgeController());
}
TEST_F(HomeToOverviewNudgeControllerTest, ShownOnHomeScreen) {
base::HistogramTester histogram_tester;
SimulateUserLogin(kRegularUserLoginInfo);
EXPECT_FALSE(GetNudgeController());
TabletModeControllerTestApi().EnterTabletMode();
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
ScopedWindowList window_1 = CreateAndMinimizeWindows(1);
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
ScopedWindowList window_2 = CreateAndMinimizeWindows(1);
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeController()->nudge_for_testing());
{
SCOPED_TRACE("First nudge");
SanityCheckNudgeBounds();
}
EXPECT_FALSE(GetNudgeController()->HasHideTimerForTesting());
EnterOverview();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ExitOverview();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->transform());
test_clock_.Advance(base::Hours(25));
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
WindowState::Get(window.get())->Minimize();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeController()->nudge_for_testing());
{
SCOPED_TRACE("Second nudge");
SanityCheckNudgeBounds();
}
ASSERT_TRUE(GetNudgeController()->HasHideTimerForTesting());
GetNudgeController()->FireHideTimerForTesting();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->transform());
}
TEST_F(HomeToOverviewNudgeControllerTest, ShownLimitedNumberOfTimes) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
for (int i = 0; i < contextual_tooltip::kNotificationLimit; ++i) {
SCOPED_TRACE(testing::Message() << "Attempt " << i);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeController()->nudge_for_testing());
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
test_clock_.Advance(base::Hours(25));
WindowState::Get(window.get())->Minimize();
}
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
}
TEST_F(HomeToOverviewNudgeControllerTest, HiddenOnTabletModeExit) {
base::HistogramTester histogram_tester;
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
TabletModeControllerTestApi().LeaveTabletMode();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest, ShowCanceledOnTabletModeExit) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
TabletModeControllerTestApi().LeaveTabletMode();
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest,
ShowAnimationCanceledOnTabletModeExit) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
gfx::ScopedAnimationDurationScaleMode test_duration_mode(
gfx::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeWidget()->GetLayer()->GetAnimator()->is_animating());
TabletModeControllerTestApi().LeaveTabletMode();
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest, HiddenOnScreenLock) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
GetSessionControllerClient()->SetSessionState(
session_manager::SessionState::LOCKED);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
test_clock_.Advance(base::Hours(25));
ScopedWindowList locked_session_window = CreateAndMinimizeWindows(1);
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
}
TEST_F(HomeToOverviewNudgeControllerTest, InAppShelfShownBeforeShowTimer) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_TRUE(GetNudgeController()->HasShowTimerForTesting());
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
WindowState::Get(window.get())->Minimize();
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
EXPECT_TRUE(GetNudgeController()->nudge_for_testing());
EXPECT_FALSE(GetNudgeController()->HasHideTimerForTesting());
}
TEST_F(HomeToOverviewNudgeControllerTest, NudgeHiddenDuringShowAnimation) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
gfx::ScopedAnimationDurationScaleMode test_duration_mode(
gfx::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeWidget()->GetLayer()->GetAnimator()->is_animating());
ContextualNudge* nudge = GetNudgeController()->nudge_for_testing();
views::Widget* nudge_widget = nudge->GetWidget();
WidgetCloseObserver widget_close_observer(nudge_widget);
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
EXPECT_FALSE(GetNudgeWidget());
EXPECT_FALSE(nudge_widget->IsVisible());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
EXPECT_TRUE(widget_close_observer.WidgetClosed());
EXPECT_TRUE(GetHotseatWidget()
->GetLayerForNudgeAnimation()
->GetAnimator()
->is_animating());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
test_clock_.Advance(base::Hours(25));
WindowState::Get(window.get())->Minimize();
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
EXPECT_TRUE(GetNudgeController()->nudge_for_testing());
EXPECT_TRUE(GetNudgeController()->HasHideTimerForTesting());
}
TEST_F(HomeToOverviewNudgeControllerTest, NoCrashIfNudgeWidgetGetsClosed) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
GetNudgeWidget()->CloseNow();
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
std::unique_ptr<aura::Window> window =
CreateTestWindow(gfx::Rect(0, 0, 400, 400));
wm::ActivateWindow(window.get());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
}
TEST_F(HomeToOverviewNudgeControllerTest, TapOnTheNudgeClosesTheNudge) {
base::HistogramTester histogram_tester;
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeController()->nudge_for_testing());
views::Widget* nudge_widget = GetNudgeWidget();
WidgetCloseObserver widget_close_observer(nudge_widget);
GetEventGenerator()->GestureTapAt(
nudge_widget->GetWindowBoundsInScreen().CenterPoint());
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_TRUE(widget_close_observer.WidgetClosed());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest, TapOnTheNudgeDuringShowAnimation) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList extra_windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
gfx::ScopedAnimationDurationScaleMode test_duration_mode(
gfx::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
GetNudgeController()->FireShowTimerForTesting();
ASSERT_TRUE(GetNudgeWidget()->GetLayer()->GetAnimator()->is_animating());
ContextualNudge* nudge = GetNudgeController()->nudge_for_testing();
views::Widget* nudge_widget = nudge->GetWidget();
WidgetCloseObserver widget_close_observer(nudge_widget);
GetEventGenerator()->GestureTapAt(
nudge_widget->GetWindowBoundsInScreen().CenterPoint());
ASSERT_TRUE(nudge_widget->GetLayer()->GetAnimator()->is_animating());
EXPECT_TRUE(nudge_widget->IsVisible());
EXPECT_EQ(gfx::Transform(), nudge_widget->GetLayer()->GetTargetTransform());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
EXPECT_FALSE(widget_close_observer.WidgetClosed());
ASSERT_TRUE(nudge->label()->layer()->GetAnimator()->is_animating());
EXPECT_EQ(0.0f, nudge->label()->layer()->GetTargetOpacity());
nudge->label()->layer()->GetAnimator()->StopAnimating();
EXPECT_FALSE(GetNudgeWidget());
EXPECT_FALSE(nudge_widget->IsVisible());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
EXPECT_TRUE(widget_close_observer.WidgetClosed());
EXPECT_TRUE(GetHotseatWidget()
->GetLayerForNudgeAnimation()
->GetAnimator()
->is_animating());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest, NoNudgeAfterSuccessfulGestures) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
for (int i = 0; i < contextual_tooltip::kSuccessLimitHomeToOverview; ++i) {
SCOPED_TRACE(testing::Message() << "Attempt " << i);
wm::ActivateWindow(windows[0].get());
WindowState::Get(windows[0].get())->Minimize();
const gfx::Point start = GetPrimaryShelf()
->hotseat_widget()
->GetWindowBoundsInScreen()
.CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -100), base::Milliseconds(50),
12,
base::BindRepeating(
[](ui::EventType type, const gfx::Vector2dF& offset) {
if (type != ui::EventType::kGestureScrollUpdate) {
return;
}
SwipeHomeToOverviewController* swipe_controller =
GetPrimaryShelf()
->shelf_layout_manager()
->swipe_home_to_overview_controller_for_testing();
ASSERT_TRUE(swipe_controller);
base::OneShotTimer* transition_timer =
swipe_controller->overview_transition_timer_for_testing();
if (transition_timer->IsRunning())
transition_timer->FireNow();
}));
ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
}
test_clock_.Advance(base::Hours(25));
ScopedWindowList extra_window = CreateAndMinimizeWindows(1);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
EXPECT_FALSE(GetNudgeController()->HasShowTimerForTesting());
EXPECT_EQ(
gfx::Transform(),
GetHotseatWidget()->GetLayerForNudgeAnimation()->GetTargetTransform());
}
TEST_F(HomeToOverviewNudgeControllerTest, HomeToOverviewGestureFromNudge) {
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
const gfx::Point start =
GetNudgeWidget()->GetWindowBoundsInScreen().CenterPoint();
GetEventGenerator()->GestureScrollSequenceWithCallback(
start, start + gfx::Vector2d(0, -100), base::Milliseconds(50),
12,
base::BindRepeating([](ui::EventType type, const gfx::Vector2dF& offset) {
if (type != ui::EventType::kGestureScrollUpdate) {
return;
}
SwipeHomeToOverviewController* swipe_controller =
GetPrimaryShelf()
->shelf_layout_manager()
->swipe_home_to_overview_controller_for_testing();
ASSERT_TRUE(swipe_controller);
base::OneShotTimer* transition_timer =
swipe_controller->overview_transition_timer_for_testing();
if (transition_timer->IsRunning())
transition_timer->FireNow();
}));
EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
}
TEST_F(HomeToOverviewNudgeControllerTest,
NudgeBoundsUpdatedOnDisplayBoundsChange) {
UpdateDisplay("768x1200");
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
ASSERT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
{
SCOPED_TRACE("Initial bounds");
SanityCheckNudgeBounds();
}
UpdateDisplay("1200x768");
{
SCOPED_TRACE("Updated bounds");
SanityCheckNudgeBounds();
}
}
TEST_P(HomeToOverviewNudgeControllerTestWithA11yPrefs,
HideNudgesForShelfControls) {
SCOPED_TRACE(testing::Message() << "Pref=" << GetParam());
TabletModeControllerTestApi().EnterTabletMode();
SimulateUserLogin(kRegularUserLoginInfo);
ScopedWindowList windows = CreateAndMinimizeWindows(2);
ASSERT_TRUE(GetNudgeController());
EXPECT_TRUE(GetNudgeController()->HasShowTimerForTesting());
GetNudgeController()->FireShowTimerForTesting();
EXPECT_TRUE(GetNudgeController()->nudge_for_testing());
Shell::Get()
->session_controller()
->GetLastActiveUserPrefService()
->SetBoolean(GetParam(), true);
EXPECT_FALSE(GetNudgeController()->nudge_for_testing());
}
TEST_P(HomeToOverviewNudgeControllerTestWithA11yPrefs,
DisableNudgesForShelfControls) {
SCOPED_TRACE(testing::Message() << "Pref=" << GetParam());
Shell::Get()->session_controller()->GetActivePrefService()->SetBoolean(
GetParam(), true);
TabletModeControllerTestApi().EnterTabletMode();
SimulateNewUserFirstLogin("test@gmail.com");
ScopedWindowList windows = CreateAndMinimizeWindows(2);
EXPECT_FALSE(GetNudgeController());
}
}