Merge "Move "metered" persistence to WifiConfiguration."

This commit is contained in:
Jeff Sharkey
2017-07-14 17:47:54 +00:00
committed by Android (Google) Code Review
4 changed files with 53 additions and 162 deletions

View File

@@ -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>

View File

@@ -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 com.android.settingslib.NetworkPolicyEditor;
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 @@ public class DataUsageMeteredSettings extends SettingsPreferenceFragment impleme
}
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 @@ public class DataUsageMeteredSettings extends SettingsPreferenceFragment impleme
}
}
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 @@ public class DataUsageMeteredSettings extends SettingsPreferenceFragment impleme
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 @@ public class DataUsageMeteredSettings extends SettingsPreferenceFragment impleme
@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;
}
};
}

View File

@@ -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.text.style.RelativeSizeSpan;
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.BaseSearchIndexProvider;
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 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs
mPolicyEditor.read();
int count = 0;
for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) {
if (isMetered(config)) {
if (WifiConfiguration.isMetered(config, null)) {
count++;
}
}
@@ -411,23 +411,6 @@ public class DataUsageSummary extends DataUsageBase implements Indexable, DataUs
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 {

View File

@@ -94,60 +94,6 @@ public class DataUsageSummaryTest {
R.plurals.network_restrictions_summary, 0, 0));
}
@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;