palette_welcome_bubble.cc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/palette/palette_welcome_bubble.h"
  5. #include <memory>
  6. #include "ash/assistant/util/assistant_util.h"
  7. #include "ash/constants/ash_pref_names.h"
  8. #include "ash/public/cpp/shell_window_ids.h"
  9. #include "ash/session/session_controller_impl.h"
  10. #include "ash/shell.h"
  11. #include "ash/strings/grit/ash_strings.h"
  12. #include "ash/system/palette/palette_tray.h"
  13. #include "components/prefs/pref_registry_simple.h"
  14. #include "components/prefs/pref_service.h"
  15. #include "ui/aura/window.h"
  16. #include "ui/base/l10n/l10n_util.h"
  17. #include "ui/base/metadata/metadata_header_macros.h"
  18. #include "ui/base/metadata/metadata_impl_macros.h"
  19. #include "ui/views/bubble/bubble_dialog_delegate_view.h"
  20. #include "ui/views/controls/label.h"
  21. #include "ui/views/layout/fill_layout.h"
  22. namespace ash {
  23. namespace {
  24. // Width of the bubble content label size.
  25. constexpr int kBubbleContentLabelPreferredWidthDp = 380;
  26. } // namespace
  27. // Controlled by PaletteWelcomeBubble and anchored to a PaletteTray.
  28. class PaletteWelcomeBubble::WelcomeBubbleView
  29. : public views::BubbleDialogDelegateView {
  30. public:
  31. METADATA_HEADER(WelcomeBubbleView);
  32. WelcomeBubbleView(views::View* anchor, views::BubbleBorder::Arrow arrow)
  33. : views::BubbleDialogDelegateView(anchor, arrow) {
  34. SetTitle(
  35. l10n_util::GetStringUTF16(IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_TITLE));
  36. SetShowTitle(true);
  37. SetShowCloseButton(true);
  38. SetButtons(ui::DIALOG_BUTTON_NONE);
  39. set_close_on_deactivate(true);
  40. SetCanActivate(false);
  41. set_accept_events(true);
  42. set_parent_window(
  43. anchor_widget()->GetNativeWindow()->GetRootWindow()->GetChildById(
  44. kShellWindowId_SettingBubbleContainer));
  45. views::BubbleDialogDelegateView::CreateBubble(this);
  46. }
  47. WelcomeBubbleView(const WelcomeBubbleView&) = delete;
  48. WelcomeBubbleView& operator=(const WelcomeBubbleView&) = delete;
  49. ~WelcomeBubbleView() override = default;
  50. void Init() override {
  51. SetUseDefaultFillLayout(true);
  52. views::Builder<views::BubbleDialogDelegateView>(this)
  53. .AddChild(
  54. views::Builder<views::Label>()
  55. .SetText(l10n_util::GetStringUTF16(
  56. assistant::util::IsGoogleDevice() &&
  57. !ash::features::
  58. IsDeprecateAssistantStylusFeaturesEnabled()
  59. ? IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_WITH_ASSISTANT_DESCRIPTION
  60. : IDS_ASH_STYLUS_WARM_WELCOME_BUBBLE_DESCRIPTION))
  61. .SetHorizontalAlignment(gfx::ALIGN_LEFT)
  62. .SetMultiLine(true)
  63. .SizeToFit(kBubbleContentLabelPreferredWidthDp))
  64. .BuildChildren();
  65. }
  66. };
  67. BEGIN_METADATA(PaletteWelcomeBubble,
  68. WelcomeBubbleView,
  69. views::BubbleDialogDelegateView)
  70. END_METADATA
  71. PaletteWelcomeBubble::PaletteWelcomeBubble(PaletteTray* tray) : tray_(tray) {
  72. Shell::Get()->session_controller()->AddObserver(this);
  73. }
  74. PaletteWelcomeBubble::~PaletteWelcomeBubble() {
  75. DisconnectObservers();
  76. Shell::Get()->session_controller()->RemoveObserver(this);
  77. CHECK(!views::WidgetObserver::IsInObserverList());
  78. }
  79. // static
  80. void PaletteWelcomeBubble::RegisterProfilePrefs(PrefRegistrySimple* registry) {
  81. registry->RegisterBooleanPref(prefs::kShownPaletteWelcomeBubble, false);
  82. }
  83. void PaletteWelcomeBubble::OnWidgetDestroying(views::Widget* widget) {
  84. DCHECK(bubble_view_ && bubble_view_->GetWidget() == widget);
  85. DisconnectObservers();
  86. }
  87. void PaletteWelcomeBubble::OnActiveUserPrefServiceChanged(
  88. PrefService* pref_service) {
  89. active_user_pref_service_ = pref_service;
  90. }
  91. void PaletteWelcomeBubble::ShowIfNeeded() {
  92. if (!active_user_pref_service_)
  93. return;
  94. if (Shell::Get()->session_controller()->GetSessionState() !=
  95. session_manager::SessionState::ACTIVE) {
  96. return;
  97. }
  98. absl::optional<user_manager::UserType> user_type =
  99. Shell::Get()->session_controller()->GetUserType();
  100. if (user_type && (*user_type == user_manager::USER_TYPE_GUEST ||
  101. *user_type == user_manager::USER_TYPE_PUBLIC_ACCOUNT)) {
  102. return;
  103. }
  104. if (!HasBeenShown())
  105. Show();
  106. }
  107. bool PaletteWelcomeBubble::HasBeenShown() const {
  108. return active_user_pref_service_ && active_user_pref_service_->GetBoolean(
  109. prefs::kShownPaletteWelcomeBubble);
  110. }
  111. void PaletteWelcomeBubble::MarkAsShown() {
  112. DCHECK(active_user_pref_service_);
  113. active_user_pref_service_->SetBoolean(prefs::kShownPaletteWelcomeBubble,
  114. true);
  115. }
  116. views::View* PaletteWelcomeBubble::GetBubbleViewForTesting() {
  117. return bubble_view_;
  118. }
  119. void PaletteWelcomeBubble::Show() {
  120. if (!bubble_view_) {
  121. DCHECK(tray_);
  122. bubble_view_ =
  123. new WelcomeBubbleView(tray_, views::BubbleBorder::BOTTOM_RIGHT);
  124. }
  125. MarkAsShown();
  126. bubble_view_->GetWidget()->Show();
  127. bubble_view_->GetWidget()->AddObserver(this);
  128. Shell::Get()->AddPreTargetHandler(this);
  129. }
  130. void PaletteWelcomeBubble::Hide() {
  131. if (bubble_view_) {
  132. bubble_view_->GetWidget()->Close();
  133. DisconnectObservers();
  134. }
  135. }
  136. void PaletteWelcomeBubble::DisconnectObservers() {
  137. if (bubble_view_) {
  138. bubble_view_->GetWidget()->RemoveObserver(this);
  139. bubble_view_ = nullptr;
  140. }
  141. Shell::Get()->RemovePreTargetHandler(this);
  142. }
  143. void PaletteWelcomeBubble::OnMouseEvent(ui::MouseEvent* event) {
  144. if (bubble_view_ && event->type() == ui::ET_MOUSE_PRESSED &&
  145. event->target() != bubble_view_->GetWidget()->GetNativeView()) {
  146. bubble_view_->GetWidget()->Close();
  147. }
  148. }
  149. void PaletteWelcomeBubble::OnTouchEvent(ui::TouchEvent* event) {
  150. if (bubble_view_ && event->type() == ui::ET_TOUCH_PRESSED &&
  151. event->target() != bubble_view_->GetWidget()->GetNativeView()) {
  152. bubble_view_->GetWidget()->Close();
  153. }
  154. }
  155. } // namespace ash