Merge "Move "metered" persistence to WifiConfiguration."
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 3d17894..96560a0 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5718,6 +5718,13 @@
<!-- Body text prompting user to enable Wi-Fi to configure metered networks. [CHAR LIMIT=64] -->
<string name="data_usage_metered_wifi_disabled">To select metered networks, turn Wi\u2011Fi on.</string>
+ <!-- Option for indicating that a network being metered (expensive) should be determined automatically. [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_auto">Automatic</string>
+ <!-- Option for indicating that a network is metered (expensive). [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_yes">Metered</string>
+ <!-- Option for indicating that a network is not metered (inexpensive). [CHAR LIMIT=32] -->
+ <string name="data_usage_metered_no">Not metered</string>
+
<!-- Disclaimer string for data usage measured by device. [CHAR LIMIT=80] -->
<string name="data_usage_disclaimer">Carrier data accounting may differ from your device.</string>
diff --git a/src/com/android/settings/datausage/DataUsageMeteredSettings.java b/src/com/android/settings/datausage/DataUsageMeteredSettings.java
index c2a18e9..830fc96 100644
--- a/src/com/android/settings/datausage/DataUsageMeteredSettings.java
+++ b/src/com/android/settings/datausage/DataUsageMeteredSettings.java
@@ -14,19 +14,21 @@
package com.android.settings.datausage;
+import static android.net.wifi.WifiInfo.removeDoubleQuotes;
+
+import static com.android.settings.datausage.DataUsageSummary.hasWifiRadio;
+
import android.app.backup.BackupManager;
import android.content.Context;
import android.content.res.Resources;
-import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
-import android.net.NetworkTemplate;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
-import android.support.v14.preference.SwitchPreference;
+import android.support.v7.preference.DropDownPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceCategory;
-import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
@@ -39,18 +41,11 @@
import java.util.ArrayList;
import java.util.List;
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-import static android.net.wifi.WifiInfo.removeDoubleQuotes;
-import static com.android.settings.datausage.DataUsageList.hasReadyMobileRadio;
-import static com.android.settings.datausage.DataUsageSummary.hasWifiRadio;
-
/**
- * Panel to configure {@link NetworkPolicy#metered} for networks.
+ * Panel to configure {@link WifiConfiguration#meteredOverride}.
*/
public class DataUsageMeteredSettings extends SettingsPreferenceFragment implements Indexable {
- private static final boolean SHOW_MOBILE_CATEGORY = false;
-
private NetworkPolicyManager mPolicyManager;
private WifiManager mWifiManager;
@@ -85,18 +80,14 @@
}
private void updateNetworks(Context context) {
- if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) {
- mMobileCategory.removeAll();
- mMobileCategory.addPreference(buildMobilePref(context));
- } else {
- getPreferenceScreen().removePreference(mMobileCategory);
- }
+ getPreferenceScreen().removePreference(mMobileCategory);
mWifiCategory.removeAll();
if (hasWifiRadio(context) && mWifiManager.isWifiEnabled()) {
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
- if (config.SSID != null) {
- mWifiCategory.addPreference(buildWifiPref(config));
+ final Preference pref = new MeteredPreference(getPrefContext(), config);
+ if (!TextUtils.isEmpty(pref.getTitle())) {
+ mWifiCategory.addPreference(pref);
}
}
} else {
@@ -104,57 +95,40 @@
}
}
- private Preference buildMobilePref(Context context) {
- final TelephonyManager tele = TelephonyManager.from(context);
- final NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(
- tele.getSubscriberId());
- final MeteredPreference pref = new MeteredPreference(getPrefContext(), template);
- pref.setTitle(tele.getNetworkOperatorName());
- return pref;
- }
+ private class MeteredPreference extends DropDownPreference {
+ private final WifiConfiguration mConfig;
- private Preference buildWifiPref(WifiConfiguration config) {
- final String networkId = config.isPasspoint() ?
- config.providerFriendlyName : config.SSID;
- final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(networkId);
- final MeteredPreference pref = new MeteredPreference(getPrefContext(), template);
- pref.setTitle(removeDoubleQuotes(networkId));
- return pref;
- }
-
- private class MeteredPreference extends SwitchPreference {
- private final NetworkTemplate mTemplate;
- private boolean mBinding;
-
- public MeteredPreference(Context context, NetworkTemplate template) {
+ public MeteredPreference(Context context, WifiConfiguration config) {
super(context);
- mTemplate = template;
+ mConfig = config;
setPersistent(false);
+ setEntries(new CharSequence[] {
+ getString(R.string.data_usage_metered_auto),
+ getString(R.string.data_usage_metered_yes),
+ getString(R.string.data_usage_metered_no),
+ });
+ setEntryValues(new CharSequence[] {
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_NONE),
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_METERED),
+ Integer.toString(WifiConfiguration.METERED_OVERRIDE_NOT_METERED),
+ });
+ setValue(Integer.toString(mConfig.meteredOverride));
+ setTitle(NetworkPolicyManager.resolveNetworkId(mConfig));
+ setSummary(getEntries()[mConfig.meteredOverride]);
- mBinding = true;
- final NetworkPolicy policy = mPolicyEditor.getPolicyMaybeUnquoted(template);
- if (policy != null) {
- if (policy.limitBytes != LIMIT_DISABLED) {
- setChecked(true);
- setEnabled(false);
- } else {
- setChecked(policy.metered);
+ setOnPreferenceChangeListener(new OnPreferenceChangeListener() {
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ mConfig.meteredOverride = Integer.parseInt((String) newValue);
+ setSummary(getEntries()[mConfig.meteredOverride]);
+
+ mWifiManager.updateNetwork(mConfig);
+ // Stage the backup of the SettingsProvider package which backs this up
+ BackupManager.dataChanged("com.android.providers.settings");
+ return true;
}
- } else {
- setChecked(false);
- }
- mBinding = false;
- }
-
- @Override
- protected void notifyChanged() {
- super.notifyChanged();
- if (!mBinding) {
- mPolicyEditor.setPolicyMetered(mTemplate, isChecked());
- // Stage the backup of the SettingsProvider package which backs this up
- BackupManager.dataChanged("com.android.providers.settings");
- }
+ });
}
}
@@ -180,21 +154,6 @@
data.screenTitle = res.getString(R.string.data_usage_menu_metered);
result.add(data);
- if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) {
- // Mobile networks category
- data = new SearchIndexableRaw(context);
- data.title = res.getString(R.string.data_usage_metered_mobile);
- data.screenTitle = res.getString(R.string.data_usage_menu_metered);
- result.add(data);
-
- final TelephonyManager tele = TelephonyManager.from(context);
-
- data = new SearchIndexableRaw(context);
- data.title = tele.getNetworkOperatorName();
- data.screenTitle = res.getString(R.string.data_usage_menu_metered);
- result.add(data);
- }
-
// Wi-Fi networks category
data = new SearchIndexableRaw(context);
data.title = res.getString(R.string.data_usage_metered_wifi);
@@ -227,12 +186,8 @@
@Override
public List<String> getNonIndexableKeys(Context context) {
final List<String> result = super.getNonIndexableKeys(context);
- if (!SHOW_MOBILE_CATEGORY || !hasReadyMobileRadio(context)) {
- result.add("mobile");
- }
-
+ result.add("mobile");
return result;
}
};
-
}
diff --git a/src/com/android/settings/datausage/DataUsageSummary.java b/src/com/android/settings/datausage/DataUsageSummary.java
index c5c32ba..e6fc5e7 100644
--- a/src/com/android/settings/datausage/DataUsageSummary.java
+++ b/src/com/android/settings/datausage/DataUsageSummary.java
@@ -14,13 +14,15 @@
package com.android.settings.datausage;
+import static android.net.ConnectivityManager.TYPE_ETHERNET;
+import static android.net.ConnectivityManager.TYPE_WIFI;
+
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.INetworkStatsSession;
-import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkTemplate;
import android.net.TrafficStats;
@@ -46,6 +48,7 @@
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
+
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.R;
import com.android.settings.SummaryPreference;
@@ -55,13 +58,10 @@
import com.android.settings.search.Indexable;
import com.android.settingslib.NetworkPolicyEditor;
import com.android.settingslib.net.DataUsageController;
+
import java.util.ArrayList;
import java.util.List;
-import static android.net.ConnectivityManager.TYPE_ETHERNET;
-import static android.net.ConnectivityManager.TYPE_WIFI;
-import static android.net.NetworkPolicy.LIMIT_DISABLED;
-
public class DataUsageSummary extends DataUsageBase implements Indexable, DataUsageEditController {
static final boolean LOGD = false;
@@ -403,7 +403,7 @@
mPolicyEditor.read();
int count = 0;
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
- if (isMetered(config)) {
+ if (WifiConfiguration.isMetered(config, null)) {
count++;
}
}
@@ -411,23 +411,6 @@
R.plurals.network_restrictions_summary, count, count));
}
- @VisibleForTesting
- boolean isMetered(WifiConfiguration config) {
- if (config.SSID == null) {
- return false;
- }
- final String networkId = config.isPasspoint() ? config.providerFriendlyName : config.SSID;
- final NetworkPolicy policy =
- mPolicyEditor.getPolicyMaybeUnquoted(NetworkTemplate.buildTemplateWifi(networkId));
- if (policy == null) {
- return false;
- }
- if (policy.limitBytes != LIMIT_DISABLED) {
- return true;
- }
- return policy.metered;
- }
-
private static class SummaryProvider
implements SummaryLoader.SummaryProvider {
diff --git a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
index 77e0fe9..13e3aee 100644
--- a/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
+++ b/tests/robotests/src/com/android/settings/datausage/DataUsageSummaryTest.java
@@ -95,60 +95,6 @@
}
@Test
- public void testIsMetered_noSsid_shouldReturnFalse() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
-
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
- public void testIsMetered_noNetworkPolicy_shouldReturnFalse() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- doReturn(null).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
- public void testIsMetered_policyHasLimit_shouldReturnTrue() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- NetworkPolicy policy = mock(NetworkPolicy.class);
- policy.limitBytes = 100;
- doReturn(policy).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- assertThat(dataUsageSummary.isMetered(config)).isTrue();
- }
-
- @Test
- public void testIsMetered_noPolicyLimit_shouldReturnMeteredValue() {
- final DataUsageSummary dataUsageSummary = new DataUsageSummary();
- final NetworkPolicyEditor policyEditor = mock(NetworkPolicyEditor.class);
- ReflectionHelpers.setField(dataUsageSummary, "mPolicyEditor", policyEditor);
- WifiConfiguration config = mock(WifiConfiguration.class);
- config.SSID = "network1";
- NetworkPolicy policy = mock(NetworkPolicy.class);
- policy.limitBytes = NetworkPolicy.LIMIT_DISABLED;
- doReturn(policy).when(policyEditor).getPolicyMaybeUnquoted(any());
-
- policy.metered = true;
- assertThat(dataUsageSummary.isMetered(config)).isTrue();
-
- policy.metered = false;
- assertThat(dataUsageSummary.isMetered(config)).isFalse();
- }
-
- @Test
public void testNonIndexableKeys_existInXmlLayout() {
final Context context = RuntimeEnvironment.application;
final List<String> niks = DataUsageSummary.SEARCH_INDEX_DATA_PROVIDER