diff options
author | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-20 15:34:51 +0000 |
---|---|---|
committer | dpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-07-20 15:34:51 +0000 |
commit | 87d7d88cc8a0475c96b906da6cb8807bf3a870e5 (patch) | |
tree | 8f9cc50133a5eff5fbbaf70df35416187fd65b0d | |
parent | d4bb3c18133599b708e92c2a18cc6237dce9c974 (diff) | |
download | chromium_src-87d7d88cc8a0475c96b906da6cb8807bf3a870e5.zip chromium_src-87d7d88cc8a0475c96b906da6cb8807bf3a870e5.tar.gz chromium_src-87d7d88cc8a0475c96b906da6cb8807bf3a870e5.tar.bz2 |
Add APN selection list with predefined APNs
BUG=chromium-os:14290
TEST=manual
Review URL: http://codereview.chromium.org/7433008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@93198 0039d316-1c4b-4281-b951-d872f2087c98
6 files changed, 217 insertions, 57 deletions
diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index 5ddb0a5..6ec183e 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -816,21 +816,7 @@ static bool ParseApnList(const ListValue* list, for (ListValue::const_iterator it = list->begin(); it != list->end(); ++it) { if ((*it)->IsType(Value::TYPE_DICTIONARY)) { apn_list->resize(apn_list->size() + 1); - const DictionaryValue* dict = static_cast<const DictionaryValue*>(*it); - dict->GetStringWithoutPathExpansion( - kApnProperty, &apn_list->back().apn); - dict->GetStringWithoutPathExpansion( - kApnNetworkIdProperty, &apn_list->back().network_id); - dict->GetStringWithoutPathExpansion( - kApnUsernameProperty, &apn_list->back().username); - dict->GetStringWithoutPathExpansion( - kApnPasswordProperty, &apn_list->back().password); - dict->GetStringWithoutPathExpansion( - kApnNameProperty, &apn_list->back().name); - dict->GetStringWithoutPathExpansion( - kApnLocalizedNameProperty, &apn_list->back().localized_name); - dict->GetStringWithoutPathExpansion( - kApnLanguageProperty, &apn_list->back().language); + apn_list->back().Set(*static_cast<const DictionaryValue*>(*it)); } else { return false; } diff --git a/chrome/browser/resources/options/chromeos/internet_detail.html b/chrome/browser/resources/options/chromeos/internet_detail.html index 37511ea..c68a6ea 100644 --- a/chrome/browser/resources/options/chromeos/internet_detail.html +++ b/chrome/browser/resources/options/chromeos/internet_detail.html @@ -162,31 +162,42 @@ <td class="option-name" i18n-content="errorState"></td> <td id="errorState" class="option-value"></td> </tr> - <tr class="gsm-only"> + <tr class="gsm-only apn-list-view"> + <td class="option-name" i18n-content="cellularApnLabel"></td> + <td id="cellularApnLabel" class="option-value"> + <select id="selectApn"> + <option value="-1" i18n-content="cellularApnOther"> + </option> + </select> + </td> + </tr> + <tr class="gsm-only apn-details-view"> <td class="option-name" i18n-content="cellularApnLabel"></td> <td id="cellularApnLabel" class="option-value"> <input id="cellularApn" type="text"> </td> </tr> - <tr class="gsm-only"> + <tr class="gsm-only apn-details-view"> <td class="option-name" i18n-content="cellularApnUsername"></td> <td id="cellularApnUsernameLabel" class="option-value"> <input id="cellularApnUsername" type="text"> </td> </tr> - <tr class="gsm-only"> + <tr class="gsm-only apn-details-view"> <td class="option-name" i18n-content="cellularApnPassword"></td> <td id="cellularApnPasswordLabel" class="option-value"> <input id="cellularApnPassword" type="password"> </td> </tr> - <tr class="gsm-only"> + <tr class="gsm-only apn-details-view"> <td class="option-name"></td> <td class="option-value"> - <button id="cellularApnClear" - i18n-content="cellularApnClear"></button> + <button id="cellularApnUseDefault" + i18n-content="cellularApnUseDefault"></button> <button id="cellularApnSet" i18n-content="cellularApnSet"></button> + <button id="cellularApnCancel" + i18n-content="cellularApnCancel"></button> </td> </tr> <tr> diff --git a/chrome/browser/resources/options/chromeos/internet_detail.js b/chrome/browser/resources/options/chromeos/internet_detail.js index 0838eeb..0426879 100644 --- a/chrome/browser/resources/options/chromeos/internet_detail.js +++ b/chrome/browser/resources/options/chromeos/internet_detail.js @@ -80,6 +80,12 @@ cr.define('options.internet', function() { updateHidden( cr.doc.querySelectorAll('#detailsInternetPage .cdma-only'), !this.cellular || this.gsm); + updateHidden( + cr.doc.querySelectorAll('#detailsInternetPage .apn-list-view'), + !this.cellular || !this.gsm); + updateHidden( + cr.doc.querySelectorAll('#detailsInternetPage .apn-details-view'), + true); updateHidden( cr.doc.querySelectorAll('#detailsInternetPage .password-details'), diff --git a/chrome/browser/resources/options/chromeos/internet_options.js b/chrome/browser/resources/options/chromeos/internet_options.js index 7fb9059..91108e3 100644 --- a/chrome/browser/resources/options/chromeos/internet_options.js +++ b/chrome/browser/resources/options/chromeos/internet_options.js @@ -92,22 +92,114 @@ cr.define('options', function() { chrome.send('buyDataPlan', []); OptionsPage.closeOverlay(); }); - $('cellularApnClear').addEventListener('click', function(event) { - $('cellularApn').value = ""; - $('cellularApnUsername').value = ""; - $('cellularApnPassword').value = ""; + $('cellularApnUseDefault').addEventListener('click', function(event) { var data = $('connectionState').data; - chrome.send('setApn', [String(data.servicePath), - String($('cellularApn').value), - String($('cellularApnUsername').value), - String($('cellularApnPassword').value)]); + var apnSelector = $('selectApn'); + + if (data.userApnIndex != -1) { + apnSelector.remove(data.userApnIndex); + data.userApnIndex = -1; + } + + if (data.providerApnList.length > 0) { + var iApn = 0; + data.apn.apn = data.providerApnList[iApn].apn; + data.apn.username = data.providerApnList[iApn].username; + data.apn.password = data.providerApnList[iApn].password; + chrome.send('setApn', [String(data.servicePath), + String(data.apn.apn), + String(data.apn.username), + String(data.apn.password)]); + apnSelector.selectedIndex = iApn; + data.selectedApn = iApn; + } else { + data.apn.apn = ''; + data.apn.username = ''; + data.apn.password = ''; + apnSelector.selectedIndex = -1; + data.selectedApn = -1; + } + + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-list-view'), + false); + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-details-view'), + true); }); $('cellularApnSet').addEventListener('click', function(event) { + if ($('cellularApn').value == '') + return; + var data = $('connectionState').data; + var apnSelector = $('selectApn'); + + data.apn.apn = String($('cellularApn').value); + data.apn.username = String($('cellularApnUsername').value); + data.apn.password = String($('cellularApnPassword').value); chrome.send('setApn', [String(data.servicePath), - String($('cellularApn').value), - String($('cellularApnUsername').value), - String($('cellularApnPassword').value)]); + String(data.apn.apn), + String(data.apn.username), + String(data.apn.password)]); + + if (data.userApnIndex != -1) { + apnSelector.remove(data.userApnIndex); + data.userApnIndex = -1; + } + + var option = document.createElement('option'); + option.textContent = data.apn.apn; + option.value = -1; + option.selected = true; + apnSelector.add(option, apnSelector[apnSelector.length - 1]); + data.userApnIndex = apnSelector.length - 2 + data.selectedApn = data.userApnIndex; + + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-list-view'), + false); + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-details-view'), + true); + }); + $('cellularApnCancel').addEventListener('click', function(event) { + $('selectApn').selectedIndex = $('connectionState').data.selectedApn; + + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-list-view'), + false); + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-details-view'), + true); + }); + $('selectApn').addEventListener('change', function(event) { + var data = $('connectionState').data; + var apnSelector = $('selectApn'); + if (apnSelector[apnSelector.selectedIndex].value != -1) { + chrome.send('setApn', [String(data.servicePath), + String(data.providerApnList[apnSelector.selectedIndex].apn), + String(data.providerApnList[apnSelector.selectedIndex].username), + String(data.providerApnList[apnSelector.selectedIndex].password) + ]); + data.selectedApn = apnSelector.selectedIndex; + } else if (apnSelector.selectedIndex == data.userApnIndex) { + chrome.send('setApn', [String(data.servicePath), + String(data.apn.apn), + String(data.apn.username), + String(data.apn.password)]); + data.selectedApn = apnSelector.selectedIndex; + } else { + $('cellularApn').value = data.apn.apn; + $('cellularApnUsername').value = data.apn.username; + $('cellularApnPassword').value = data.apn.password; + + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-list-view'), + true); + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-details-view'), + false); + } }); $('sim-card-lock-enabled').addEventListener('click', function(event) { var newValue = $('sim-card-lock-enabled').checked; @@ -135,6 +227,12 @@ cr.define('options', function() { [networkType, servicePath, "options"]); }, + updateHidden_: function(elements, hidden) { + for (var i = 0, el; el = elements[i]; i++) { + el.hidden = hidden; + } + }, + /** * Update internet page controls. * @private @@ -149,8 +247,8 @@ cr.define('options', function() { $('vpn-section').hidden = accesslocked; $('remembered-section').hidden = accesslocked; - // Don't change hidden attribute on OptionsPage divs directly beucase it - // is used in supporting infrasture now. + // Don't change hidden attribute on OptionsPage divs directly because it + // is used in supporting infrastructure now. if (accesslocked && DetailsInternetPage.getInstance().visible) this.closeOverlay(); } @@ -462,18 +560,53 @@ cr.define('options', function() { $('operatorName').textContent = data.operatorName; $('operatorCode').textContent = data.operatorCode; $('imsi').textContent = data.imsi; - // If there's no custom APN show default APN that is used. These will be - // displayed differently when http://crosbug.com/14290 is fixed. - // See also http://crosbug.com/p/4058 for context. - if (data.apn != '') { - $('cellularApn').value = data.apn; - $('cellularApnUsername').value = data.apn_username; - $('cellularApnPassword').value = data.apn_password; - } else { - $('cellularApn').value = data.last_good_apn; - $('cellularApnUsername').value = data.last_good_apn_username; - $('cellularApnPassword').value = data.last_good_apn_password; + + var apnSelector = $('selectApn'); + // Clear APN lists, keep only last element that "other". + while (apnSelector.length != 1) + apnSelector.remove(0); + var otherOption = apnSelector[0]; + data.selectedApn = -1; + data.userApnIndex = -1; + for (var i = 0; i < data.providerApnList.length; i++) { + var option = document.createElement('option'); + var name = data.providerApnList[i].localizedName; + if (name == '' && data.providerApnList[i].name != '') + name = data.providerApnList[i].name; + if (name == '') + name = data.providerApnList[i].apn; + else + name = name + ' (' + data.providerApnList[i].apn + ')'; + option.textContent = name; + option.value = i; + if ((data.apn.apn == data.providerApnList[i].apn && + data.apn.username == data.providerApnList[i].username && + data.apn.password == data.providerApnList[i].password) || + (data.apn.apn == '' && + data.lastGoodApn.apn == data.providerApnList[i].apn && + data.lastGoodApn.username == data.providerApnList[i].username && + data.lastGoodApn.password == data.providerApnList[i].password)) { + data.selectedApn = i; + } + // Insert new option before "other" option. + apnSelector.add(option, otherOption); + } + if (data.selectedApn == -1 && data.apn.apn != '') { + var option = document.createElement('option'); + option.textContent = data.apn.apn; + option.value = -1; + apnSelector.add(option, otherOption); + data.selectedApn = apnSelector.length - 2; + data.userApnIndex = data.selectedApn; } + apnSelector.selectedIndex = data.selectedApn; + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-list-view'), + false); + InternetOptions.prototype.updateHidden_( + cr.doc.querySelectorAll('.apn-details-view'), + true); + $('sim-card-lock-enabled').checked = data.simCardLockEnabled; InternetOptions.enableSecurityTab(true); } diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc index 4f7d034..9d1027c 100644 --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc @@ -255,18 +255,24 @@ void InternetOptionsHandler::GetLocalizedValues( localized_strings->SetString("cellularApnLabel", l10n_util::GetStringUTF16( IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN)); + localized_strings->SetString("cellularApnOther", + l10n_util::GetStringUTF16( + IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN_OTHER)); localized_strings->SetString("cellularApnUsername", l10n_util::GetStringUTF16( IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN_USERNAME)); localized_strings->SetString("cellularApnPassword", l10n_util::GetStringUTF16( IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN_PASSWORD)); - localized_strings->SetString("cellularApnClear", + localized_strings->SetString("cellularApnUseDefault", l10n_util::GetStringUTF16( IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN_CLEAR)); localized_strings->SetString("cellularApnSet", l10n_util::GetStringUTF16( IDS_OPTIONS_SETTINGS_INTERNET_CELLULAR_APN_SET)); + localized_strings->SetString("cellularApnCancel", + l10n_util::GetStringUTF16( + IDS_CANCEL)); localized_strings->SetString("accessSecurityTabLink", l10n_util::GetStringUTF16( @@ -754,6 +760,19 @@ void InternetOptionsHandler::PopulateWifiDetails( dictionary->SetBoolean("shareable", shareable); } +DictionaryValue* InternetOptionsHandler::CreateDictionaryFromCellularApn( + const chromeos::CellularApn& apn) { + DictionaryValue* dictionary = new DictionaryValue(); + dictionary->SetString("apn", apn.apn); + dictionary->SetString("networkId", apn.network_id); + dictionary->SetString("username", apn.username); + dictionary->SetString("password", apn.password); + dictionary->SetString("name", apn.name); + dictionary->SetString("localizedName", apn.localized_name); + dictionary->SetString("language", apn.language); + return dictionary; +} + void InternetOptionsHandler::PopulateCellularDetails( const chromeos::CellularNetwork* cellular, DictionaryValue* dictionary) { @@ -777,17 +796,9 @@ void InternetOptionsHandler::PopulateCellularDetails( dictionary->SetString("supportUrl", cellular->payment_url()); dictionary->SetBoolean("needsPlan", cellular->needs_new_plan()); - const chromeos::CellularApn& apn = cellular->apn(); - dictionary->SetString("apn", apn.apn); - dictionary->SetString("apn_network_id", apn.network_id); - dictionary->SetString("apn_username", apn.username); - dictionary->SetString("apn_password", apn.password); - - const chromeos::CellularApn& last_good_apn = cellular->last_good_apn(); - dictionary->SetString("last_good_apn", last_good_apn.apn); - dictionary->SetString("last_good_apn_network_id", last_good_apn.network_id); - dictionary->SetString("last_good_apn_username", last_good_apn.username); - dictionary->SetString("last_good_apn_password", last_good_apn.password); + dictionary->Set("apn", CreateDictionaryFromCellularApn(cellular->apn())); + dictionary->Set("lastGoodApn", + CreateDictionaryFromCellularApn(cellular->last_good_apn())); dictionary->SetBoolean("autoConnect", cellular->auto_connect()); @@ -821,6 +832,14 @@ void InternetOptionsHandler::PopulateCellularDetails( if (deal && !deal->top_up_url().empty()) dictionary->SetString("carrierUrl", deal->top_up_url()); } + + const chromeos::CellularApnList& apn_list = device->provider_apn_list(); + ListValue* apn_list_value = new ListValue(); + for (chromeos::CellularApnList::const_iterator it = apn_list.begin(); + it != apn_list.end(); ++it) { + apn_list_value->Append(CreateDictionaryFromCellularApn(*it)); + } + dictionary->Set("providerApnList", apn_list_value); } SetActivationButtonVisibility(cellular, dictionary); diff --git a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h index e0355b9..c1d32ba 100644 --- a/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h +++ b/chrome/browser/ui/webui/options/chromeos/internet_options_handler.h @@ -102,6 +102,11 @@ class InternetOptionsHandler // settings into human readable texts. base::DictionaryValue* CellularDataPlanToDictionary( const chromeos::CellularDataPlan* plan); + + // Converts CellularApn stuct into dictionary for JS. + base::DictionaryValue* CreateDictionaryFromCellularApn( + const chromeos::CellularApn& apn); + // Creates the map of a network. base::ListValue* GetNetwork(const std::string& service_path, const SkBitmap& icon, |