1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.settings.datausage; 16 17 import android.app.backup.BackupManager; 18 import android.content.Context; 19 import android.content.res.Resources; 20 import android.net.NetworkPolicy; 21 import android.net.NetworkPolicyManager; 22 import android.net.NetworkTemplate; 23 import android.net.wifi.WifiConfiguration; 24 import android.net.wifi.WifiManager; 25 import android.os.Bundle; 26 import android.support.v14.preference.SwitchPreference; 27 import android.support.v7.preference.Preference; 28 import android.support.v7.preference.PreferenceCategory; 29 import android.telephony.TelephonyManager; 30 31 import com.android.internal.logging.nano.MetricsProto.MetricsEvent; 32 import com.android.settings.R; 33 import com.android.settings.SettingsPreferenceFragment; 34 import com.android.settings.search.BaseSearchIndexProvider; 35 import com.android.settings.search.Indexable; 36 import com.android.settings.search.SearchIndexableRaw; 37 import com.android.settingslib.NetworkPolicyEditor; 38 39 import java.util.ArrayList; 40 import java.util.List; 41 42 import static android.net.NetworkPolicy.LIMIT_DISABLED; 43 import static android.net.wifi.WifiInfo.removeDoubleQuotes; 44 import static com.android.settings.datausage.DataUsageList.hasReadyMobileRadio; 45 import static com.android.settings.datausage.DataUsageSummary.hasWifiRadio; 46 47 /** 48 * Panel to configure {@link NetworkPolicy#metered} for networks. 49 */ 50 public class DataUsageMeteredSettings extends SettingsPreferenceFragment implements Indexable { 51 52 private static final boolean SHOW_MOBILE_CATEGORY = false; 53 54 private NetworkPolicyManager mPolicyManager; 55 private WifiManager mWifiManager; 56 57 private NetworkPolicyEditor mPolicyEditor; 58 59 private PreferenceCategory mMobileCategory; 60 private PreferenceCategory mWifiCategory; 61 private Preference mWifiDisabled; 62 63 @Override getMetricsCategory()64 public int getMetricsCategory() { 65 return MetricsEvent.NET_DATA_USAGE_METERED; 66 } 67 68 @Override onCreate(Bundle icicle)69 public void onCreate(Bundle icicle) { 70 super.onCreate(icicle); 71 final Context context = getActivity(); 72 73 mPolicyManager = NetworkPolicyManager.from(context); 74 mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 75 76 mPolicyEditor = new NetworkPolicyEditor(mPolicyManager); 77 mPolicyEditor.read(); 78 79 addPreferencesFromResource(R.xml.data_usage_metered_prefs); 80 mMobileCategory = (PreferenceCategory) findPreference("mobile"); 81 mWifiCategory = (PreferenceCategory) findPreference("wifi"); 82 mWifiDisabled = findPreference("wifi_disabled"); 83 84 updateNetworks(context); 85 } 86 updateNetworks(Context context)87 private void updateNetworks(Context context) { 88 if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) { 89 mMobileCategory.removeAll(); 90 mMobileCategory.addPreference(buildMobilePref(context)); 91 } else { 92 getPreferenceScreen().removePreference(mMobileCategory); 93 } 94 95 mWifiCategory.removeAll(); 96 if (hasWifiRadio(context) && mWifiManager.isWifiEnabled()) { 97 for (WifiConfiguration config : mWifiManager.getConfiguredNetworks()) { 98 if (config.SSID != null) { 99 mWifiCategory.addPreference(buildWifiPref(config)); 100 } 101 } 102 } else { 103 mWifiCategory.addPreference(mWifiDisabled); 104 } 105 } 106 buildMobilePref(Context context)107 private Preference buildMobilePref(Context context) { 108 final TelephonyManager tele = TelephonyManager.from(context); 109 final NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll( 110 tele.getSubscriberId()); 111 final MeteredPreference pref = new MeteredPreference(getPrefContext(), template); 112 pref.setTitle(tele.getNetworkOperatorName()); 113 return pref; 114 } 115 buildWifiPref(WifiConfiguration config)116 private Preference buildWifiPref(WifiConfiguration config) { 117 final String networkId = config.isPasspoint() ? 118 config.providerFriendlyName : config.SSID; 119 final NetworkTemplate template = NetworkTemplate.buildTemplateWifi(networkId); 120 final MeteredPreference pref = new MeteredPreference(getPrefContext(), template); 121 pref.setTitle(removeDoubleQuotes(networkId)); 122 return pref; 123 } 124 125 private class MeteredPreference extends SwitchPreference { 126 private final NetworkTemplate mTemplate; 127 private boolean mBinding; 128 MeteredPreference(Context context, NetworkTemplate template)129 public MeteredPreference(Context context, NetworkTemplate template) { 130 super(context); 131 mTemplate = template; 132 133 setPersistent(false); 134 135 mBinding = true; 136 final NetworkPolicy policy = mPolicyEditor.getPolicyMaybeUnquoted(template); 137 if (policy != null) { 138 if (policy.limitBytes != LIMIT_DISABLED) { 139 setChecked(true); 140 setEnabled(false); 141 } else { 142 setChecked(policy.metered); 143 } 144 } else { 145 setChecked(false); 146 } 147 mBinding = false; 148 } 149 150 @Override notifyChanged()151 protected void notifyChanged() { 152 super.notifyChanged(); 153 if (!mBinding) { 154 mPolicyEditor.setPolicyMetered(mTemplate, isChecked()); 155 // Stage the backup of the SettingsProvider package which backs this up 156 BackupManager.dataChanged("com.android.providers.settings"); 157 } 158 } 159 } 160 161 /** 162 * For search 163 */ 164 public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = 165 new BaseSearchIndexProvider() { 166 @Override 167 public List<SearchIndexableRaw> getRawDataToIndex(Context context, boolean enabled) { 168 final List<SearchIndexableRaw> result = new ArrayList<SearchIndexableRaw>(); 169 final Resources res = context.getResources(); 170 171 // Add fragment title 172 SearchIndexableRaw data = new SearchIndexableRaw(context); 173 data.title = res.getString(R.string.data_usage_menu_metered); 174 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 175 result.add(data); 176 177 // Body 178 data = new SearchIndexableRaw(context); 179 data.title = res.getString(R.string.data_usage_metered_body); 180 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 181 result.add(data); 182 183 if (SHOW_MOBILE_CATEGORY && hasReadyMobileRadio(context)) { 184 // Mobile networks category 185 data = new SearchIndexableRaw(context); 186 data.title = res.getString(R.string.data_usage_metered_mobile); 187 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 188 result.add(data); 189 190 final TelephonyManager tele = TelephonyManager.from(context); 191 192 data = new SearchIndexableRaw(context); 193 data.title = tele.getNetworkOperatorName(); 194 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 195 result.add(data); 196 } 197 198 // Wi-Fi networks category 199 data = new SearchIndexableRaw(context); 200 data.title = res.getString(R.string.data_usage_metered_wifi); 201 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 202 result.add(data); 203 204 final WifiManager wifiManager = 205 (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 206 if (hasWifiRadio(context) && wifiManager.isWifiEnabled()) { 207 for (WifiConfiguration config : wifiManager.getConfiguredNetworks()) { 208 if (config.SSID != null) { 209 final String networkId = config.SSID; 210 211 data = new SearchIndexableRaw(context); 212 data.title = removeDoubleQuotes(networkId); 213 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 214 result.add(data); 215 } 216 } 217 } else { 218 data = new SearchIndexableRaw(context); 219 data.title = res.getString(R.string.data_usage_metered_wifi_disabled); 220 data.screenTitle = res.getString(R.string.data_usage_menu_metered); 221 result.add(data); 222 } 223 224 return result; 225 } 226 227 @Override 228 public List<String> getNonIndexableKeys(Context context) { 229 final ArrayList<String> result = new ArrayList<String>(); 230 if (!SHOW_MOBILE_CATEGORY || !hasReadyMobileRadio(context)) { 231 result.add("mobile"); 232 } 233 234 return result; 235 } 236 }; 237 238 } 239