blob: 4d94a55cd0c46c6970cd81daadacbabce7b79d4a [file] [log] [blame]
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -07001/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net;
18
Jeff Sharkey4414cea2011-06-24 17:05:24 -070019import static android.content.pm.PackageManager.GET_SIGNATURES;
Jeff Sharkey8fc27e82012-04-04 20:40:58 -070020import static android.net.NetworkPolicy.CYCLE_NONE;
Jeff Sharkeycd2ca402011-06-10 15:14:07 -070021
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060022import android.annotation.SystemService;
Sudheer Shankae359c3d2017-02-22 18:41:29 -080023import android.app.ActivityManager;
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070024import android.content.Context;
Jeff Sharkey14711eb2011-06-15 10:29:17 -070025import android.content.Intent;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070026import android.content.pm.PackageManager;
27import android.content.pm.PackageManager.NameNotFoundException;
28import android.content.pm.Signature;
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070029import android.os.RemoteException;
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -070030import android.os.UserHandle;
Felipe Leme46c4fc32016-05-04 09:21:43 -070031import android.util.DebugUtils;
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070032
Jeff Sharkey4414cea2011-06-24 17:05:24 -070033import com.google.android.collect.Sets;
34
Jeff Sharkeyf2bead52016-07-06 17:11:48 -060035import java.util.Calendar;
Jeff Sharkey4414cea2011-06-24 17:05:24 -070036import java.util.HashSet;
Jeff Sharkeyf2bead52016-07-06 17:11:48 -060037import java.util.TimeZone;
Jeff Sharkey1b861272011-05-22 00:34:52 -070038
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070039/**
40 * Manager for creating and modifying network policy rules.
41 *
42 * {@hide}
43 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060044@SystemService(Context.NETWORK_POLICY_SERVICE)
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070045public class NetworkPolicyManager {
46
Felipe Leme46b451f2016-08-19 08:46:17 -070047 /* POLICY_* are masks and can be ORed, although currently they are not.*/
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070048 /** No specific network policy, use system default. */
49 public static final int POLICY_NONE = 0x0;
Jeff Sharkeyfdfef572011-06-16 15:07:48 -070050 /** Reject network usage on metered networks when application in background. */
51 public static final int POLICY_REJECT_METERED_BACKGROUND = 0x1;
Felipe Leme46b451f2016-08-19 08:46:17 -070052 /** Allow metered network use in the background even when in data usage save mode. */
53 public static final int POLICY_ALLOW_METERED_BACKGROUND = 0x4;
Jeff Sharkeyc006f1a2011-05-19 17:12:49 -070054
Felipe Leme46c4fc32016-05-04 09:21:43 -070055 /*
56 * Rules defining whether an uid has access to a network given its type (metered / non-metered).
57 *
58 * These rules are bits and can be used in bitmask operations; in particular:
59 * - rule & RULE_MASK_METERED: returns the metered-networks status.
60 * - rule & RULE_MASK_ALL: returns the all-networks status.
61 *
62 * The RULE_xxx_ALL rules applies to all networks (metered or non-metered), but on
63 * metered networks, the RULE_xxx_METERED rules should be checked first. For example,
64 * if the device is on Battery Saver Mode and Data Saver Mode simulatenously, and a uid
65 * is whitelisted for the former but not the latter, its status would be
66 * RULE_REJECT_METERED | RULE_ALLOW_ALL, meaning it could have access to non-metered
67 * networks but not to metered networks.
68 *
69 * See network-policy-restrictions.md for more info.
70 */
71 /** No specific rule was set */
72 public static final int RULE_NONE = 0;
Felipe Leme70c57c22016-03-29 10:45:13 -070073 /** Allow traffic on metered networks. */
Felipe Leme46c4fc32016-05-04 09:21:43 -070074 public static final int RULE_ALLOW_METERED = 1 << 0;
Felipe Leme70c57c22016-03-29 10:45:13 -070075 /** Temporarily allow traffic on metered networks because app is on foreground. */
Felipe Leme46c4fc32016-05-04 09:21:43 -070076 public static final int RULE_TEMPORARY_ALLOW_METERED = 1 << 1;
77 /** Reject traffic on metered networks. */
78 public static final int RULE_REJECT_METERED = 1 << 2;
79 /** Network traffic should be allowed on all networks (metered or non-metered), although
80 * metered-network restrictions could still apply. */
81 public static final int RULE_ALLOW_ALL = 1 << 5;
82 /** Reject traffic on all networks. */
83 public static final int RULE_REJECT_ALL = 1 << 6;
84 /** Mask used to get the {@code RULE_xxx_METERED} rules */
85 public static final int MASK_METERED_NETWORKS = 0b00001111;
86 /** Mask used to get the {@code RULE_xxx_ALL} rules */
87 public static final int MASK_ALL_NETWORKS = 0b11110000;
Amith Yamasani15e472352015-04-24 19:06:07 -070088
89 public static final int FIREWALL_RULE_DEFAULT = 0;
90 public static final int FIREWALL_RULE_ALLOW = 1;
91 public static final int FIREWALL_RULE_DENY = 2;
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -070092
Xiaohui Chenb41c9f72015-06-17 15:55:37 -070093 public static final int FIREWALL_TYPE_WHITELIST = 0;
94 public static final int FIREWALL_TYPE_BLACKLIST = 1;
95
96 public static final int FIREWALL_CHAIN_NONE = 0;
97 public static final int FIREWALL_CHAIN_DOZABLE = 1;
98 public static final int FIREWALL_CHAIN_STANDBY = 2;
Felipe Leme011b98f2016-02-10 17:28:31 -080099 public static final int FIREWALL_CHAIN_POWERSAVE = 3;
Xiaohui Chenb41c9f72015-06-17 15:55:37 -0700100
101 public static final String FIREWALL_CHAIN_NAME_NONE = "none";
102 public static final String FIREWALL_CHAIN_NAME_DOZABLE = "dozable";
103 public static final String FIREWALL_CHAIN_NAME_STANDBY = "standby";
Felipe Leme011b98f2016-02-10 17:28:31 -0800104 public static final String FIREWALL_CHAIN_NAME_POWERSAVE = "powersave";
Xiaohui Chenb41c9f72015-06-17 15:55:37 -0700105
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700106 private static final boolean ALLOW_PLATFORM_APP_POLICY = true;
107
Jeff Sharkey14711eb2011-06-15 10:29:17 -0700108 /**
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700109 * {@link Intent} extra that indicates which {@link NetworkTemplate} rule it
110 * applies to.
Jeff Sharkey14711eb2011-06-15 10:29:17 -0700111 */
Jeff Sharkey41ff7ec2011-07-25 15:21:22 -0700112 public static final String EXTRA_NETWORK_TEMPLATE = "android.net.NETWORK_TEMPLATE";
Jeff Sharkey14711eb2011-06-15 10:29:17 -0700113
Svet Ganov16a16892015-04-16 10:32:04 -0700114 private final Context mContext;
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700115 private INetworkPolicyManager mService;
116
Svet Ganov16a16892015-04-16 10:32:04 -0700117 public NetworkPolicyManager(Context context, INetworkPolicyManager service) {
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700118 if (service == null) {
119 throw new IllegalArgumentException("missing INetworkPolicyManager");
120 }
Svet Ganov16a16892015-04-16 10:32:04 -0700121 mContext = context;
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700122 mService = service;
123 }
124
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700125 public static NetworkPolicyManager from(Context context) {
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700126 return (NetworkPolicyManager) context.getSystemService(Context.NETWORK_POLICY_SERVICE);
127 }
128
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700129 /**
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700130 * Set policy flags for specific UID.
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700131 *
Felipe Leme8546a442016-08-23 09:38:20 -0700132 * @param policy should be {@link #POLICY_NONE} or any combination of {@code POLICY_} flags,
133 * although it is not validated.
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700134 */
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700135 public void setUidPolicy(int uid, int policy) {
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700136 try {
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700137 mService.setUidPolicy(uid, policy);
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700138 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700139 throw e.rethrowFromSystemServer();
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700140 }
141 }
142
Dianne Hackbornbe7c50e2014-06-30 14:43:28 -0700143 /**
Felipe Leme8546a442016-08-23 09:38:20 -0700144 * Add policy flags for specific UID.
145 *
146 * <p>The given policy bits will be set for the uid.
147 *
148 * @param policy should be {@link #POLICY_NONE} or any combination of {@code POLICY_} flags,
149 * although it is not validated.
Dianne Hackbornbe7c50e2014-06-30 14:43:28 -0700150 */
151 public void addUidPolicy(int uid, int policy) {
152 try {
153 mService.addUidPolicy(uid, policy);
154 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700155 throw e.rethrowFromSystemServer();
Dianne Hackbornbe7c50e2014-06-30 14:43:28 -0700156 }
157 }
158
159 /**
Felipe Leme8546a442016-08-23 09:38:20 -0700160 * Clear/remove policy flags for specific UID.
161 *
162 * <p>The given policy bits will be set for the uid.
163 *
164 * @param policy should be {@link #POLICY_NONE} or any combination of {@code POLICY_} flags,
165 * although it is not validated.
Dianne Hackbornbe7c50e2014-06-30 14:43:28 -0700166 */
167 public void removeUidPolicy(int uid, int policy) {
168 try {
169 mService.removeUidPolicy(uid, policy);
170 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700171 throw e.rethrowFromSystemServer();
Dianne Hackbornbe7c50e2014-06-30 14:43:28 -0700172 }
173 }
174
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700175 public int getUidPolicy(int uid) {
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700176 try {
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700177 return mService.getUidPolicy(uid);
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700178 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700179 throw e.rethrowFromSystemServer();
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700180 }
181 }
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700182
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700183 public int[] getUidsWithPolicy(int policy) {
Jeff Sharkey854b2b12012-04-13 16:03:40 -0700184 try {
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700185 return mService.getUidsWithPolicy(policy);
Jeff Sharkey854b2b12012-04-13 16:03:40 -0700186 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700187 throw e.rethrowFromSystemServer();
Jeff Sharkey854b2b12012-04-13 16:03:40 -0700188 }
189 }
190
Jeff Sharkey1a303952011-06-16 13:04:20 -0700191 public void registerListener(INetworkPolicyListener listener) {
192 try {
193 mService.registerListener(listener);
194 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700195 throw e.rethrowFromSystemServer();
Jeff Sharkey1a303952011-06-16 13:04:20 -0700196 }
197 }
198
199 public void unregisterListener(INetworkPolicyListener listener) {
200 try {
201 mService.unregisterListener(listener);
202 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700203 throw e.rethrowFromSystemServer();
Jeff Sharkey1a303952011-06-16 13:04:20 -0700204 }
205 }
206
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700207 public void setNetworkPolicies(NetworkPolicy[] policies) {
208 try {
209 mService.setNetworkPolicies(policies);
210 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700211 throw e.rethrowFromSystemServer();
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700212 }
213 }
214
215 public NetworkPolicy[] getNetworkPolicies() {
216 try {
Svet Ganov16a16892015-04-16 10:32:04 -0700217 return mService.getNetworkPolicies(mContext.getOpPackageName());
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700218 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700219 throw e.rethrowFromSystemServer();
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700220 }
221 }
222
223 public void setRestrictBackground(boolean restrictBackground) {
224 try {
225 mService.setRestrictBackground(restrictBackground);
226 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700227 throw e.rethrowFromSystemServer();
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700228 }
229 }
230
231 public boolean getRestrictBackground() {
232 try {
233 return mService.getRestrictBackground();
234 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700235 throw e.rethrowFromSystemServer();
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700236 }
237 }
238
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700239 /**
Stuart Scott984dc852015-03-30 13:17:11 -0700240 * Resets network policy settings back to factory defaults.
241 *
242 * @hide
243 */
244 public void factoryReset(String subscriber) {
Stuart Scottf1fb3972015-04-02 18:00:02 -0700245 try {
246 mService.factoryReset(subscriber);
247 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -0700248 throw e.rethrowFromSystemServer();
Stuart Scott984dc852015-03-30 13:17:11 -0700249 }
250 }
251
252 /**
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700253 * Compute the last cycle boundary for the given {@link NetworkPolicy}. For
254 * example, if cycle day is 20th, and today is June 15th, it will return May
255 * 20th. When cycle day doesn't exist in current month, it snaps to the 1st
256 * of following month.
257 *
258 * @hide
259 */
260 public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700261 if (policy.cycleDay == CYCLE_NONE) {
262 throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
263 }
264
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600265 final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(policy.cycleTimezone));
266 cal.setTimeInMillis(currentTime);
267 snapToCycleDay(cal, policy.cycleDay);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700268
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600269 if (cal.getTimeInMillis() >= currentTime) {
270 // Cycle boundary is beyond now, use last cycle boundary
271 cal.set(Calendar.DAY_OF_MONTH, 1);
272 cal.add(Calendar.MONTH, -1);
273 snapToCycleDay(cal, policy.cycleDay);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700274 }
275
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600276 return cal.getTimeInMillis();
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700277 }
278
279 /** {@hide} */
280 public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
Jeff Sharkey8fc27e82012-04-04 20:40:58 -0700281 if (policy.cycleDay == CYCLE_NONE) {
282 throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
283 }
284
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600285 final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(policy.cycleTimezone));
286 cal.setTimeInMillis(currentTime);
287 snapToCycleDay(cal, policy.cycleDay);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700288
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600289 if (cal.getTimeInMillis() <= currentTime) {
290 // Cycle boundary is before now, use next cycle boundary
291 cal.set(Calendar.DAY_OF_MONTH, 1);
292 cal.add(Calendar.MONTH, 1);
293 snapToCycleDay(cal, policy.cycleDay);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700294 }
295
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600296 return cal.getTimeInMillis();
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700297 }
298
299 /**
300 * Snap to the cycle day for the current month given; when cycle day doesn't
Jeff Sharkey9bf31502012-03-09 17:07:21 -0800301 * exist, it snaps to last second of current month.
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700302 *
303 * @hide
304 */
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600305 public static void snapToCycleDay(Calendar cal, int cycleDay) {
306 cal.set(Calendar.HOUR_OF_DAY, 0);
307 cal.set(Calendar.MINUTE, 0);
308 cal.set(Calendar.SECOND, 0);
309 if (cycleDay > cal.getActualMaximum(Calendar.DAY_OF_MONTH)) {
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600310 cal.add(Calendar.MONTH, 1);
Shunta Satod18ffd82016-10-25 17:42:58 +0900311 cal.set(Calendar.DAY_OF_MONTH, 1);
312 cal.set(Calendar.HOUR_OF_DAY, 0);
313 cal.set(Calendar.MINUTE, 0);
314 cal.set(Calendar.SECOND, 0);
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600315 cal.add(Calendar.SECOND, -1);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700316 } else {
Jeff Sharkeyf2bead52016-07-06 17:11:48 -0600317 cal.set(Calendar.DAY_OF_MONTH, cycleDay);
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700318 }
Jeff Sharkeycd2ca402011-06-10 15:14:07 -0700319 }
320
Jeff Sharkey497e4432011-06-14 17:27:29 -0700321 /**
322 * Check if given UID can have a {@link #setUidPolicy(int, int)} defined,
323 * usually to protect critical system services.
324 */
Jeff Sharkey8a8b5812012-03-21 18:13:36 -0700325 @Deprecated
Jeff Sharkey497e4432011-06-14 17:27:29 -0700326 public static boolean isUidValidForPolicy(Context context, int uid) {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700327 // first, quick-reject non-applications
Jeff Sharkeyd0c6ccb2012-09-14 16:26:37 -0700328 if (!UserHandle.isApp(uid)) {
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700329 return false;
330 }
331
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700332 if (!ALLOW_PLATFORM_APP_POLICY) {
333 final PackageManager pm = context.getPackageManager();
334 final HashSet<Signature> systemSignature;
335 try {
336 systemSignature = Sets.newHashSet(
337 pm.getPackageInfo("android", GET_SIGNATURES).signatures);
338 } catch (NameNotFoundException e) {
339 throw new RuntimeException("problem finding system signature", e);
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700340 }
Jeff Sharkeyb3f19ca2011-06-29 23:54:13 -0700341
342 try {
343 // reject apps signed with platform cert
344 for (String packageName : pm.getPackagesForUid(uid)) {
345 final HashSet<Signature> packageSignature = Sets.newHashSet(
346 pm.getPackageInfo(packageName, GET_SIGNATURES).signatures);
347 if (packageSignature.containsAll(systemSignature)) {
348 return false;
349 }
350 }
351 } catch (NameNotFoundException e) {
352 }
Jeff Sharkey4414cea2011-06-24 17:05:24 -0700353 }
354
355 // nothing found above; we can apply policy to UID
356 return true;
Jeff Sharkey497e4432011-06-14 17:27:29 -0700357 }
Felipe Leme46c4fc32016-05-04 09:21:43 -0700358
Felipe Lemeb146f762016-08-19 09:52:16 -0700359 /**
Felipe Leme46c4fc32016-05-04 09:21:43 -0700360 * @hide
361 */
362 public static String uidRulesToString(int uidRules) {
363 final StringBuilder string = new StringBuilder().append(uidRules).append(" (");
364 if (uidRules == RULE_NONE) {
365 string.append("NONE");
366 } else {
367 string.append(DebugUtils.flagsToString(NetworkPolicyManager.class, "RULE_", uidRules));
368 }
369 string.append(")");
370 return string.toString();
371 }
Felipe Lemeb146f762016-08-19 09:52:16 -0700372
373 /**
374 * @hide
375 */
376 public static String uidPoliciesToString(int uidPolicies) {
377 final StringBuilder string = new StringBuilder().append(uidPolicies).append(" (");
378 if (uidPolicies == POLICY_NONE) {
379 string.append("NONE");
380 } else {
381 string.append(DebugUtils.flagsToString(NetworkPolicyManager.class,
382 "POLICY_", uidPolicies));
383 }
384 string.append(")");
385 return string.toString();
386 }
Sudheer Shankae359c3d2017-02-22 18:41:29 -0800387
388 /**
389 * Returns true if {@param procState} is considered foreground and as such will be allowed
390 * to access network when the device is idle or in battery saver mode. Otherwise, false.
391 */
392 public static boolean isProcStateAllowedWhileIdleOrPowerSaveMode(int procState) {
393 return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
394 }
395
396 /**
397 * Returns true if {@param procState} is considered foreground and as such will be allowed
398 * to access network when the device is in data saver mode. Otherwise, false.
399 */
400 public static boolean isProcStateAllowedWhileOnRestrictBackground(int procState) {
401 return procState <= ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;
402 }
Jeff Sharkeyd5cdd592011-05-03 20:27:17 -0700403}