network_detailed_view.cc 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // Copyright 2022 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "ash/system/network/network_detailed_view.h"
  5. #include "ash/public/cpp/system_tray_client.h"
  6. #include "ash/session/session_controller_impl.h"
  7. #include "ash/shell.h"
  8. #include "ash/strings/grit/ash_strings.h"
  9. #include "ash/system/machine_learning/user_settings_event_logger.h"
  10. #include "ash/system/model/system_tray_model.h"
  11. #include "ash/system/network/network_list_item_view.h"
  12. #include "ash/system/network/tray_network_state_model.h"
  13. #include "ash/system/tray/detailed_view_delegate.h"
  14. #include "ash/system/tray/tri_view.h"
  15. #include "base/check.h"
  16. #include "base/memory/weak_ptr.h"
  17. #include "base/metrics/user_metrics.h"
  18. #include "chromeos/services/network_config/public/mojom/cros_network_config.mojom.h"
  19. #include "ui/views/bubble/bubble_dialog_delegate_view.h"
  20. #include "ui/views/controls/button/button.h"
  21. namespace ash {
  22. NetworkDetailedView::NetworkDetailedView(
  23. DetailedViewDelegate* detailed_view_delegate,
  24. Delegate* delegate,
  25. ListType list_type)
  26. : TrayDetailedView(detailed_view_delegate),
  27. list_type_(list_type),
  28. login_(Shell::Get()->session_controller()->login_status()),
  29. model_(Shell::Get()->system_tray_model()->network_state_model()),
  30. delegate_(delegate) {
  31. DCHECK(ash::features::IsQuickSettingsNetworkRevampEnabled());
  32. CreateTitleRow(list_type_ == ListType::LIST_TYPE_NETWORK
  33. ? IDS_ASH_STATUS_TRAY_NETWORK
  34. : IDS_ASH_STATUS_TRAY_VPN);
  35. CreateTitleRowButtons();
  36. CreateScrollableList();
  37. // TODO(b/207089013): add metrics for UI surface displayed.
  38. }
  39. NetworkDetailedView::~NetworkDetailedView() = default;
  40. void NetworkDetailedView::HandleViewClicked(views::View* view) {
  41. if (login_ == LoginStatus::LOCKED)
  42. return;
  43. delegate()->OnNetworkListItemSelected(
  44. static_cast<NetworkListItemView*>(view)->network_properties());
  45. }
  46. void NetworkDetailedView::CreateTitleRowButtons() {
  47. DCHECK(!info_button_);
  48. tri_view()->SetContainerVisible(TriView::Container::END, true);
  49. std::unique_ptr<views::Button> info = base::WrapUnique(
  50. CreateInfoButton(base::BindRepeating(&NetworkDetailedView::OnInfoClicked,
  51. weak_ptr_factory_.GetWeakPtr()),
  52. IDS_ASH_STATUS_TRAY_NETWORK_INFO));
  53. info->SetID(static_cast<int>(NetworkDetailedViewChildId::kInfoButton));
  54. info_button_ = info.get();
  55. tri_view()->AddView(TriView::Container::END, info.release());
  56. DCHECK(!settings_button_);
  57. std::unique_ptr<views::Button> settings =
  58. base::WrapUnique(CreateSettingsButton(
  59. base::BindRepeating(&NetworkDetailedView::OnSettingsClicked,
  60. weak_ptr_factory_.GetWeakPtr()),
  61. IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
  62. settings->SetID(
  63. static_cast<int>(NetworkDetailedViewChildId::kSettingsButton));
  64. settings_button_ = settings.get();
  65. tri_view()->AddView(TriView::Container::END, settings.release());
  66. }
  67. bool NetworkDetailedView::ShouldIncludeDeviceAddresses() {
  68. return list_type_ == LIST_TYPE_NETWORK;
  69. }
  70. void NetworkDetailedView::OnInfoBubbleDestroyed() {
  71. info_bubble_ = nullptr;
  72. // Widget of info bubble is activated while info bubble is shown. To move
  73. // focus back to the widget of this view, activate it again here.
  74. GetWidget()->Activate();
  75. }
  76. void NetworkDetailedView::OnInfoClicked() {
  77. if (CloseInfoBubble())
  78. return;
  79. info_bubble_ =
  80. new NetworkInfoBubble(weak_ptr_factory_.GetWeakPtr(), tri_view());
  81. views::BubbleDialogDelegateView::CreateBubble(info_bubble_)->Show();
  82. info_bubble_->NotifyAccessibilityEvent(ax::mojom::Event::kAlert, false);
  83. }
  84. bool NetworkDetailedView::CloseInfoBubble() {
  85. if (!info_bubble_)
  86. return false;
  87. info_bubble_->GetWidget()->Close();
  88. return true;
  89. }
  90. void NetworkDetailedView::OnSettingsClicked() {
  91. base::RecordAction(
  92. list_type_ == LIST_TYPE_VPN
  93. ? base::UserMetricsAction("StatusArea_VPN_Settings")
  94. : base::UserMetricsAction("StatusArea_Network_Settings"));
  95. base::RecordAction(base::UserMetricsAction(
  96. "ChromeOS.SystemTray.Network.SettingsButtonPressed"));
  97. const std::string guid = model_->default_network()
  98. ? model_->default_network()->guid
  99. : std::string();
  100. CloseBubble(); // Deletes |this|.
  101. SystemTrayClient* system_tray_client =
  102. Shell::Get()->system_tray_model()->client();
  103. if (system_tray_client)
  104. system_tray_client->ShowNetworkSettings(guid);
  105. }
  106. } // namespace ash