OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/ui/webui/options/chromeos/internet_options_handler.h" | 5 #include "chrome/browser/ui/webui/options/chromeos/internet_options_handler.h" |
6 | 6 |
7 #include <ctype.h> | 7 #include <ctype.h> |
8 | 8 |
9 #include <map> | 9 #include <map> |
10 #include <string> | 10 #include <string> |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 const char kTagCellularEnabled[] = "cellularEnabled"; | 116 const char kTagCellularEnabled[] = "cellularEnabled"; |
117 const char kTagCellularSupportsScan[] = "cellularSupportsScan"; | 117 const char kTagCellularSupportsScan[] = "cellularSupportsScan"; |
118 const char kTagConfigure[] = "configure"; | 118 const char kTagConfigure[] = "configure"; |
119 const char kTagConnect[] = "connect"; | 119 const char kTagConnect[] = "connect"; |
120 const char kTagDeviceConnected[] = "deviceConnected"; | 120 const char kTagDeviceConnected[] = "deviceConnected"; |
121 const char kTagDisconnect[] = "disconnect"; | 121 const char kTagDisconnect[] = "disconnect"; |
122 const char kTagErrorMessage[] = "errorMessage"; | 122 const char kTagErrorMessage[] = "errorMessage"; |
123 const char kTagForget[] = "forget"; | 123 const char kTagForget[] = "forget"; |
124 const char kTagOptions[] = "options"; | 124 const char kTagOptions[] = "options"; |
125 const char kTagRememberedList[] = "rememberedList"; | 125 const char kTagRememberedList[] = "rememberedList"; |
126 const char kTagCarriers[] = "carriers"; | |
127 const char kTagCurrentCarrierIndex[] = "currentCarrierIndex"; | |
128 const char kTagShowViewAccountButton[] = "showViewAccountButton"; | 126 const char kTagShowViewAccountButton[] = "showViewAccountButton"; |
129 const char kTagTrue[] = "true"; | 127 const char kTagTrue[] = "true"; |
130 const char kTagVpnList[] = "vpnList"; | 128 const char kTagVpnList[] = "vpnList"; |
131 const char kTagWifiAvailable[] = "wifiAvailable"; | 129 const char kTagWifiAvailable[] = "wifiAvailable"; |
132 const char kTagWifiEnabled[] = "wifiEnabled"; | 130 const char kTagWifiEnabled[] = "wifiEnabled"; |
133 const char kTagWimaxAvailable[] = "wimaxAvailable"; | 131 const char kTagWimaxAvailable[] = "wimaxAvailable"; |
134 const char kTagWimaxEnabled[] = "wimaxEnabled"; | 132 const char kTagWimaxEnabled[] = "wimaxEnabled"; |
135 const char kTagWiredList[] = "wiredList"; | 133 const char kTagWiredList[] = "wiredList"; |
136 const char kTagWirelessList[] = "wirelessList"; | 134 const char kTagWirelessList[] = "wirelessList"; |
137 | 135 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
182 | 180 |
183 std::string icon_url = ui::network_icon::GetImageUrlForNetwork( | 181 std::string icon_url = ui::network_icon::GetImageUrlForNetwork( |
184 network, ui::network_icon::ICON_TYPE_LIST, icon_scale_factor); | 182 network, ui::network_icon::ICON_TYPE_LIST, icon_scale_factor); |
185 | 183 |
186 network_info->SetString(kNetworkInfoKeyIconURL, icon_url); | 184 network_info->SetString(kNetworkInfoKeyIconURL, icon_url); |
187 network_info->SetString(kNetworkInfoKeyServicePath, network->path()); | 185 network_info->SetString(kNetworkInfoKeyServicePath, network->path()); |
188 | 186 |
189 return network_info.release(); | 187 return network_info.release(); |
190 } | 188 } |
191 | 189 |
192 // Given a list of supported carrier's by the device, return the index of | 190 bool ShowViewAccountButton(const NetworkState* cellular) { |
193 // the carrier the device is currently using. | 191 if (cellular->activation_state() != shill::kActivationStateActivating && |
194 int FindCurrentCarrierIndex(const base::ListValue* carriers, | 192 cellular->activation_state() != shill::kActivationStateActivated) |
195 const DeviceState* device) { | 193 return false; |
196 DCHECK(carriers); | |
197 DCHECK(device); | |
198 bool gsm = (device->technology_family() == shill::kTechnologyFamilyGsm); | |
199 int index = 0; | |
200 for (base::ListValue::const_iterator it = carriers->begin(); | |
201 it != carriers->end(); ++it, ++index) { | |
202 std::string value; | |
203 if (!(*it)->GetAsString(&value)) | |
204 continue; | |
205 // For GSM devices the device name will be empty, so simply select | |
206 // the Generic UMTS carrier option if present. | |
207 if (gsm && (value == shill::kCarrierGenericUMTS)) | |
208 return index; | |
209 // For other carriers, the service name will match the carrier name. | |
210 if (value == device->carrier()) | |
211 return index; | |
212 } | |
213 return -1; | |
214 } | |
215 | 194 |
216 void PopulateCellularDetails(const NetworkState* cellular, | |
217 base::DictionaryValue* dictionary) { | |
218 dictionary->SetBoolean(kTagCarrierSelectFlag, | |
219 CommandLine::ForCurrentProcess()->HasSwitch( | |
220 chromeos::switches::kEnableCarrierSwitching)); | |
221 | |
222 // These default to empty and are only set if device != NULL. | |
223 std::string carrier_id; | |
224 std::string mdn; | |
225 | |
226 // Device settings. | |
227 const DeviceState* device = | 195 const DeviceState* device = |
228 NetworkHandler::Get()->network_state_handler()->GetDeviceState( | 196 NetworkHandler::Get()->network_state_handler()->GetDeviceState( |
229 cellular->device_path()); | 197 cellular->device_path()); |
230 if (device) { | |
231 const base::DictionaryValue& device_properties = device->properties(); | |
232 | 198 |
233 carrier_id = device->home_provider_id(); | 199 // If no online payment URL was provided by shill, Check to see if the |
234 device_properties.GetStringWithoutPathExpansion(shill::kMdnProperty, &mdn); | 200 // MobileConfig carrier indicates that "View Account" should be shown. |
235 | 201 if (cellular->payment_url().empty()) { |
236 const base::ListValue* supported_carriers; | 202 if (!device || !MobileConfig::GetInstance()->IsReady()) |
237 if (device_properties.GetListWithoutPathExpansion( | 203 return false; |
238 shill::kSupportedCarriersProperty, &supported_carriers)) { | 204 const MobileConfig::Carrier* carrier = |
239 dictionary->Set(kTagCarriers, supported_carriers->DeepCopy()); | 205 MobileConfig::GetInstance()->GetCarrier(device->home_provider_id()); |
240 dictionary->SetInteger( | 206 if (!carrier || !carrier->show_portal_button()) |
241 kTagCurrentCarrierIndex, | 207 return false; |
242 FindCurrentCarrierIndex(supported_carriers, device)); | |
243 } else { | |
244 // In case of any error, set the current carrier tag to -1 indicating | |
245 // to the JS code to fallback to a single carrier. | |
246 dictionary->SetInteger(kTagCurrentCarrierIndex, -1); | |
247 } | |
248 } | 208 } |
249 | 209 |
250 if (cellular->activation_state() == shill::kActivationStateActivating || | 210 if (!cellular->IsConnectedState()) { |
251 cellular->activation_state() == shill::kActivationStateActivated) { | 211 // Disconnected LTE networks should show the button if we are online and |
252 // TODO(stevenjb): Determine if we actually need this check. The payment url | 212 // the device's MDN is set. This is to enable users to update their plan |
253 // property is commented as 'Deprecated' in service_constants.h and appears | 213 // if they are out of credits. |
254 // to be unset in Shill, but we still reference it in mobile_setup.cc. | 214 if (!NetworkHandler::Get()->network_state_handler()->DefaultNetwork()) |
255 bool may_show_portal_button = !cellular->payment_url().empty(); | 215 return false; |
| 216 const std::string& technology = cellular->network_technology(); |
| 217 if (technology != shill::kNetworkTechnologyLte && |
| 218 technology != shill::kNetworkTechnologyLteAdvanced) |
| 219 return false; |
| 220 std::string mdn; |
| 221 if (device) { |
| 222 device->properties().GetStringWithoutPathExpansion(shill::kMdnProperty, |
| 223 &mdn); |
| 224 } |
| 225 if (mdn.empty()) |
| 226 return false; |
| 227 } |
256 | 228 |
257 // If no online payment URL was provided by shill, fall back to | 229 return true; |
258 // MobileConfig to determine if the "View Account" should be shown. | |
259 if (!may_show_portal_button && MobileConfig::GetInstance()->IsReady()) { | |
260 const MobileConfig::Carrier* carrier = | |
261 MobileConfig::GetInstance()->GetCarrier(carrier_id); | |
262 may_show_portal_button = carrier && carrier->show_portal_button(); | |
263 } | |
264 if (may_show_portal_button) { | |
265 // The button should be shown for a LTE network even when the LTE network | |
266 // is not connected, but CrOS is online. This is done to enable users to | |
267 // update their plan even if they are out of credits. | |
268 // The button should not be shown when the device's mdn is not set, | |
269 // because the network's proper portal url cannot be generated without it | |
270 const NetworkState* default_network = | |
271 NetworkHandler::Get()->network_state_handler()->DefaultNetwork(); | |
272 const std::string& technology = cellular->network_technology(); | |
273 bool force_show_view_account_button = | |
274 (technology == shill::kNetworkTechnologyLte || | |
275 technology == shill::kNetworkTechnologyLteAdvanced) && | |
276 default_network && !mdn.empty(); | |
277 | |
278 // The button will trigger ShowMorePlanInfoCallback() which will open | |
279 // carrier specific portal. | |
280 if (cellular->IsConnectedState() || force_show_view_account_button) | |
281 dictionary->SetBoolean(kTagShowViewAccountButton, true); | |
282 } | |
283 } | |
284 } | 230 } |
285 | 231 |
286 scoped_ptr<base::DictionaryValue> PopulateConnectionDetails( | 232 scoped_ptr<base::DictionaryValue> PopulateConnectionDetails( |
287 const NetworkState* network, | 233 const NetworkState* network, |
288 const base::DictionaryValue& onc_properties) { | 234 const base::DictionaryValue& onc_properties) { |
289 scoped_ptr<base::DictionaryValue> dictionary(onc_properties.DeepCopy()); | 235 scoped_ptr<base::DictionaryValue> dictionary(onc_properties.DeepCopy()); |
290 | 236 |
291 dictionary->SetString(kNetworkInfoKeyServicePath, network->path()); | 237 dictionary->SetString(kNetworkInfoKeyServicePath, network->path()); |
292 dictionary->SetString( | 238 dictionary->SetString( |
293 kTagErrorMessage, | 239 kTagErrorMessage, |
294 ash::network_connect::ErrorString(network->error(), network->path())); | 240 ash::network_connect::ErrorString(network->error(), network->path())); |
295 | 241 |
296 const std::string& type = network->type(); | 242 const std::string& type = network->type(); |
297 | 243 |
298 const NetworkState* connected_network = | 244 const NetworkState* connected_network = |
299 NetworkHandler::Get()->network_state_handler()->ConnectedNetworkByType( | 245 NetworkHandler::Get()->network_state_handler()->ConnectedNetworkByType( |
300 NetworkTypePattern::Primitive(type)); | 246 NetworkTypePattern::Primitive(type)); |
301 dictionary->SetBoolean(kTagDeviceConnected, connected_network != NULL); | 247 dictionary->SetBoolean(kTagDeviceConnected, connected_network != NULL); |
302 | 248 |
303 if (type == shill::kTypeCellular) | 249 if (type == shill::kTypeCellular) { |
304 PopulateCellularDetails(network, dictionary.get()); | 250 dictionary->SetBoolean( |
305 | 251 kTagCarrierSelectFlag, |
| 252 CommandLine::ForCurrentProcess() |
| 253 ->HasSwitch(chromeos::switches::kEnableCarrierSwitching)); |
| 254 dictionary->SetBoolean(kTagShowViewAccountButton, |
| 255 ShowViewAccountButton(network)); |
| 256 } |
306 return dictionary.Pass(); | 257 return dictionary.Pass(); |
307 } | 258 } |
308 | 259 |
309 // Helper methods for SetIPConfigProperties | 260 // Helper methods for SetIPConfigProperties |
310 bool AppendPropertyKeyIfPresent(const std::string& key, | 261 bool AppendPropertyKeyIfPresent(const std::string& key, |
311 const base::DictionaryValue& old_properties, | 262 const base::DictionaryValue& old_properties, |
312 std::vector<std::string>* property_keys) { | 263 std::vector<std::string>* property_keys) { |
313 if (old_properties.HasKey(key)) { | 264 if (old_properties.HasKey(key)) { |
314 property_keys->push_back(key); | 265 property_keys->push_back(key); |
315 return true; | 266 return true; |
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1118 dictionary->SetBoolean( | 1069 dictionary->SetBoolean( |
1119 kTagWimaxAvailable, | 1070 kTagWimaxAvailable, |
1120 handler->IsTechnologyAvailable(NetworkTypePattern::Wimax())); | 1071 handler->IsTechnologyAvailable(NetworkTypePattern::Wimax())); |
1121 dictionary->SetBoolean( | 1072 dictionary->SetBoolean( |
1122 kTagWimaxEnabled, | 1073 kTagWimaxEnabled, |
1123 handler->IsTechnologyEnabled(NetworkTypePattern::Wimax())); | 1074 handler->IsTechnologyEnabled(NetworkTypePattern::Wimax())); |
1124 } | 1075 } |
1125 | 1076 |
1126 } // namespace options | 1077 } // namespace options |
1127 } // namespace chromeos | 1078 } // namespace chromeos |
OLD | NEW |