summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-20 15:34:51 +0000
committerdpolukhin@chromium.org <dpolukhin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-07-20 15:34:51 +0000
commit87d7d88cc8a0475c96b906da6cb8807bf3a870e5 (patch)
tree8f9cc50133a5eff5fbbaf70df35416187fd65b0d
parentd4bb3c18133599b708e92c2a18cc6237dce9c974 (diff)
downloadchromium_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
-rw-r--r--chrome/browser/chromeos/cros/network_library.cc16
-rw-r--r--chrome/browser/resources/options/chromeos/internet_detail.html23
-rw-r--r--chrome/browser/resources/options/chromeos/internet_detail.js6
-rw-r--r--chrome/browser/resources/options/chromeos/internet_options.js181
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler.cc43
-rw-r--r--chrome/browser/ui/webui/options/chromeos/internet_options_handler.h5
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,