|
8 | 8 | #include <memory>
|
9 | 9 | #include <utility>
|
10 | 10 |
|
| 11 | +#include "base/memory/raw_ptr.h" |
11 | 12 | #include "base/notreached.h"
|
12 | 13 | #include "brave/app/brave_command_ids.h"
|
13 | 14 | #include "brave/app/vector_icons/vector_icons.h"
|
|
22 | 23 | #include "chrome/browser/ui/views/toolbar/toolbar_ink_drop_util.h"
|
23 | 24 | #include "ui/base/l10n/l10n_util.h"
|
24 | 25 | #include "ui/base/metadata/metadata_impl_macros.h"
|
| 26 | +#include "ui/base/models/simple_menu_model.h" |
25 | 27 | #include "ui/gfx/geometry/rrect_f.h"
|
26 | 28 | #include "ui/gfx/paint_vector_icon.h"
|
27 | 29 | #include "ui/gfx/skia_util.h"
|
@@ -50,11 +52,63 @@ class BraveVPNButtonHighlightPathGenerator
|
50 | 52 | }
|
51 | 53 | };
|
52 | 54 |
|
| 55 | +class VPNButtonMenuModel : public ui::SimpleMenuModel, |
| 56 | + public ui::SimpleMenuModel::Delegate, |
| 57 | + public BraveVPNServiceObserver { |
| 58 | + public: |
| 59 | + explicit VPNButtonMenuModel(Browser* browser) |
| 60 | + : SimpleMenuModel(this), |
| 61 | + browser_(browser), |
| 62 | + service_(BraveVpnServiceFactory::GetForProfile(browser_->profile())) { |
| 63 | + DCHECK(service_); |
| 64 | + Observe(service_); |
| 65 | + Build(service_->is_purchased_user()); |
| 66 | + } |
| 67 | + |
| 68 | + ~VPNButtonMenuModel() override = default; |
| 69 | + VPNButtonMenuModel(const VPNButtonMenuModel&) = delete; |
| 70 | + VPNButtonMenuModel& operator=(const VPNButtonMenuModel&) = delete; |
| 71 | + |
| 72 | + private: |
| 73 | + // ui::SimpleMenuModel::Delegate override: |
| 74 | + void ExecuteCommand(int command_id, int event_flags) override { |
| 75 | + chrome::ExecuteCommand(browser_, command_id); |
| 76 | + } |
| 77 | + |
| 78 | + // BraveVPNServiceObserver overrides: |
| 79 | + void OnPurchasedStateChanged( |
| 80 | + brave_vpn::mojom::PurchasedState state) override { |
| 81 | + // Rebuild menu items based on purchased state change. |
| 82 | + Build(service_->is_purchased_user()); |
| 83 | + } |
| 84 | + |
| 85 | + void Build(bool purchased) { |
| 86 | + // Clear all menu items and re-build as purchased state can be updated |
| 87 | + // during the runtime. |
| 88 | + Clear(); |
| 89 | + AddItemWithStringId(IDC_TOGGLE_BRAVE_VPN_TOOLBAR_BUTTON, |
| 90 | + IDS_BRAVE_VPN_HIDE_VPN_BUTTON_MENU_ITEM); |
| 91 | + if (purchased) { |
| 92 | + AddItemWithStringId(IDC_SEND_BRAVE_VPN_FEEDBACK, |
| 93 | + IDS_BRAVE_VPN_SHOW_FEEDBACK_MENU_ITEM); |
| 94 | + AddItemWithStringId(IDC_ABOUT_BRAVE_VPN, |
| 95 | + IDS_BRAVE_VPN_ABOUT_VPN_MENU_ITEM); |
| 96 | + AddItemWithStringId(IDC_MANAGE_BRAVE_VPN_PLAN, |
| 97 | + IDS_BRAVE_VPN_MANAGE_MY_PLAN_MENU_ITEM); |
| 98 | + } |
| 99 | + } |
| 100 | + |
| 101 | + raw_ptr<Browser> browser_ = nullptr; |
| 102 | + raw_ptr<BraveVpnServiceDesktop> service_ = nullptr; |
| 103 | +}; |
| 104 | + |
53 | 105 | } // namespace
|
54 | 106 |
|
55 | 107 | BraveVPNButton::BraveVPNButton(Browser* browser)
|
56 | 108 | : ToolbarButton(base::BindRepeating(&BraveVPNButton::OnButtonPressed,
|
57 |
| - base::Unretained(this))), |
| 109 | + base::Unretained(this)), |
| 110 | + std::make_unique<VPNButtonMenuModel>(browser), |
| 111 | + nullptr), |
58 | 112 | browser_(browser),
|
59 | 113 | service_(BraveVpnServiceFactory::GetForProfile(browser_->profile())) {
|
60 | 114 | DCHECK(service_);
|
|
0 commit comments