1b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock/* 24cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk * Copyright (C) 2015 The Android Open Source Project 3b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * 4b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * Licensed under the Apache License, Version 2.0 (the "License"); 5b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * you may not use this file except in compliance with the License. 6b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * You may obtain a copy of the License at 7b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * 8b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * http://www.apache.org/licenses/LICENSE-2.0 9b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * 10b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * Unless required by applicable law or agreed to in writing, software 11b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * distributed under the License is distributed on an "AS IS" BASIS, 12b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * See the License for the specific language governing permissions and 14b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock * limitations under the License. 15b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock */ 16b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 174cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monkpackage com.android.settingslib.net; 18b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 1953313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.net.ConnectivityManager.TYPE_MOBILE; 2053313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.net.NetworkStatsHistory.FIELD_RX_BYTES; 2153313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.net.NetworkStatsHistory.FIELD_TX_BYTES; 2253313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES; 2353313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.telephony.TelephonyManager.SIM_STATE_READY; 2453313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.text.format.DateUtils.FORMAT_ABBREV_MONTH; 2553313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport static android.text.format.DateUtils.FORMAT_SHOW_DATE; 2653313d7e8153982f842910118371e1dc061248cdJeff Sharkey 27b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.content.Context; 28b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.net.ConnectivityManager; 29b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.net.INetworkStatsService; 30b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.net.INetworkStatsSession; 315e9049a362016c9f00823346d619303674f9df0eJohn Spurlockimport android.net.NetworkPolicy; 325e9049a362016c9f00823346d619303674f9df0eJohn Spurlockimport android.net.NetworkPolicyManager; 33b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.net.NetworkStatsHistory; 34b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.net.NetworkTemplate; 35b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.os.RemoteException; 36b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.os.ServiceManager; 37b574627ebc383d35cf8212ee241b191b26518a0dJason Monkimport android.telephony.SubscriptionManager; 38b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.telephony.TelephonyManager; 39b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.text.format.DateUtils; 40b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport android.util.Log; 4153313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport android.util.Pair; 42b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 437aeb3f54408a7bd0c1ca3020bca32900b2091b1dAndrew Sappersteinimport com.android.internal.R; 4470196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang 4553313d7e8153982f842910118371e1dc061248cdJeff Sharkeyimport java.time.ZonedDateTime; 46b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlockimport java.util.Date; 47d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlockimport java.util.Locale; 48b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 49f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monkpublic class DataUsageController { 5070196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang 51f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk private static final String TAG = "DataUsageController"; 52d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); 53b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private static final int FIELDS = FIELD_RX_BYTES | FIELD_TX_BYTES; 54d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock private static final StringBuilder PERIOD_BUILDER = new StringBuilder(50); 55d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock private static final java.util.Formatter PERIOD_FORMATTER = new java.util.Formatter( 56d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock PERIOD_BUILDER, Locale.getDefault()); 57b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 58b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private final Context mContext; 59b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private final TelephonyManager mTelephonyManager; 60b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private final ConnectivityManager mConnectivityManager; 61b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private final INetworkStatsService mStatsService; 625e9049a362016c9f00823346d619303674f9df0eJohn Spurlock private final NetworkPolicyManager mPolicyManager; 63b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 64b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private INetworkStatsSession mSession; 65b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private Callback mCallback; 664cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk private NetworkNameProvider mNetworkController; 67b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 68f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk public DataUsageController(Context context) { 69b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mContext = context; 70b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mTelephonyManager = TelephonyManager.from(context); 71b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mConnectivityManager = ConnectivityManager.from(context); 72b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mStatsService = INetworkStatsService.Stub.asInterface( 73b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 745e9049a362016c9f00823346d619303674f9df0eJohn Spurlock mPolicyManager = NetworkPolicyManager.from(mContext); 75cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock } 765e9049a362016c9f00823346d619303674f9df0eJohn Spurlock 774cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public void setNetworkController(NetworkNameProvider networkController) { 78d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk mNetworkController = networkController; 79d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk } 80d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk 8170196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang /** 8270196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang * Returns the default warning level in bytes. 8370196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang */ 8470196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang public long getDefaultWarningLevel() { 8570196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang return MB_IN_BYTES 8670196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang * mContext.getResources().getInteger(R.integer.default_data_warning_level_mb); 8770196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang } 8870196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang 89cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock private INetworkStatsSession getSession() { 90cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock if (mSession == null) { 91cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock try { 92cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock mSession = mStatsService.openSession(); 93cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock } catch (RemoteException e) { 94cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock Log.w(TAG, "Failed to open stats session", e); 95cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock } catch (RuntimeException e) { 96cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock Log.w(TAG, "Failed to open stats session", e); 97cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock } 98b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 99cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock return mSession; 100b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 101b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 102b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public void setCallback(Callback callback) { 103b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mCallback = callback; 104b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 105b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 106b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private DataUsageInfo warn(String msg) { 107b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock Log.w(TAG, "Failed to get data usage, " + msg); 108b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return null; 109b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 110b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 111b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public DataUsageInfo getDataUsageInfo() { 112b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final String subscriberId = getActiveSubscriberId(mContext); 113b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock if (subscriberId == null) { 114b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return warn("no subscriber id"); 115b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 116f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk NetworkTemplate template = NetworkTemplate.buildTemplateMobileAll(subscriberId); 117f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk template = NetworkTemplate.normalize(template, mTelephonyManager.getMergedSubscriberIds()); 118f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk 119f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk return getDataUsageInfo(template); 120f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk } 121f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk 122f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk public DataUsageInfo getWifiDataUsageInfo() { 123f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk NetworkTemplate template = NetworkTemplate.buildTemplateWifiWildcard(); 124f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk return getDataUsageInfo(template); 125f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk } 126f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk 127f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk public DataUsageInfo getDataUsageInfo(NetworkTemplate template) { 128cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock final INetworkStatsSession session = getSession(); 129cfa39d269bf404f6121889ebc431fbf20a79eb2aJohn Spurlock if (session == null) { 130b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return warn("no stats session"); 131b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 1325e9049a362016c9f00823346d619303674f9df0eJohn Spurlock final NetworkPolicy policy = findNetworkPolicy(template); 133b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock try { 134f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk final NetworkStatsHistory history = session.getHistoryForNetwork(template, FIELDS); 135b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final long now = System.currentTimeMillis(); 136d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock final long start, end; 13753313d7e8153982f842910118371e1dc061248cdJeff Sharkey if (policy != null) { 13853313d7e8153982f842910118371e1dc061248cdJeff Sharkey final Pair<ZonedDateTime, ZonedDateTime> cycle = NetworkPolicyManager 13953313d7e8153982f842910118371e1dc061248cdJeff Sharkey .cycleIterator(policy).next(); 14053313d7e8153982f842910118371e1dc061248cdJeff Sharkey start = cycle.first.toInstant().toEpochMilli(); 14153313d7e8153982f842910118371e1dc061248cdJeff Sharkey end = cycle.second.toInstant().toEpochMilli(); 142d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock } else { 143d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock // period = last 4 wks 144d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock end = now; 145d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock start = now - DateUtils.WEEK_IN_MILLIS * 4; 146d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock } 147b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final long callStart = System.currentTimeMillis(); 148b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final NetworkStatsHistory.Entry entry = history.getValues(start, end, now, null); 149b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final long callEnd = System.currentTimeMillis(); 150b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock if (DEBUG) Log.d(TAG, String.format("history call from %s to %s now=%s took %sms: %s", 151b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock new Date(start), new Date(end), new Date(now), callEnd - callStart, 152b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock historyEntryToString(entry))); 153b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock if (entry == null) { 154b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return warn("no entry data"); 155b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 156b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final long totalBytes = entry.rxBytes + entry.txBytes; 157b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final DataUsageInfo usage = new DataUsageInfo(); 158f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk usage.startDate = start; 159b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock usage.usageLevel = totalBytes; 160d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock usage.period = formatDateRange(start, end); 161dcab5008701057108061620ad67b0007ccba62cdJan Nordqvist usage.cycleStart = start; 162dcab5008701057108061620ad67b0007ccba62cdJan Nordqvist usage.cycleEnd = end; 163dcab5008701057108061620ad67b0007ccba62cdJan Nordqvist 1645e9049a362016c9f00823346d619303674f9df0eJohn Spurlock if (policy != null) { 1655e9049a362016c9f00823346d619303674f9df0eJohn Spurlock usage.limitLevel = policy.limitBytes > 0 ? policy.limitBytes : 0; 1665e9049a362016c9f00823346d619303674f9df0eJohn Spurlock usage.warningLevel = policy.warningBytes > 0 ? policy.warningBytes : 0; 167d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock } else { 16870196d84a640ed4781e3d79a4dfe2015126238ffFan Zhang usage.warningLevel = getDefaultWarningLevel(); 1695e9049a362016c9f00823346d619303674f9df0eJohn Spurlock } 1704cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk if (usage != null && mNetworkController != null) { 1715504d39b7f880fa8b8660e5d4b014ec559124cf9Pavel Zhamaitsiak usage.carrier = mNetworkController.getMobileDataNetworkName(); 172d2263cd9db36d5f74a124c5ffaf8594ef702408fJason Monk } 173b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return usage; 174b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } catch (RemoteException e) { 175b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return warn("remote call failed"); 176b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 177b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 178b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 1795e9049a362016c9f00823346d619303674f9df0eJohn Spurlock private NetworkPolicy findNetworkPolicy(NetworkTemplate template) { 1805e9049a362016c9f00823346d619303674f9df0eJohn Spurlock if (mPolicyManager == null || template == null) return null; 1815e9049a362016c9f00823346d619303674f9df0eJohn Spurlock final NetworkPolicy[] policies = mPolicyManager.getNetworkPolicies(); 1825e9049a362016c9f00823346d619303674f9df0eJohn Spurlock if (policies == null) return null; 1835e9049a362016c9f00823346d619303674f9df0eJohn Spurlock final int N = policies.length; 1845e9049a362016c9f00823346d619303674f9df0eJohn Spurlock for (int i = 0; i < N; i++) { 1855e9049a362016c9f00823346d619303674f9df0eJohn Spurlock final NetworkPolicy policy = policies[i]; 1865e9049a362016c9f00823346d619303674f9df0eJohn Spurlock if (policy != null && template.equals(policy.template)) { 1875e9049a362016c9f00823346d619303674f9df0eJohn Spurlock return policy; 1885e9049a362016c9f00823346d619303674f9df0eJohn Spurlock } 1895e9049a362016c9f00823346d619303674f9df0eJohn Spurlock } 1905e9049a362016c9f00823346d619303674f9df0eJohn Spurlock return null; 1915e9049a362016c9f00823346d619303674f9df0eJohn Spurlock } 1925e9049a362016c9f00823346d619303674f9df0eJohn Spurlock 193b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private static String historyEntryToString(NetworkStatsHistory.Entry entry) { 194b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return entry == null ? null : new StringBuilder("Entry[") 195b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append("bucketDuration=").append(entry.bucketDuration) 196b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",bucketStart=").append(entry.bucketStart) 197b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",activeTime=").append(entry.activeTime) 198b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",rxBytes=").append(entry.rxBytes) 199b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",rxPackets=").append(entry.rxPackets) 200b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",txBytes=").append(entry.txBytes) 201b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",txPackets=").append(entry.txPackets) 202b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(",operations=").append(entry.operations) 203b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock .append(']').toString(); 204b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 205b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 206b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public void setMobileDataEnabled(boolean enabled) { 20736ffb0494dd1045c164b7479b68165e206f8c759Wink Saville Log.d(TAG, "setMobileDataEnabled: enabled=" + enabled); 208b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mTelephonyManager.setDataEnabled(enabled); 209b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock if (mCallback != null) { 210b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock mCallback.onMobileDataEnabled(enabled); 211b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 212b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 213b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 214b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public boolean isMobileDataSupported() { 215b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock // require both supported network and ready SIM 216b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return mConnectivityManager.isNetworkSupported(TYPE_MOBILE) 217b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock && mTelephonyManager.getSimState() == SIM_STATE_READY; 218b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 219b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 220b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public boolean isMobileDataEnabled() { 221b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return mTelephonyManager.getDataEnabled(); 222b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 223b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 224b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock private static String getActiveSubscriberId(Context context) { 225b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock final TelephonyManager tele = TelephonyManager.from(context); 226b574627ebc383d35cf8212ee241b191b26518a0dJason Monk final String actualSubscriberId = tele.getSubscriberId( 2277ea3e8bf8954343d7b243b6a23bcb8339921f3c8Shishir Agrawal SubscriptionManager.getDefaultDataSubscriptionId()); 228b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock return actualSubscriberId; 229b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 230b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock 231d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock private String formatDateRange(long start, long end) { 232d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock final int flags = FORMAT_SHOW_DATE | FORMAT_ABBREV_MONTH; 233d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock synchronized (PERIOD_BUILDER) { 234d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock PERIOD_BUILDER.setLength(0); 235d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock return DateUtils.formatDateRange(mContext, PERIOD_FORMATTER, start, end, flags, null) 236d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock .toString(); 237d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock } 238d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock } 239d11a19b8ea08035c14052ee42cbc529e62cc4c70John Spurlock 2404cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public interface NetworkNameProvider { 2414cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk String getMobileDataNetworkName(); 2424cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk } 2434cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk 2444cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public static class DataUsageInfo { 2454cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public String carrier; 2464cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public String period; 247f668d7cceb3c6cc9143fcf92230681bddd7ccf21Jason Monk public long startDate; 2484cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public long limitLevel; 2494cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public long warningLevel; 2504cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk public long usageLevel; 251dcab5008701057108061620ad67b0007ccba62cdJan Nordqvist public long cycleStart; 252dcab5008701057108061620ad67b0007ccba62cdJan Nordqvist public long cycleEnd; 2534cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk } 2544cf95aef839701a43c9bde292f5e2d8ca3213509Jason Monk 255b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock public interface Callback { 256b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock void onMobileDataEnabled(boolean enabled); 257b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock } 258b98f747c714ff8252471ca0a3295c2cb9ccb4f3aJohn Spurlock} 259