Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/chromeos/network/network_list.h" | 5 #include "ui/chromeos/network/network_list_md.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "chromeos/dbus/dbus_thread_manager.h" | 10 #include "chromeos/dbus/dbus_thread_manager.h" |
| 11 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h" | 11 #include "chromeos/dbus/power_manager/power_supply_properties.pb.h" |
| 12 #include "chromeos/dbus/power_manager_client.h" | 12 #include "chromeos/dbus/power_manager_client.h" |
| 13 #include "chromeos/login/login_state.h" | 13 #include "chromeos/login/login_state.h" |
| 14 #include "chromeos/network/managed_network_configuration_handler.h" | 14 #include "chromeos/network/managed_network_configuration_handler.h" |
| 15 #include "chromeos/network/network_state.h" | 15 #include "chromeos/network/network_state.h" |
| 16 #include "chromeos/network/network_state_handler.h" | 16 #include "chromeos/network/network_state_handler.h" |
| 17 #include "chromeos/network/network_state_handler_observer.h" | 17 #include "chromeos/network/network_state_handler_observer.h" |
| 18 #include "components/device_event_log/device_event_log.h" | 18 #include "components/device_event_log/device_event_log.h" |
| 19 #include "grit/ui_chromeos_strings.h" | 19 #include "grit/ui_chromeos_strings.h" |
| 20 #include "ui/base/l10n/l10n_util.h" | 20 #include "ui/base/l10n/l10n_util.h" |
| 21 #include "ui/base/resource/resource_bundle.h" | 21 #include "ui/base/resource/resource_bundle.h" |
| 22 #include "ui/chromeos/network/network_icon.h" | 22 #include "ui/chromeos/network/network_icon.h" |
| 23 #include "ui/chromeos/network/network_icon_animation.h" | 23 #include "ui/chromeos/network/network_icon_animation.h" |
| 24 #include "ui/chromeos/network/network_info.h" | 24 #include "ui/chromeos/network/network_info.h" |
| 25 #include "ui/chromeos/network/network_list_delegate.h" | 25 #include "ui/chromeos/network/network_list_delegate.h" |
| 26 #include "ui/gfx/font.h" | 26 #include "ui/gfx/font.h" |
| 27 #include "ui/gfx/paint_vector_icon.h" | |
| 28 #include "ui/gfx/vector_icons_public.h" | |
| 29 #include "ui/views/border.h" | |
| 30 #include "ui/views/controls/button/image_button.h" | |
| 31 #include "ui/views/controls/button/toggle_button.h" | |
| 27 #include "ui/views/controls/label.h" | 32 #include "ui/views/controls/label.h" |
| 33 #include "ui/views/layout/box_layout.h" | |
| 28 #include "ui/views/view.h" | 34 #include "ui/views/view.h" |
| 29 | 35 |
| 30 using chromeos::LoginState; | 36 using chromeos::LoginState; |
| 31 using chromeos::NetworkHandler; | 37 using chromeos::NetworkHandler; |
| 32 using chromeos::NetworkStateHandler; | 38 using chromeos::NetworkStateHandler; |
| 33 using chromeos::ManagedNetworkConfigurationHandler; | 39 using chromeos::ManagedNetworkConfigurationHandler; |
| 34 using chromeos::NetworkTypePattern; | 40 using chromeos::NetworkTypePattern; |
| 35 | 41 |
| 36 namespace ui { | 42 namespace ui { |
| 37 | 43 |
| 38 namespace { | 44 namespace { |
| 39 | 45 |
| 46 const int kWiFiRowHeight = 48; | |
| 47 const int kWiFiIconSize = 10; | |
| 48 const SkColor kWifiRowSeparatorColor = SkColorSetA(SK_ColorBLACK, .12f * 0xFF); | |
| 49 | |
| 40 bool IsProhibitedByPolicy(const chromeos::NetworkState* network) { | 50 bool IsProhibitedByPolicy(const chromeos::NetworkState* network) { |
| 41 if (!NetworkTypePattern::WiFi().MatchesType(network->type())) | 51 if (!NetworkTypePattern::WiFi().MatchesType(network->type())) |
| 42 return false; | 52 return false; |
| 43 if (!LoginState::IsInitialized() || !LoginState::Get()->IsUserLoggedIn()) | 53 if (!LoginState::IsInitialized() || !LoginState::Get()->IsUserLoggedIn()) |
| 44 return false; | 54 return false; |
| 45 ManagedNetworkConfigurationHandler* managed_configuration_handler = | 55 ManagedNetworkConfigurationHandler* managed_configuration_handler = |
| 46 NetworkHandler::Get()->managed_network_configuration_handler(); | 56 NetworkHandler::Get()->managed_network_configuration_handler(); |
| 47 const base::DictionaryValue* global_network_config = | 57 const base::DictionaryValue* global_network_config = |
| 48 managed_configuration_handler->GetGlobalConfigFromPolicy( | 58 managed_configuration_handler->GetGlobalConfigFromPolicy( |
| 49 std::string() /* no username hash, device policy */); | 59 std::string() /* no username hash, device policy */); |
| 50 bool policy_prohibites_unmanaged = false; | 60 bool policy_prohibites_unmanaged = false; |
| 51 if (global_network_config) { | 61 if (global_network_config) { |
| 52 global_network_config->GetBooleanWithoutPathExpansion( | 62 global_network_config->GetBooleanWithoutPathExpansion( |
| 53 ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, | 63 ::onc::global_network_config::kAllowOnlyPolicyNetworksToConnect, |
| 54 &policy_prohibites_unmanaged); | 64 &policy_prohibites_unmanaged); |
| 55 } | 65 } |
| 56 if (!policy_prohibites_unmanaged) | 66 if (!policy_prohibites_unmanaged) |
| 57 return false; | 67 return false; |
| 58 return !managed_configuration_handler->FindPolicyByGuidAndProfile( | 68 return !managed_configuration_handler->FindPolicyByGuidAndProfile( |
| 59 network->guid(), network->profile_path()); | 69 network->guid(), network->profile_path()); |
| 60 } | 70 } |
| 61 | 71 |
| 62 } // namespace | 72 } // namespace |
| 63 | 73 |
| 64 // NetworkListView: | 74 class NetworkListViewMd::WiFiHeaderRowView : public views::View { |
| 75 public: | |
| 76 WiFiHeaderRowView(views::ButtonListener* listener, bool enabled) | |
| 77 : views::View(), | |
| 78 listener_(listener), | |
| 79 enabled_(enabled), | |
| 80 label_(nullptr), | |
| 81 toggle_(nullptr), | |
| 82 join_(nullptr) { | |
| 83 Init(); | |
| 84 } | |
| 65 | 85 |
| 66 NetworkListView::NetworkListView(NetworkListDelegate* delegate) | 86 ~WiFiHeaderRowView() override {} |
| 87 | |
| 88 void Init() { | |
| 89 SetBorder(views::Border::CreateSolidSidedBorder(1, 0, 0, 0, | |
|
tdanderson
2016/09/20 14:44:33
Can you add a TODO(tdanderson) to eventually unify
varkha
2016/09/23 00:35:53
Done.
| |
| 90 kWifiRowSeparatorColor)); | |
| 91 views::View* container = new views::View; | |
| 92 container->SetBorder(views::Border::CreateEmptyBorder(4, 18, 4, 10)); | |
|
varkha
2016/09/19 20:19:23
[self review] Need to move those constants above o
varkha
2016/09/23 00:35:53
Done.
| |
| 93 views::BoxLayout* layout1 = | |
| 94 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 0, 0); | |
| 95 SetLayoutManager(layout1); | |
| 96 AddChildView(container); | |
| 97 layout1->SetFlexForView(container, 1); | |
| 98 | |
| 99 views::BoxLayout* layout = | |
| 100 new views::BoxLayout(views::BoxLayout::kHorizontal, 0, 8, 28); | |
| 101 container->SetLayoutManager(layout); | |
| 102 SkColor color = GetNativeTheme()->GetSystemColor( | |
| 103 ui::NativeTheme::kColorId_CallToActionColor); | |
| 104 label_ = new views::Label; | |
| 105 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 106 base::string16 text = | |
| 107 rb.GetLocalizedString(IDS_ASH_STATUS_TRAY_NETWORK_WIFI); | |
| 108 label_->SetText(text); | |
| 109 label_->SetHorizontalAlignment(gfx::ALIGN_LEFT); | |
| 110 label_->SetEnabledColor(color); | |
| 111 label_->SetFontList(rb.GetFontList(ui::ResourceBundle::BoldFont)); | |
|
tdanderson
2016/09/20 14:44:33
Try using TrayPopupItemStyle to set the font style
varkha
2016/09/23 00:35:53
I can't - it is in ash and I cannot use ash here.
| |
| 112 container->AddChildView(label_); | |
| 113 layout->SetFlexForView(label_, 1); | |
| 114 | |
| 115 join_ = new views::ImageButton(listener_); | |
| 116 join_image_ = network_icon::GetImageForHeaderWifiNetwork( | |
| 117 SkColorSetA(color, 0xFF / 2)); | |
| 118 join_image_pressed_ = network_icon::GetImageForHeaderWifiNetwork(color); | |
| 119 join_->SetImage(views::CustomButton::STATE_NORMAL, &join_image_); | |
| 120 join_->SetImage(views::CustomButton::STATE_HOVERED, &join_image_pressed_); | |
| 121 join_->SetImage(views::CustomButton::STATE_PRESSED, &join_image_pressed_); | |
| 122 join_->SetImageAlignment(views::ImageButton::ALIGN_CENTER, | |
| 123 views::ImageButton::ALIGN_MIDDLE); | |
| 124 join_->SetMinimumImageSize(gfx::Size(kWiFiIconSize, kWiFiIconSize)); | |
| 125 container->AddChildView(join_); | |
| 126 | |
| 127 toggle_ = new views::ToggleButton(listener_); | |
| 128 container->AddChildView(toggle_); | |
| 129 SetEnabled(enabled_); | |
| 130 } | |
| 131 | |
| 132 void SetEnabled(bool enabled) { | |
| 133 enabled_ = enabled; | |
| 134 join_->SetVisible(enabled_); | |
| 135 toggle_->SetIsOn(enabled_, true); | |
| 136 } | |
| 137 | |
| 138 const views::Button* toggle() const { return toggle_; } | |
| 139 const views::Button* join() const { return join_; } | |
| 140 bool is_toggled() const { return toggle_->is_on(); } | |
| 141 | |
| 142 // views::View: | |
| 143 gfx::Size GetPreferredSize() const override { | |
| 144 gfx::Size size = views::View::GetPreferredSize(); | |
| 145 size.set_height(kWiFiRowHeight); | |
| 146 return size; | |
| 147 } | |
| 148 | |
| 149 int GetHeightForWidth(int width) const override { return kWiFiRowHeight; } | |
| 150 | |
| 151 void Layout() override { | |
| 152 views::View::Layout(); | |
| 153 toggle_->SizeToPreferredSize(); | |
| 154 } | |
| 155 | |
| 156 private: | |
| 157 views::ButtonListener* listener_; | |
| 158 bool enabled_; | |
| 159 views::Label* label_; | |
| 160 views::ToggleButton* toggle_; | |
| 161 views::ImageButton* join_; | |
| 162 gfx::ImageSkia join_image_; | |
| 163 gfx::ImageSkia join_image_pressed_; | |
| 164 | |
| 165 DISALLOW_COPY_AND_ASSIGN(WiFiHeaderRowView); | |
| 166 }; | |
| 167 | |
| 168 // NetworkListViewMd: | |
| 169 | |
| 170 NetworkListViewMd::NetworkListViewMd(NetworkListDelegate* delegate) | |
| 67 : delegate_(delegate), | 171 : delegate_(delegate), |
| 68 no_wifi_networks_view_(NULL), | 172 no_wifi_networks_view_(nullptr), |
| 69 no_cellular_networks_view_(NULL) { | 173 no_cellular_networks_view_(nullptr), |
| 174 wifi_header_view_(nullptr) { | |
| 70 CHECK(delegate_); | 175 CHECK(delegate_); |
| 71 } | 176 } |
| 72 | 177 |
| 73 NetworkListView::~NetworkListView() { | 178 NetworkListViewMd::~NetworkListViewMd() { |
| 74 network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); | 179 network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); |
| 75 } | 180 } |
| 76 | 181 |
| 77 void NetworkListView::Update() { | 182 void NetworkListViewMd::Update() { |
| 78 CHECK(container_); | 183 CHECK(container_); |
| 79 NetworkStateHandler::NetworkStateList network_list; | 184 NetworkStateHandler::NetworkStateList network_list; |
| 80 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); | 185 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
| 81 handler->GetVisibleNetworkList(&network_list); | 186 handler->GetVisibleNetworkList(&network_list); |
| 82 UpdateNetworks(network_list); | 187 UpdateNetworks(network_list); |
| 188 OrderNetworks(); | |
| 83 UpdateNetworkIcons(); | 189 UpdateNetworkIcons(); |
| 84 UpdateNetworkListInternal(); | 190 UpdateNetworkListInternal(); |
| 85 } | 191 } |
| 86 | 192 |
| 87 bool NetworkListView::IsNetworkEntry(views::View* view, | 193 bool NetworkListViewMd::IsNetworkEntry(views::View* view, |
| 88 std::string* service_path) const { | 194 std::string* service_path) const { |
| 89 std::map<views::View*, std::string>::const_iterator found = | 195 std::map<views::View*, std::string>::const_iterator found = |
| 90 network_map_.find(view); | 196 network_map_.find(view); |
| 91 if (found == network_map_.end()) | 197 if (found == network_map_.end()) |
| 92 return false; | 198 return false; |
| 93 *service_path = found->second; | 199 *service_path = found->second; |
| 94 return true; | 200 return true; |
| 95 } | 201 } |
| 96 | 202 |
| 97 void NetworkListView::UpdateNetworks( | 203 void NetworkListViewMd::UpdateNetworks( |
| 98 const NetworkStateHandler::NetworkStateList& networks) { | 204 const NetworkStateHandler::NetworkStateList& networks) { |
| 99 SCOPED_NET_LOG_IF_SLOW(); | 205 SCOPED_NET_LOG_IF_SLOW(); |
| 100 network_list_.clear(); | 206 network_list_.clear(); |
| 101 const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern(); | 207 const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern(); |
| 102 for (NetworkStateHandler::NetworkStateList::const_iterator iter = | 208 for (NetworkStateHandler::NetworkStateList::const_iterator iter = |
| 103 networks.begin(); | 209 networks.begin(); |
| 104 iter != networks.end(); | 210 iter != networks.end(); ++iter) { |
| 105 ++iter) { | |
| 106 const chromeos::NetworkState* network = *iter; | 211 const chromeos::NetworkState* network = *iter; |
| 107 if (!pattern.MatchesType(network->type())) | 212 if (!pattern.MatchesType(network->type())) |
| 108 continue; | 213 continue; |
| 109 network_list_.push_back(base::MakeUnique<NetworkInfo>(network->path())); | 214 network_list_.push_back(base::MakeUnique<NetworkInfo>(network->path())); |
| 110 } | 215 } |
| 111 } | 216 } |
| 112 | 217 |
| 113 void NetworkListView::UpdateNetworkIcons() { | 218 void NetworkListViewMd::OrderNetworks() { |
| 219 struct CompareNetwork { | |
| 220 explicit CompareNetwork(NetworkStateHandler* handler) : handler_(handler) {} | |
| 221 | |
| 222 // Returns true if |network1| is less than (i.e. is ordered before) | |
| 223 // |network2|. | |
| 224 bool operator()(const std::unique_ptr<NetworkInfo>& network1, | |
| 225 const std::unique_ptr<NetworkInfo>& network2) { | |
| 226 int order1 = GetOrder(handler_->GetNetworkState(network1->service_path)); | |
| 227 int order2 = GetOrder(handler_->GetNetworkState(network2->service_path)); | |
| 228 const bool above = | |
| 229 (order1 < order2) || | |
| 230 (order1 == order2 && network1->highlight && !network2->highlight) || | |
| 231 (order1 == order2 && | |
| 232 network1->service_path.compare(network2->service_path) < 0); | |
| 233 return above; | |
| 234 } | |
| 235 | |
| 236 private: | |
| 237 static int GetOrder(const chromeos::NetworkState* network) { | |
| 238 if (!network) | |
| 239 return 999; | |
| 240 if (network->Matches(NetworkTypePattern::Ethernet())) | |
| 241 return 0; | |
| 242 if (network->Matches(NetworkTypePattern::Cellular())) | |
| 243 return 1; | |
| 244 if (network->Matches(NetworkTypePattern::Mobile())) | |
| 245 return 2; | |
| 246 if (network->Matches(NetworkTypePattern::WiFi())) | |
| 247 return 3; | |
| 248 return 4; | |
| 249 } | |
| 250 | |
| 251 NetworkStateHandler* handler_; | |
| 252 }; | |
| 253 std::sort(network_list_.begin(), network_list_.end(), | |
| 254 CompareNetwork(NetworkHandler::Get()->network_state_handler())); | |
| 255 } | |
| 256 | |
| 257 void NetworkListViewMd::UpdateNetworkIcons() { | |
| 114 SCOPED_NET_LOG_IF_SLOW(); | 258 SCOPED_NET_LOG_IF_SLOW(); |
| 115 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); | 259 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
| 116 | 260 |
| 117 // First, update state for all networks | 261 // First, update state for all networks |
| 118 bool animating = false; | 262 bool animating = false; |
| 119 | 263 |
| 120 for (auto& info : network_list_) { | 264 for (auto& info : network_list_) { |
| 121 const chromeos::NetworkState* network = | 265 const chromeos::NetworkState* network = |
| 122 handler->GetNetworkState(info->service_path); | 266 handler->GetNetworkState(info->service_path); |
| 123 if (!network) | 267 if (!network) |
| 124 continue; | 268 continue; |
| 125 bool prohibited_by_policy = IsProhibitedByPolicy(network); | 269 bool prohibited_by_policy = IsProhibitedByPolicy(network); |
| 270 info->label = | |
| 271 network_icon::GetLabelForNetwork(network, network_icon::ICON_TYPE_LIST); | |
| 126 info->image = | 272 info->image = |
| 127 network_icon::GetImageForNetwork(network, network_icon::ICON_TYPE_LIST); | 273 network_icon::GetImageForNetwork(network, network_icon::ICON_TYPE_LIST); |
| 128 info->label = | |
| 129 network_icon::GetLabelForNetwork(network, network_icon::ICON_TYPE_LIST); | |
| 130 info->highlight = | |
| 131 network->IsConnectedState() || network->IsConnectingState(); | |
| 132 info->disable = | 274 info->disable = |
| 133 (network->activation_state() == shill::kActivationStateActivating) || | 275 (network->activation_state() == shill::kActivationStateActivating) || |
| 134 prohibited_by_policy; | 276 prohibited_by_policy; |
| 277 info->highlight = | |
| 278 network->IsConnectedState() || network->IsConnectingState(); | |
| 279 info->wifi = network->Matches(NetworkTypePattern::WiFi()); | |
| 135 if (prohibited_by_policy) { | 280 if (prohibited_by_policy) { |
| 136 info->tooltip = | 281 info->tooltip = |
| 137 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_PROHIBITED); | 282 l10n_util::GetStringUTF16(IDS_ASH_STATUS_TRAY_NETWORK_PROHIBITED); |
| 138 } | 283 } |
| 139 if (!animating && network->IsConnectingState()) | 284 if (!animating && network->IsConnectingState()) |
| 140 animating = true; | 285 animating = true; |
| 141 } | 286 } |
| 142 if (animating) | 287 if (animating) |
| 143 network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); | 288 network_icon::NetworkIconAnimation::GetInstance()->AddObserver(this); |
| 144 else | 289 else |
| 145 network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); | 290 network_icon::NetworkIconAnimation::GetInstance()->RemoveObserver(this); |
| 146 } | 291 } |
| 147 | 292 |
| 148 void NetworkListView::UpdateNetworkListInternal() { | 293 void NetworkListViewMd::UpdateNetworkListInternal() { |
| 149 SCOPED_NET_LOG_IF_SLOW(); | 294 SCOPED_NET_LOG_IF_SLOW(); |
| 150 // Get the updated list entries | 295 // Get the updated list entries |
| 151 network_map_.clear(); | 296 network_map_.clear(); |
| 152 std::set<std::string> new_service_paths; | 297 std::set<std::string> new_service_paths; |
| 153 bool needs_relayout = UpdateNetworkListEntries(&new_service_paths); | 298 bool needs_relayout = UpdateNetworkListEntries(&new_service_paths); |
| 154 | 299 |
| 155 // Remove old children | 300 // Remove old children |
| 156 std::set<std::string> remove_service_paths; | 301 std::set<std::string> remove_service_paths; |
| 157 for (ServicePathMap::const_iterator it = service_path_map_.begin(); | 302 for (ServicePathMap::const_iterator it = service_path_map_.begin(); |
| 158 it != service_path_map_.end(); | 303 it != service_path_map_.end(); ++it) { |
| 159 ++it) { | |
| 160 if (new_service_paths.find(it->first) == new_service_paths.end()) { | 304 if (new_service_paths.find(it->first) == new_service_paths.end()) { |
| 161 remove_service_paths.insert(it->first); | 305 remove_service_paths.insert(it->first); |
| 162 network_map_.erase(it->second); | 306 network_map_.erase(it->second); |
| 163 container_->RemoveChildView(it->second); | 307 container_->RemoveChildView(it->second); |
| 164 needs_relayout = true; | 308 needs_relayout = true; |
| 165 } | 309 } |
| 166 } | 310 } |
| 167 | 311 |
| 168 for (std::set<std::string>::const_iterator remove_it = | 312 for (std::set<std::string>::const_iterator remove_it = |
| 169 remove_service_paths.begin(); | 313 remove_service_paths.begin(); |
| 170 remove_it != remove_service_paths.end(); | 314 remove_it != remove_service_paths.end(); ++remove_it) { |
| 171 ++remove_it) { | |
| 172 service_path_map_.erase(*remove_it); | 315 service_path_map_.erase(*remove_it); |
| 173 } | 316 } |
| 174 | 317 |
| 175 if (needs_relayout) | 318 if (needs_relayout) |
| 176 HandleRelayout(); | 319 HandleRelayout(); |
| 177 } | 320 } |
| 178 | 321 |
| 179 void NetworkListView::HandleRelayout() { | 322 void NetworkListViewMd::HandleRelayout() { |
| 180 views::View* selected_view = NULL; | 323 views::View* selected_view = nullptr; |
| 181 for (auto& iter : service_path_map_) { | 324 for (auto& iter : service_path_map_) { |
| 182 if (delegate_->IsViewHovered(iter.second)) { | 325 if (delegate_->IsViewHovered(iter.second)) { |
| 183 selected_view = iter.second; | 326 selected_view = iter.second; |
| 184 break; | 327 break; |
| 185 } | 328 } |
| 186 } | 329 } |
| 187 container_->SizeToPreferredSize(); | 330 container_->SizeToPreferredSize(); |
| 188 delegate_->RelayoutScrollList(); | 331 delegate_->RelayoutScrollList(); |
| 189 if (selected_view) | 332 if (selected_view) |
| 190 container_->ScrollRectToVisible(selected_view->bounds()); | 333 container_->ScrollRectToVisible(selected_view->bounds()); |
| 191 } | 334 } |
| 192 | 335 |
| 193 bool NetworkListView::UpdateNetworkListEntries( | 336 bool NetworkListViewMd::UpdateNetworkListEntries( |
| 194 std::set<std::string>* new_service_paths) { | 337 std::set<std::string>* new_service_paths) { |
| 195 bool needs_relayout = false; | 338 bool needs_relayout = false; |
| 196 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); | 339 NetworkStateHandler* handler = NetworkHandler::Get()->network_state_handler(); |
| 197 | 340 |
| 198 // Insert child views | 341 // Insert child views |
| 199 int index = 0; | 342 int index = 0; |
| 200 | 343 |
| 201 // Highlighted networks | 344 // High-priority networks (not Wi-Fi) |
| 202 needs_relayout |= | 345 needs_relayout |= |
| 203 UpdateNetworkChildren(new_service_paths, &index, true /* highlighted */); | 346 UpdateNetworkChildren(new_service_paths, &index, false /* not Wi-Fi */); |
| 204 | 347 |
| 205 const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern(); | 348 const NetworkTypePattern pattern = delegate_->GetNetworkTypePattern(); |
| 206 if (pattern.MatchesPattern(NetworkTypePattern::Cellular())) { | 349 if (pattern.MatchesPattern(NetworkTypePattern::Cellular())) { |
| 207 // Cellular initializing | 350 // Cellular initializing |
| 208 int message_id = network_icon::GetCellularUninitializedMsg(); | 351 int message_id = network_icon::GetCellularUninitializedMsg(); |
| 209 if (!message_id && | 352 if (!message_id && |
| 210 handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) && | 353 handler->IsTechnologyEnabled(NetworkTypePattern::Mobile()) && |
| 211 !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) { | 354 !handler->FirstNetworkByType(NetworkTypePattern::Mobile())) { |
| 212 message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS; | 355 message_id = IDS_ASH_STATUS_TRAY_NO_CELLULAR_NETWORKS; |
| 213 } | 356 } |
| 214 needs_relayout |= | 357 needs_relayout |= |
| 215 UpdateInfoLabel(message_id, index, &no_cellular_networks_view_); | 358 UpdateInfoLabel(message_id, index, &no_cellular_networks_view_); |
| 216 | 359 |
| 217 if (message_id) | 360 if (message_id) |
| 218 ++index; | 361 ++index; |
| 219 } | 362 } |
| 220 | 363 |
| 221 if (pattern.MatchesPattern(NetworkTypePattern::WiFi())) { | 364 if (pattern.MatchesPattern(NetworkTypePattern::WiFi())) { |
| 365 needs_relayout |= UpdateWiFiHeaderRow( | |
| 366 handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()), index, | |
| 367 &wifi_header_view_); | |
| 368 ++index; | |
| 369 | |
| 222 // "Wifi Enabled / Disabled" | 370 // "Wifi Enabled / Disabled" |
| 223 int message_id = 0; | 371 int message_id = 0; |
| 224 if (network_list_.empty()) { | 372 if (network_list_.empty()) { |
| 225 message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()) | 373 message_id = handler->IsTechnologyEnabled(NetworkTypePattern::WiFi()) |
| 226 ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED | 374 ? IDS_ASH_STATUS_TRAY_NETWORK_WIFI_ENABLED |
| 227 : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED; | 375 : IDS_ASH_STATUS_TRAY_NETWORK_WIFI_DISABLED; |
| 228 } | 376 } |
| 229 needs_relayout |= | 377 needs_relayout |= |
| 230 UpdateInfoLabel(message_id, index, &no_wifi_networks_view_); | 378 UpdateInfoLabel(message_id, index, &no_wifi_networks_view_); |
| 231 if (message_id) | 379 if (message_id) |
| 232 ++index; | 380 ++index; |
| 381 | |
| 382 // Wi-Fi networks | |
| 383 needs_relayout |= | |
| 384 UpdateNetworkChildren(new_service_paths, &index, true /* Wi-Fi */); | |
| 233 } | 385 } |
| 234 | 386 |
| 235 // Un-highlighted networks | |
| 236 needs_relayout |= UpdateNetworkChildren(new_service_paths, &index, | |
| 237 false /* not highlighted */); | |
| 238 | |
| 239 // No networks or other messages (fallback) | 387 // No networks or other messages (fallback) |
| 240 if (index == 0) { | 388 if (index == 0) { |
| 241 needs_relayout |= UpdateInfoLabel(IDS_ASH_STATUS_TRAY_NO_NETWORKS, index, | 389 needs_relayout |= UpdateInfoLabel(IDS_ASH_STATUS_TRAY_NO_NETWORKS, index, |
| 242 &no_wifi_networks_view_); | 390 &no_wifi_networks_view_); |
| 243 } | 391 } |
| 244 | 392 |
| 245 return needs_relayout; | 393 return needs_relayout; |
| 246 } | 394 } |
| 247 | 395 |
| 248 bool NetworkListView::UpdateNetworkChildren( | 396 bool NetworkListViewMd::UpdateNetworkChildren( |
| 249 std::set<std::string>* new_service_paths, | 397 std::set<std::string>* new_service_paths, |
| 250 int* child_index, | 398 int* child_index, |
| 251 bool highlighted) { | 399 bool wifi) { |
| 252 bool needs_relayout = false; | 400 bool needs_relayout = false; |
| 253 int index = *child_index; | 401 int index = *child_index; |
| 254 for (auto& info : network_list_) { | 402 for (auto& info : network_list_) { |
| 255 if (info->highlight != highlighted) | 403 if (info->wifi != wifi) |
| 256 continue; | 404 continue; |
| 257 needs_relayout |= UpdateNetworkChild(index++, info.get()); | 405 needs_relayout |= UpdateNetworkChild(index++, info.get()); |
| 258 new_service_paths->insert(info->service_path); | 406 new_service_paths->insert(info->service_path); |
| 259 } | 407 } |
| 260 *child_index = index; | 408 *child_index = index; |
| 261 return needs_relayout; | 409 return needs_relayout; |
| 262 } | 410 } |
| 263 | 411 |
| 264 bool NetworkListView::UpdateNetworkChild(int index, const NetworkInfo* info) { | 412 bool NetworkListViewMd::UpdateNetworkChild(int index, const NetworkInfo* info) { |
| 265 bool needs_relayout = false; | 413 bool needs_relayout = false; |
| 266 views::View* container = NULL; | 414 views::View* container = nullptr; |
| 267 ServicePathMap::const_iterator found = | 415 ServicePathMap::const_iterator found = |
| 268 service_path_map_.find(info->service_path); | 416 service_path_map_.find(info->service_path); |
| 269 if (found == service_path_map_.end()) { | 417 if (found == service_path_map_.end()) { |
| 270 container = delegate_->CreateViewForNetwork(*info); | 418 container = delegate_->CreateViewForNetwork(*info); |
| 271 container_->AddChildViewAt(container, index); | 419 container_->AddChildViewAt(container, index); |
| 272 needs_relayout = true; | 420 needs_relayout = true; |
| 273 } else { | 421 } else { |
| 274 container = found->second; | 422 container = found->second; |
| 275 container->RemoveAllChildViews(true); | 423 container->RemoveAllChildViews(true); |
| 276 delegate_->UpdateViewForNetwork(container, *info); | 424 delegate_->UpdateViewForNetwork(container, *info); |
| 277 container->Layout(); | 425 container->Layout(); |
| 278 container->SchedulePaint(); | 426 container->SchedulePaint(); |
| 279 needs_relayout = PlaceViewAtIndex(container, index); | 427 needs_relayout = PlaceViewAtIndex(container, index); |
| 280 } | 428 } |
| 281 if (info->disable) | 429 if (info->disable) |
| 282 container->SetEnabled(false); | 430 container->SetEnabled(false); |
| 283 network_map_[container] = info->service_path; | 431 network_map_[container] = info->service_path; |
| 284 service_path_map_[info->service_path] = container; | 432 service_path_map_[info->service_path] = container; |
| 285 return needs_relayout; | 433 return needs_relayout; |
| 286 } | 434 } |
| 287 | 435 |
| 288 bool NetworkListView::PlaceViewAtIndex(views::View* view, int index) { | 436 bool NetworkListViewMd::PlaceViewAtIndex(views::View* view, int index) { |
| 289 if (container_->child_at(index) == view) | 437 if (container_->child_at(index) == view) |
| 290 return false; | 438 return false; |
| 291 container_->ReorderChildView(view, index); | 439 container_->ReorderChildView(view, index); |
| 292 return true; | 440 return true; |
| 293 } | 441 } |
| 294 | 442 |
| 295 bool NetworkListView::UpdateInfoLabel(int message_id, | 443 bool NetworkListViewMd::UpdateInfoLabel(int message_id, |
| 296 int index, | 444 int index, |
| 297 views::Label** label) { | 445 views::Label** label) { |
| 298 CHECK(label); | 446 CHECK(label); |
| 299 bool needs_relayout = false; | 447 bool needs_relayout = false; |
| 300 if (message_id) { | 448 if (message_id) { |
| 301 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 449 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); |
| 302 base::string16 text = rb.GetLocalizedString(message_id); | 450 base::string16 text = rb.GetLocalizedString(message_id); |
| 303 if (!*label) { | 451 if (!*label) { |
| 304 *label = delegate_->CreateInfoLabel(); | 452 *label = delegate_->CreateInfoLabel(); |
| 305 (*label)->SetText(text); | 453 (*label)->SetText(text); |
| 306 container_->AddChildViewAt(*label, index); | 454 container_->AddChildViewAt(*label, index); |
| 307 needs_relayout = true; | 455 needs_relayout = true; |
| 308 } else { | 456 } else { |
| 309 (*label)->SetText(text); | 457 (*label)->SetText(text); |
| 310 needs_relayout = PlaceViewAtIndex(*label, index); | 458 needs_relayout = PlaceViewAtIndex(*label, index); |
| 311 } | 459 } |
| 312 } else if (*label) { | 460 } else if (*label) { |
| 313 container_->RemoveChildView(*label); | 461 container_->RemoveChildView(*label); |
| 314 delete *label; | 462 delete *label; |
| 315 *label = NULL; | 463 *label = nullptr; |
| 316 needs_relayout = true; | 464 needs_relayout = true; |
| 317 } | 465 } |
| 318 return needs_relayout; | 466 return needs_relayout; |
| 319 } | 467 } |
| 320 | 468 |
| 321 void NetworkListView::NetworkIconChanged() { | 469 bool NetworkListViewMd::UpdateWiFiHeaderRow(bool enabled, |
| 470 int index, | |
| 471 WiFiHeaderRowView** view) { | |
|
tdanderson
2016/09/20 14:44:33
*& preferable to **?
varkha
2016/09/23 00:35:53
I thought the style was to pass output parameters
| |
| 472 CHECK(view); | |
|
tdanderson
2016/09/20 14:44:33
Don't forget to remove / change to DCHECK
varkha
2016/09/23 00:35:53
|view| (unlike *view) should never be passed as nu
| |
| 473 bool needs_relayout = false; | |
| 474 if (!*view) { | |
| 475 *view = new WiFiHeaderRowView(this, enabled); | |
| 476 container_->AddChildViewAt(*view, index); | |
| 477 needs_relayout = true; | |
| 478 } else { | |
| 479 (*view)->SetEnabled(enabled); | |
| 480 needs_relayout = PlaceViewAtIndex(*view, index); | |
| 481 } | |
| 482 return needs_relayout; | |
| 483 } | |
| 484 | |
| 485 void NetworkListViewMd::NetworkIconChanged() { | |
| 322 Update(); | 486 Update(); |
| 323 } | 487 } |
| 324 | 488 |
| 489 void NetworkListViewMd::ButtonPressed(views::Button* sender, | |
| 490 const ui::Event& event) { | |
| 491 if (sender == wifi_header_view_->toggle()) { | |
| 492 NetworkStateHandler* handler = | |
| 493 NetworkHandler::Get()->network_state_handler(); | |
| 494 handler->SetTechnologyEnabled(NetworkTypePattern::WiFi(), | |
| 495 wifi_header_view_->is_toggled(), | |
| 496 chromeos::network_handler::ErrorCallback()); | |
| 497 return; | |
| 498 } else if (sender == wifi_header_view_->join()) { | |
| 499 delegate_->OnOtherWifiClicked(); | |
| 500 return; | |
| 501 } | |
| 502 NOTREACHED(); | |
| 503 return; | |
|
tdanderson
2016/09/20 14:44:33
nit: not needed.
varkha
2016/09/23 00:35:53
Done.
| |
| 504 } | |
| 505 | |
| 325 } // namespace ui | 506 } // namespace ui |
| OLD | NEW |