diff --git a/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.cc b/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.cc index 78e8949e94bd..f795ec93281b 100644 --- a/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.cc +++ b/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.cc @@ -25,6 +25,8 @@ namespace { constexpr int kWidth = 60; constexpr int kHeight = 60; +constexpr base::TimeDelta kBubbleAutoClosingIntervalInSec = base::Seconds(15); + // The points here are defined as start and end points of the gradient, // associated with an entire rect constexpr SkPoint kPts[] = {{0, 0}, {kWidth, kHeight}}; @@ -116,6 +118,11 @@ bool BraveHelpBubbleHostView::Show() { UpdatePosition(); SetVisible(true); + bubble_auto_closing_timer_.Start( + FROM_HERE, kBubbleAutoClosingIntervalInSec, + base::BindOnce(&BraveHelpBubbleHostView::Hide, + weak_factory_.GetWeakPtr())); + if (gfx::Animation::ShouldRenderRichAnimation()) { SchedulePulsingAnimation(layer()); } @@ -205,6 +212,20 @@ void BraveHelpBubbleHostView::OnWidgetDestroying(views::Widget* widget) { host_widget_observation_.Reset(); } +void BraveHelpBubbleHostView::OnWidgetActivationChanged(views::Widget* widget, + bool active) { + if (help_bubble_ != widget) { + return; + } + + if (active) { + // Initially, bubble is launched in inactive state. + // If user activates it explicitely, we don't need to close it by timer. + // Instead, bubble will be closed when it goes inactive state later. + bubble_auto_closing_timer_.Stop(); + } +} + void BraveHelpBubbleHostView::OnTrackedElementActivated( ui::TrackedElement* element) { Hide(); diff --git a/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.h b/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.h index c9cc69ba511e..d90c20ee7559 100644 --- a/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.h +++ b/browser/ui/views/brave_help_bubble/brave_help_bubble_host_view.h @@ -9,6 +9,7 @@ #include #include +#include "base/timer/timer.h" #include "brave/browser/ui/views/brave_help_bubble/brave_help_bubble_delegate_view.h" #include "ui/views/interaction/element_tracker_views.h" #include "ui/views/view.h" @@ -47,12 +48,16 @@ class BraveHelpBubbleHostView : public views::View, // views::WidgetObserver: void OnWidgetBoundsChanged(views::Widget* widget, const gfx::Rect&) override; void OnWidgetDestroying(views::Widget* widget) override; + void OnWidgetActivationChanged(views::Widget* widget, bool active) override; void OnTrackedElementActivated(ui::TrackedElement* element); std::string text_; raw_ptr tracked_element_ = nullptr; raw_ptr help_bubble_ = nullptr; + + // Bubble will be closed if user doesn't interact with it for some time. + base::OneShotTimer bubble_auto_closing_timer_; ui::ElementTracker::Subscription activated_subscription_; base::ScopedObservation tracked_view_observation_{this};