| // Copyright 2018 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef ASH_SYSTEM_NETWORK_NETWORK_SECTION_HEADER_VIEW_H_ |
| #define ASH_SYSTEM_NETWORK_NETWORK_SECTION_HEADER_VIEW_H_ |
| |
| #include "ash/system/network/network_row_title_view.h" |
| #include "ash/system/tray/tray_popup_utils.h" |
| #include "ash/system/tray/tri_view.h" |
| #include "base/timer/timer.h" |
| #include "chromeos/network/network_state_handler.h" |
| #include "ui/views/controls/button/toggle_button.h" |
| #include "ui/views/layout/fill_layout.h" |
| #include "ui/views/view.h" |
| |
| namespace ash { |
| namespace tray { |
| |
| // A header row for sections in network detailed view which contains a title and |
| // a toggle button to turn on/off the section. Subclasses are given the |
| // opportunity to add extra buttons before the toggle button is added. |
| class NetworkSectionHeaderView : public views::View, |
| public views::ButtonListener { |
| public: |
| explicit NetworkSectionHeaderView(int title_id); |
| ~NetworkSectionHeaderView() override = default; |
| |
| // Modify visibility of section toggle |
| void SetToggleVisibility(bool visible); |
| |
| // Modify enabled/disabled and on/off state of toggle. |
| virtual void SetToggleState(bool toggle_enabled, bool is_on); |
| |
| protected: |
| void Init(bool enabled); |
| |
| // This is called before the toggle button is added to give subclasses an |
| // opportunity to add more buttons before the toggle button. Subclasses can |
| // add buttons to container() using AddChildView(). |
| virtual void AddExtraButtons(bool enabled); |
| |
| // Called when |toggle_| is clicked and toggled. Subclasses can override to |
| // enabled/disable their respective technology, for example. |
| virtual void OnToggleToggled(bool is_on) = 0; |
| |
| TriView* container() const { return container_; } |
| |
| // views::View: |
| int GetHeightForWidth(int width) const override; |
| |
| // views::ButtonListener: |
| void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
| |
| private: |
| void InitializeLayout(); |
| void AddToggleButton(bool enabled); |
| |
| // Resource ID for the string to use as the title of the section and for the |
| // accessible text on the section header toggle button. |
| const int title_id_; |
| |
| // View containing header row views, including title, toggle, and extra |
| // buttons. |
| TriView* container_ = nullptr; |
| |
| // View containing the header row view. Is a child of the CENTER of |
| // |container_|. |
| NetworkRowTitleView* network_row_title_view_ = nullptr; |
| |
| // ToggleButton to toggle section on or off. |
| views::ToggleButton* toggle_ = nullptr; |
| |
| DISALLOW_COPY_AND_ASSIGN(NetworkSectionHeaderView); |
| }; |
| |
| // "Mobile Data" header row. Mobile Data reflects both Cellular state and |
| // Tether state. When both technologies are available, Cellular state takes |
| // precedence over Tether (but in some cases Tether state may be shown). |
| class MobileSectionHeaderView : public NetworkSectionHeaderView { |
| public: |
| MobileSectionHeaderView(); |
| ~MobileSectionHeaderView() override; |
| |
| // Updates mobile toggle state and returns the id of the status message |
| // that should be shown while connecting to a network. Returns zero when no |
| // message should be shown. |
| int UpdateToggleAndGetStatusMessage(); |
| |
| // views::View: |
| const char* GetClassName() const override; |
| |
| private: |
| // NetworkListView::NetworkSectionHeaderView: |
| void OnToggleToggled(bool is_on) override; |
| |
| // When Tether is disabled because Bluetooth is off, then enabling Bluetooth |
| // will enable Tether. If enabling Bluetooth takes longer than some timeout |
| // period, it is assumed that there was an error. In that case, Tether will |
| // remain uninitialized and Mobile Data will remain toggled off. |
| void EnableBluetooth(); |
| void OnEnableBluetoothTimeout(); |
| |
| bool waiting_for_tether_initialize_ = false; |
| base::OneShotTimer enable_bluetooth_timer_; |
| |
| base::WeakPtrFactory<MobileSectionHeaderView> weak_ptr_factory_; |
| |
| DISALLOW_COPY_AND_ASSIGN(MobileSectionHeaderView); |
| }; |
| |
| class WifiSectionHeaderView : public NetworkSectionHeaderView { |
| public: |
| WifiSectionHeaderView(); |
| ~WifiSectionHeaderView() override = default; |
| |
| // NetworkSectionHeaderView: |
| void SetToggleState(bool toggle_enabled, bool is_on) override; |
| |
| // views::View: |
| const char* GetClassName() const override; |
| |
| private: |
| // NetworkSectionHeaderView: |
| void OnToggleToggled(bool is_on) override; |
| void AddExtraButtons(bool enabled) override; |
| void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
| |
| // A button to invoke "Join Wi-Fi network" dialog. |
| views::Button* join_button_ = nullptr; |
| |
| DISALLOW_COPY_AND_ASSIGN(WifiSectionHeaderView); |
| }; |
| |
| } // namespace tray |
| } // namespace ash |
| |
| #endif // ASH_SYSTEM_NETWORK_NETWORK_SECTION_HEADER__VIEW_H_ |