• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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