1 // Copyright 2016 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.
5 #ifndef COMPONENTS_PERMISSIONS_CHOOSER_CONTROLLER_H_
6 #define COMPONENTS_PERMISSIONS_CHOOSER_CONTROLLER_H_
11 #include "base/memory/raw_ptr.h"
13 namespace permissions {
15 // Subclass ChooserController to implement a chooser, which has some
16 // introductory text and a list of options that users can pick one of.
17 // Your subclass must define the set of options users can pick from;
18 // the actions taken after users select an item or press the 'Cancel'
19 // button or the chooser is closed.
20 // After Select/Cancel/Close is called, this object is destroyed and
21 // calls back into it are not allowed.
22 class ChooserController {
24 explicit ChooserController(std::u16string title);
26 ChooserController(const ChooserController&) = delete;
27 ChooserController& operator=(const ChooserController&) = delete;
29 virtual ~ChooserController();
31 // Since the set of options can change while the UI is visible an
32 // implementation should register a view to observe changes.
35 // Called after the options list is initialized for the first time.
36 // OnOptionsInitialized should only be called once.
37 virtual void OnOptionsInitialized() = 0;
39 // Called after GetOption(index) has been added to the options and the
40 // newly added option is the last element in the options list. Calling
41 // GetOption(index) from inside a call to OnOptionAdded will see the
42 // added string since the options have already been updated.
43 virtual void OnOptionAdded(size_t index) = 0;
45 // Called when GetOption(index) is no longer present, and all later
46 // options have been moved earlier by 1 slot. Calling GetOption(index)
47 // from inside a call to OnOptionRemoved will NOT see the removed string
48 // since the options have already been updated.
49 virtual void OnOptionRemoved(size_t index) = 0;
51 // Called when the option at |index| has been updated.
52 virtual void OnOptionUpdated(size_t index) = 0;
54 // Called when the device adapter is turned on or off.
55 virtual void OnAdapterEnabledChanged(bool enabled) = 0;
57 // Called when the platform level device permission is changed.
58 // Currently only needed on macOS.
59 virtual void OnAdapterAuthorizationChanged(bool authorized);
61 // Called when refreshing options is in progress or complete.
62 virtual void OnRefreshStateChanged(bool refreshing) = 0;
68 // Returns the text to be displayed in the chooser title.
69 // Note that this is only called once, and there is no way to update the title
70 // for a given instance of ChooserController.
71 std::u16string GetTitle() const;
73 // Returns whether the chooser needs to show an icon before the text.
74 // For WebBluetooth, it is a signal strength icon.
75 virtual bool ShouldShowIconBeforeText() const;
77 // Returns whether the chooser needs to show a help button.
78 virtual bool ShouldShowHelpButton() const;
80 // Returns whether the chooser needs to show a button to re-scan for devices.
81 virtual bool ShouldShowReScanButton() const;
83 // Returns whether the chooser allows multiple items to be selected.
84 virtual bool AllowMultipleSelection() const;
86 // Returns whether the chooser needs to show a select-all checkbox.
87 virtual bool ShouldShowSelectAllCheckbox() const;
89 // Returns the text to be displayed in the chooser when there are no options.
90 virtual std::u16string GetNoOptionsText() const = 0;
92 // Returns the label for OK button.
93 virtual std::u16string GetOkButtonLabel() const = 0;
95 // Returns the label for Cancel button.
96 virtual std::u16string GetCancelButtonLabel() const;
98 // Returns the label for SelectAll checkbox.
99 virtual std::u16string GetSelectAllCheckboxLabel() const;
101 // Returns the label for the throbber shown while options are initializing or
102 // a re-scan is in progress.
103 virtual std::pair<std::u16string, std::u16string> GetThrobberLabelAndTooltip()
106 // Returns whether both OK and Cancel buttons are enabled.
108 // For chooser used in Web APIs such as WebBluetooth, WebUSB,
109 // WebSerial, etc., the OK button is only enabled when there is at least
110 // one device listed in the chooser, because user needs to be able to select
111 // a device to grant access permission in these APIs.
113 // For permission prompt used in Bluetooth scanning Web API, the two buttons
114 // represent Allow and Block, and should always be enabled so that user can
115 // make their permission decision.
116 virtual bool BothButtonsAlwaysEnabled() const;
118 // Returns whether table view should always be disabled.
120 // For permission prompt used in Bluetooth scanning Web API, the table is
121 // used for displaying device names, and user doesn't need to select a device
122 // from the table, so it should always be disabled.
123 virtual bool TableViewAlwaysDisabled() const;
125 // The number of options users can pick from. For example, it can be
126 // the number of USB/Bluetooth device names which are listed in the
127 // chooser so that users can grant permission.
128 virtual size_t NumOptions() const = 0;
130 // The signal strength level (0-4 inclusive) of the device at |index|, which
131 // is used to retrieve the corresponding icon to be displayed before the
132 // text. Returns -1 if no icon should be shown.
133 virtual int GetSignalStrengthLevel(size_t index) const;
135 // The |index|th option string which is listed in the chooser.
136 virtual std::u16string GetOption(size_t index) const = 0;
138 // Returns if the |index|th option is connected.
139 // This function returns false by default.
140 virtual bool IsConnected(size_t index) const;
142 // Returns if the |index|th option is paired.
143 // This function returns false by default.
144 virtual bool IsPaired(size_t index) const;
146 // Refresh the list of options.
147 virtual void RefreshOptions();
149 // These three functions are called just before this object is destroyed:
151 // Called when the user selects elements from the dialog. |indices| contains
152 // the indices of the selected elements.
153 virtual void Select(const std::vector<size_t>& indices) = 0;
155 // Called when the user presses the 'Cancel' button in the dialog.
156 virtual void Cancel() = 0;
158 // Called when the user clicks outside the dialog or the dialog otherwise
159 // closes without the user taking an explicit action.
160 virtual void Close() = 0;
162 // Open help center URL.
163 virtual void OpenHelpCenterUrl() const = 0;
165 // Provide help information when the adapter is off.
166 virtual void OpenAdapterOffHelpUrl() const;
168 // Navigate user to preferences in order to acquire Bluetooth permission.
169 virtual void OpenPermissionPreferences() const;
171 // Only one view may be registered at a time.
172 void set_view(View* view) { view_ = view; }
173 View* view() const { return view_; }
176 void set_title_for_testing(const std::u16string& title) { title_ = title; }
179 std::u16string title_;
180 raw_ptr<View, DanglingUntriaged> view_ = nullptr;
183 } // namespace permissions
185 #endif // COMPONENTS_PERMISSIONS_CHOOSER_CONTROLLER_H_