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 |