blob: 5f3b660ca493a24eb53daa90d75983e1d933906b [file] [log] [blame]
// 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.
#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 {
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);
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;
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;
// "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 {
~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;
// 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_;
class WifiSectionHeaderView : public NetworkSectionHeaderView {
~WifiSectionHeaderView() override = default;
// NetworkSectionHeaderView:
void SetToggleState(bool toggle_enabled, bool is_on) override;
// views::View:
const char* GetClassName() const override;
// 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;
} // namespace tray
} // namespace ash