blob: 783b13a555652c57467b1c7d172756be61050add [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#ifndef CHROME_BROWSER_UI_TOASTS_API_TOAST_SPECIFICATION_H_
6#define CHROME_BROWSER_UI_TOASTS_API_TOAST_SPECIFICATION_H_
stluongb287cbf32024-08-16 20:10:567
8#include <memory>
9#include <optional>
10
11#include "base/functional/callback.h"
12#include "base/functional/callback_forward.h"
13#include "base/memory/raw_ref.h"
14#include "base/types/pass_key.h"
15#include "ui/base/models/simple_menu_model.h"
16#include "ui/gfx/vector_icon_types.h"
17
18// ToastSpecification details what the toast should contain when shown.
19class ToastSpecification {
20 public:
21 class Builder final {
22 public:
23 Builder(const gfx::VectorIcon& icon, int body_string_id);
24 Builder(const Builder& other) = delete;
25 Builder& operator=(const Builder&) = delete;
26
27 ~Builder();
28
29 // Adds a "X" close button to the toast. However, if the toast have a menu,
30 // the close button will be a rounded dismiss button instead.
31 Builder& AddCloseButton();
32
33 // Adds a rounded action button toast with the `action_button_string_id`
34 // for the label. All toasts with an action button must also have a close
35 // button.
36 Builder& AddActionButton(int action_button_string_id,
37 base::RepeatingClosure closure);
38
39 // Adds a three dot menu to the toast. Toasts with an action button are not
40 // allowed to have menu because they must have an "X" close button instead.
41 Builder& AddMenu(std::unique_ptr<ui::SimpleMenuModel> menu_model);
42
43 // Toast should only dismiss when explicitly instructed to by feature.
44 // There can only be one persistent toast shown at a time.
45 Builder& AddPersistance();
46
47 std::unique_ptr<ToastSpecification> Build();
48
49 private:
50 void ValidateSpecification();
51
52 std::unique_ptr<ToastSpecification> toast_specification_;
53 };
54
55 ToastSpecification(base::PassKey<ToastSpecification::Builder>,
56 const gfx::VectorIcon& icon,
57 int string_id);
58 ~ToastSpecification();
59
60 int body_string_id() const { return body_string_id_; }
61 const gfx::VectorIcon& icon() const { return *icon_; }
62 bool has_close_button() const { return has_close_button_; }
63 std::optional<int> action_button_string_id() const {
64 return action_button_string_id_;
65 }
Charles Mengab13b8f62024-09-04 20:11:1866 base::RepeatingClosure action_button_callback() const {
stluongb287cbf32024-08-16 20:10:5667 return action_button_closure_;
68 }
69 ui::SimpleMenuModel* menu_model() const { return menu_model_.get(); }
70 bool is_persistent_toast() const { return is_persistent_toast_; }
71
72 void AddCloseButton();
73 void AddActionButton(int string_id, base::RepeatingClosure closure);
74 void AddMenu(std::unique_ptr<ui::SimpleMenuModel> menu_model);
75 void AddPersistance();
76
77 private:
78 const base::raw_ref<const gfx::VectorIcon> icon_;
79 int body_string_id_;
80 bool has_close_button_ = false;
81 std::optional<int> action_button_string_id_;
82 base::RepeatingClosure action_button_closure_;
83 std::unique_ptr<ui::SimpleMenuModel> menu_model_;
84 bool is_persistent_toast_ = false;
85};
86
stluong8fc2b9f2024-08-23 23:01:1387#endif // CHROME_BROWSER_UI_TOASTS_API_TOAST_SPECIFICATION_H_