NetworkPolicyManager.java revision fdfef57f498e3021a34342538aef9f1c7ccbae78
1d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey/*
2d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project
3d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *
4d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License");
5d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * you may not use this file except in compliance with the License.
6d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * You may obtain a copy of the License at
7d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *
8d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *      http://www.apache.org/licenses/LICENSE-2.0
9d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *
10d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * Unless required by applicable law or agreed to in writing, software
11d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS,
12d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * See the License for the specific language governing permissions and
14d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * limitations under the License.
15d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey */
16d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
17d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkeypackage android.net;
18d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
19cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkeyimport static android.text.format.Time.MONTH_DAY;
20cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
21eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.content.Context;
2214711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkeyimport android.content.Intent;
23d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkeyimport android.os.RemoteException;
24cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkeyimport android.text.format.Time;
25d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
261b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkeyimport java.io.PrintWriter;
271b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
28d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey/**
29d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * Manager for creating and modifying network policy rules.
30d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *
31d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * {@hide}
32d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey */
33d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkeypublic class NetworkPolicyManager {
34d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
35d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    /** No specific network policy, use system default. */
36d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public static final int POLICY_NONE = 0x0;
37fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    /** Reject network usage on metered networks when application in background. */
38fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    public static final int POLICY_REJECT_METERED_BACKGROUND = 0x1;
39c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey
40c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    /** All network traffic should be allowed. */
41c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    public static final int RULE_ALLOW_ALL = 0x0;
42fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    /** Reject traffic on metered networks. */
43fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    public static final int RULE_REJECT_METERED = 0x1;
44d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
4514711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    /**
4614711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * {@link Intent} action launched when user selects {@link NetworkPolicy}
4714711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * warning notification.
4814711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     */
4914711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    public static final String ACTION_DATA_USAGE_WARNING =
5014711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey            "android.intent.action.DATA_USAGE_WARNING";
5114711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey
5214711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    /**
5314711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * {@link Intent} action launched when user selects {@link NetworkPolicy}
5414711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * limit notification.
5514711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     */
5614711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    public static final String ACTION_DATA_USAGE_LIMIT =
5714711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey            "android.intent.action.DATA_USAGE_LIMIT";
5814711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey
5914711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    /**
6014711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * {@link Intent} extra included in {@link #ACTION_DATA_USAGE_WARNING} and
6114711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * {@link #ACTION_DATA_USAGE_LIMIT} to indicate which
6214711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     * {@link NetworkPolicy#networkTemplate} it applies to.
6314711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     */
6414711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    public static final String EXTRA_NETWORK_TEMPLATE =
6514711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey            "android.intent.extra.NETWORK_TEMPLATE";
6614711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey
67d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    private INetworkPolicyManager mService;
68d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
69d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public NetworkPolicyManager(INetworkPolicyManager service) {
70d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        if (service == null) {
71d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            throw new IllegalArgumentException("missing INetworkPolicyManager");
72d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
73d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        mService = service;
74d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
75d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
76eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    public static NetworkPolicyManager getSystemService(Context context) {
77eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        return (NetworkPolicyManager) context.getSystemService(Context.NETWORK_POLICY_SERVICE);
78eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    }
79eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
8021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    /** {@hide} */
8122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public void setNetworkPolicies(NetworkPolicy[] policies) {
8221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        try {
8322c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            mService.setNetworkPolicies(policies);
8421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        } catch (RemoteException e) {
8521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
8621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
8721c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
8821c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    /** {@hide} */
8922c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey    public NetworkPolicy[] getNetworkPolicies() {
9021c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        try {
9122c055e6424e0e9579711545d8f4800c0f796db8Jeff Sharkey            return mService.getNetworkPolicies();
9221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        } catch (RemoteException e) {
9321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey            return null;
9421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey        }
9521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey    }
9621c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey
97d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    /**
98d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey     * Set policy flags for specific UID.
99d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey     *
100c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey     * @param policy {@link #POLICY_NONE} or combination of flags like
101fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey     *            {@link #POLICY_REJECT_METERED_BACKGROUND}.
102d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey     */
103d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public void setUidPolicy(int uid, int policy) {
104d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        try {
105d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            mService.setUidPolicy(uid, policy);
106d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        } catch (RemoteException e) {
107d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
108d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
109d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
110d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public int getUidPolicy(int uid) {
111d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        try {
112d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            return mService.getUidPolicy(uid);
113d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        } catch (RemoteException e) {
114d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            return POLICY_NONE;
115d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
116d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
117cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
1181a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    public void registerListener(INetworkPolicyListener listener) {
1191a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        try {
1201a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            mService.registerListener(listener);
1211a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        } catch (RemoteException e) {
1221a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        }
1231a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    }
1241a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
1251a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    public void unregisterListener(INetworkPolicyListener listener) {
1261a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        try {
1271a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            mService.unregisterListener(listener);
1281a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        } catch (RemoteException e) {
1291a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        }
1301a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    }
1311a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
132cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /**
133cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * Compute the last cycle boundary for the given {@link NetworkPolicy}. For
134cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * example, if cycle day is 20th, and today is June 15th, it will return May
135cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * 20th. When cycle day doesn't exist in current month, it snaps to the 1st
136cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * of following month.
137cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     *
138cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * @hide
139cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     */
140cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
141cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time now = new Time(Time.TIMEZONE_UTC);
142cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        now.set(currentTime);
143cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
144cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        // first, find cycle boundary for current month
145cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time cycle = new Time(now);
146cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        cycle.hour = cycle.minute = cycle.second = 0;
147cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        snapToCycleDay(cycle, policy.cycleDay);
148cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
149cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (Time.compare(cycle, now) >= 0) {
150cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // cycle boundary is beyond now, use last cycle boundary; start by
151cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // pushing ourselves squarely into last month.
152cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            final Time lastMonth = new Time(now);
153cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.hour = lastMonth.minute = lastMonth.second = 0;
154cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.monthDay = 1;
155cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.month -= 1;
156cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.normalize(true);
157cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
158cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            cycle.set(lastMonth);
159cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            snapToCycleDay(cycle, policy.cycleDay);
160cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
161cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
162cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        return cycle.toMillis(true);
163cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
164cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
165cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /** {@hide} */
166cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
167cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time now = new Time(Time.TIMEZONE_UTC);
168cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        now.set(currentTime);
169cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
170cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        // first, find cycle boundary for current month
171cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time cycle = new Time(now);
172cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        cycle.hour = cycle.minute = cycle.second = 0;
173cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        snapToCycleDay(cycle, policy.cycleDay);
174cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
175cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (Time.compare(cycle, now) <= 0) {
176cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // cycle boundary is before now, use next cycle boundary; start by
177cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // pushing ourselves squarely into next month.
178cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            final Time nextMonth = new Time(now);
179cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.hour = nextMonth.minute = nextMonth.second = 0;
180cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.monthDay = 1;
181cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.month += 1;
182cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.normalize(true);
183cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
184cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            cycle.set(nextMonth);
185cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            snapToCycleDay(cycle, policy.cycleDay);
186cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
187cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
188cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        return cycle.toMillis(true);
189cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
190cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
191cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /**
192cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * Snap to the cycle day for the current month given; when cycle day doesn't
193cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * exist, it snaps to 1st of following month.
194cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     *
195cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * @hide
196cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     */
197cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static void snapToCycleDay(Time time, int cycleDay) {
198cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (cycleDay > time.getActualMaximum(MONTH_DAY)) {
199cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // cycle day isn't valid this month; snap to 1st of next month
200cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.month += 1;
201cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.monthDay = 1;
202cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        } else {
203cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.monthDay = cycleDay;
204cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
205cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        time.normalize(true);
206cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
207cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
208497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    /**
209497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     * Check if given UID can have a {@link #setUidPolicy(int, int)} defined,
210497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     * usually to protect critical system services.
211497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     */
212497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    public static boolean isUidValidForPolicy(Context context, int uid) {
213497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey        return (uid >= android.os.Process.FIRST_APPLICATION_UID
214497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey                && uid <= android.os.Process.LAST_APPLICATION_UID);
215497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    }
216497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey
2171b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    /** {@hide} */
2181b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    public static void dumpPolicy(PrintWriter fout, int policy) {
2191b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("[");
220fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey        if ((policy & POLICY_REJECT_METERED_BACKGROUND) != 0) {
221fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey            fout.write("REJECT_METERED_BACKGROUND");
2221b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        }
2231b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("]");
2241b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    }
2251b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
2261b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    /** {@hide} */
2271b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    public static void dumpRules(PrintWriter fout, int rules) {
2281b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("[");
229fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey        if ((rules & RULE_REJECT_METERED) != 0) {
230fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey            fout.write("REJECT_METERED");
2311b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        }
2321b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("]");
2331b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    }
2341b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
235d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey}
236