blob: 58e21407598d486d3a599242525eb479439ead75 [file] [log] [blame]
stluongb287cbf32024-08-16 20:10:561// Copyright 2024 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
stluong8fc2b9f2024-08-23 23:01:135#include "chrome/browser/ui/toasts/api/toast_specification.h"
stluongb287cbf32024-08-16 20:10:566
7#include <memory>
8
9#include "base/check.h"
10#include "base/functional/callback.h"
11#include "base/functional/callback_forward.h"
12#include "base/types/pass_key.h"
Joseph Parkf1147f742024-10-18 17:39:1713#include "ui/menus/simple_menu_model.h"
stluongb287cbf32024-08-16 20:10:5614
15ToastSpecification::Builder::Builder(const gfx::VectorIcon& icon,
16 int body_string_id)
17 : toast_specification_(
18 std::make_unique<ToastSpecification>(base::PassKey<Builder>(),
19 icon,
20 body_string_id)) {}
21
Shakti Sahu226b102b2025-03-13 23:28:5522ToastSpecification::Builder::Builder(const gfx::VectorIcon& icon)
23 : toast_specification_(
24 std::make_unique<ToastSpecification>(base::PassKey<Builder>(),
25 icon)) {}
stluongb287cbf32024-08-16 20:10:5626ToastSpecification::Builder::~Builder() {
27 // Verify that ToastSpecification::Builder::Build() has been called
28 // so the toast specification is completely built.
29 CHECK(!toast_specification_);
30}
31
32ToastSpecification::Builder& ToastSpecification::Builder::AddCloseButton() {
33 toast_specification_->AddCloseButton();
34 return *this;
35}
36
37ToastSpecification::Builder& ToastSpecification::Builder::AddActionButton(
38 int action_button_string_id,
39 base::RepeatingClosure closure) {
40 toast_specification_->AddActionButton(action_button_string_id,
41 std::move(closure));
42 return *this;
43}
44
Jan Keitel29b357c2024-11-07 17:30:5545ToastSpecification::Builder& ToastSpecification::Builder::AddMenu() {
46 toast_specification_->AddMenu();
stluongb287cbf32024-08-16 20:10:5647 return *this;
48}
49
Steven Luongf444e6d2024-09-16 22:08:1350ToastSpecification::Builder& ToastSpecification::Builder::AddGlobalScoped() {
51 toast_specification_->AddGlobalScope();
52 return *this;
53}
54
dljames84817292025-05-21 22:46:1855ToastSpecification::Builder&
56ToastSpecification::Builder::SetToastAsActionable() {
57 toast_specification_->SetToastAsActionable();
dljames402dc5e2025-05-07 23:17:0958 return *this;
59}
60
stluongb287cbf32024-08-16 20:10:5661std::unique_ptr<ToastSpecification> ToastSpecification::Builder::Build() {
62 ValidateSpecification();
63 return std::move(toast_specification_);
64}
65
66void ToastSpecification::Builder::ValidateSpecification() {
67 // Toasts with an action button must have a close button and not a menu.
68 if (toast_specification_->action_button_string_id().has_value()) {
69 CHECK(toast_specification_->has_close_button());
Jan Keitel29b357c2024-11-07 17:30:5570 CHECK(!toast_specification_->has_menu());
stluongb287cbf32024-08-16 20:10:5671 }
Alison Gale6a846e82024-10-01 20:06:1572
73 // Toasts with a menu can't have a close button. If this behavior is needed,
74 // discuss with UX how to design this in a way that supports both.
Jan Keitel29b357c2024-11-07 17:30:5575 if (toast_specification_->has_menu()) {
Alison Gale6a846e82024-10-01 20:06:1576 CHECK(!toast_specification_->has_close_button());
77 }
dljames84817292025-05-21 22:46:1878
79 // Toasts can be manually set as actionable, or have close / menu buttons. Not
80 // both.
81 if (toast_specification_->has_actionable_override()) {
82 CHECK(!toast_specification_->has_close_button() &&
83 !toast_specification_->has_menu())
84 << "Avoid use of SetToastAsActionable() on an already actionable toast";
85 }
stluongb287cbf32024-08-16 20:10:5686}
87
88ToastSpecification::ToastSpecification(
89 base::PassKey<ToastSpecification::Builder>,
90 const gfx::VectorIcon& icon,
91 int string_id)
92 : icon_(icon), body_string_id_(string_id) {}
93
Shakti Sahu226b102b2025-03-13 23:28:5594ToastSpecification::ToastSpecification(
95 base::PassKey<ToastSpecification::Builder>,
96 const gfx::VectorIcon& icon)
97 : icon_(icon) {}
98
stluongb287cbf32024-08-16 20:10:5699ToastSpecification::~ToastSpecification() = default;
100
101void ToastSpecification::AddCloseButton() {
102 has_close_button_ = true;
103}
104
105void ToastSpecification::AddActionButton(int string_id,
106 base::RepeatingClosure closure) {
107 CHECK(!closure.is_null());
108 action_button_string_id_ = string_id;
109 action_button_closure_ = std::move(closure);
110}
111
Jan Keitel29b357c2024-11-07 17:30:55112void ToastSpecification::AddMenu() {
113 has_menu_ = true;
stluongb287cbf32024-08-16 20:10:56114}
115
Steven Luongf444e6d2024-09-16 22:08:13116void ToastSpecification::AddGlobalScope() {
117 is_global_scope_ = true;
118}
dljames402dc5e2025-05-07 23:17:09119
dljames84817292025-05-21 22:46:18120void ToastSpecification::SetToastAsActionable() {
121 actionable_toast_override_ = true;
dljames402dc5e2025-05-07 23:17:09122}