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
194414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport static android.content.pm.PackageManager.GET_SIGNATURES;
208fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.NetworkPolicy.CYCLE_NONE;
21cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkeyimport static android.text.format.Time.MONTH_DAY;
22cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
23eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.content.Context;
2414711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkeyimport android.content.Intent;
254414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.content.pm.PackageManager;
264414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.content.pm.PackageManager.NameNotFoundException;
274414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.content.pm.Signature;
28d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkeyimport android.os.RemoteException;
29d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkeyimport android.os.UserHandle;
30cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkeyimport android.text.format.Time;
31d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
324414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport com.google.android.collect.Sets;
334414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
341b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkeyimport java.io.PrintWriter;
354414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport java.util.HashSet;
361b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
37d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey/**
38d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * Manager for creating and modifying network policy rules.
39d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey *
40d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey * {@hide}
41d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey */
42d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkeypublic class NetworkPolicyManager {
43d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
44d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    /** No specific network policy, use system default. */
45d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public static final int POLICY_NONE = 0x0;
46fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    /** Reject network usage on metered networks when application in background. */
47fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    public static final int POLICY_REJECT_METERED_BACKGROUND = 0x1;
48c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey
49c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    /** All network traffic should be allowed. */
50c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey    public static final int RULE_ALLOW_ALL = 0x0;
51fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    /** Reject traffic on metered networks. */
52fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey    public static final int RULE_REJECT_METERED = 0x1;
53d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
54b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey    private static final boolean ALLOW_PLATFORM_APP_POLICY = true;
55b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey
5614711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey    /**
5741ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey     * {@link Intent} extra that indicates which {@link NetworkTemplate} rule it
5841ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey     * applies to.
5914711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey     */
6041ff7ec82422a5b6d00892afdb3232bc0e53d851Jeff Sharkey    public static final String EXTRA_NETWORK_TEMPLATE = "android.net.NETWORK_TEMPLATE";
6114711eb5b6a45b587222ae71c57a381beb7b1a7eJeff Sharkey
62d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    private INetworkPolicyManager mService;
63d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
64d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    public NetworkPolicyManager(INetworkPolicyManager service) {
65d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        if (service == null) {
66d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            throw new IllegalArgumentException("missing INetworkPolicyManager");
67d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
68d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        mService = service;
69d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
70d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
718fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public static NetworkPolicyManager from(Context context) {
72eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        return (NetworkPolicyManager) context.getSystemService(Context.NETWORK_POLICY_SERVICE);
73eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    }
74eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
75d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    /**
76d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey     * Set policy flags for specific UID.
77d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey     *
78c006f1aec15454782c35e028ad64d79a5c161cc1Jeff Sharkey     * @param policy {@link #POLICY_NONE} or combination of flags like
79fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey     *            {@link #POLICY_REJECT_METERED_BACKGROUND}.
80d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey     */
81d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey    public void setUidPolicy(int uid, int policy) {
82d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        try {
83d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey            mService.setUidPolicy(uid, policy);
84d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        } catch (RemoteException e) {
85d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
86d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
87d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey
88d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey    public int getUidPolicy(int uid) {
89d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        try {
90d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey            return mService.getUidPolicy(uid);
91d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        } catch (RemoteException e) {
92d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey            return POLICY_NONE;
93d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey        }
94d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey    }
95cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
96d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey    public int[] getUidsWithPolicy(int policy) {
97854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey        try {
98d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey            return mService.getUidsWithPolicy(policy);
99854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey        } catch (RemoteException e) {
100854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey            return new int[0];
101854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey        }
102854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey    }
103854b2b1670bda1eeb87a14b7ac3d222024f0aad6Jeff Sharkey
1041a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    public void registerListener(INetworkPolicyListener listener) {
1051a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        try {
1061a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            mService.registerListener(listener);
1071a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        } catch (RemoteException e) {
1081a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        }
1091a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    }
1101a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
1111a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    public void unregisterListener(INetworkPolicyListener listener) {
1121a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        try {
1131a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey            mService.unregisterListener(listener);
1141a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        } catch (RemoteException e) {
1151a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey        }
1161a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey    }
1171a303953589fdddf21d88b8fa660136f5b060d0dJeff Sharkey
1188fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public void setNetworkPolicies(NetworkPolicy[] policies) {
1198fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        try {
1208fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            mService.setNetworkPolicies(policies);
1218fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        } catch (RemoteException e) {
1228fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1238fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    }
1248fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1258fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public NetworkPolicy[] getNetworkPolicies() {
1268fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        try {
1278fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            return mService.getNetworkPolicies();
1288fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        } catch (RemoteException e) {
1298fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            return null;
1308fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1318fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    }
1328fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1338fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public void setRestrictBackground(boolean restrictBackground) {
1348fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        try {
1358fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            mService.setRestrictBackground(restrictBackground);
1368fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        } catch (RemoteException e) {
1378fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1388fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    }
1398fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1408fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    public boolean getRestrictBackground() {
1418fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        try {
1428fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            return mService.getRestrictBackground();
1438fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        } catch (RemoteException e) {
1448fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            return false;
1458fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1468fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey    }
1478fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
148cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /**
149cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * Compute the last cycle boundary for the given {@link NetworkPolicy}. For
150cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * example, if cycle day is 20th, and today is June 15th, it will return May
151cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * 20th. When cycle day doesn't exist in current month, it snaps to the 1st
152cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * of following month.
153cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     *
154cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * @hide
155cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     */
156cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static long computeLastCycleBoundary(long currentTime, NetworkPolicy policy) {
1578fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        if (policy.cycleDay == CYCLE_NONE) {
1588fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
1598fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1608fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1619bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        final Time now = new Time(policy.cycleTimezone);
162cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        now.set(currentTime);
163cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
164cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        // first, find cycle boundary for current month
165cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time cycle = new Time(now);
166cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        cycle.hour = cycle.minute = cycle.second = 0;
167cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        snapToCycleDay(cycle, policy.cycleDay);
168cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
169cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (Time.compare(cycle, now) >= 0) {
170cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // cycle boundary is beyond now, use last cycle boundary; start by
171cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // pushing ourselves squarely into last month.
172cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            final Time lastMonth = new Time(now);
173cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.hour = lastMonth.minute = lastMonth.second = 0;
174cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.monthDay = 1;
175cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.month -= 1;
176cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            lastMonth.normalize(true);
177cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
178cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            cycle.set(lastMonth);
179cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            snapToCycleDay(cycle, policy.cycleDay);
180cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
181cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
182cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        return cycle.toMillis(true);
183cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
184cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
185cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /** {@hide} */
186cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static long computeNextCycleBoundary(long currentTime, NetworkPolicy policy) {
1878fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        if (policy.cycleDay == CYCLE_NONE) {
1888fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey            throw new IllegalArgumentException("Unable to compute boundary without cycleDay");
1898fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey        }
1908fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey
1919bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey        final Time now = new Time(policy.cycleTimezone);
192cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        now.set(currentTime);
193cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
194cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        // first, find cycle boundary for current month
195cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        final Time cycle = new Time(now);
196cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        cycle.hour = cycle.minute = cycle.second = 0;
197cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        snapToCycleDay(cycle, policy.cycleDay);
198cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
199cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (Time.compare(cycle, now) <= 0) {
200cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // cycle boundary is before now, use next cycle boundary; start by
201cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            // pushing ourselves squarely into next month.
202cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            final Time nextMonth = new Time(now);
203cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.hour = nextMonth.minute = nextMonth.second = 0;
204cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.monthDay = 1;
205cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.month += 1;
206cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            nextMonth.normalize(true);
207cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
208cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            cycle.set(nextMonth);
209cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            snapToCycleDay(cycle, policy.cycleDay);
210cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
211cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
212cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        return cycle.toMillis(true);
213cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
214cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
215cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    /**
216cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * Snap to the cycle day for the current month given; when cycle day doesn't
2179bf3150cfae03421c9dd237b46657714859d871cJeff Sharkey     * exist, it snaps to last second of current month.
218cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     *
219cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     * @hide
220cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey     */
221cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    public static void snapToCycleDay(Time time, int cycleDay) {
222cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        if (cycleDay > time.getActualMaximum(MONTH_DAY)) {
223af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey            // cycle day isn't valid this month; snap to last second of month
224cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.month += 1;
225cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.monthDay = 1;
226af82ea2abf53b6825fbbce23434419527d8e8b5cJeff Sharkey            time.second = -1;
227cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        } else {
228cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey            time.monthDay = cycleDay;
229cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        }
230cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey        time.normalize(true);
231cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey    }
232cd2ca4038a027315832c38c68be5076000bc4b53Jeff Sharkey
233497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    /**
234497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     * Check if given UID can have a {@link #setUidPolicy(int, int)} defined,
235497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     * usually to protect critical system services.
236497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey     */
2378a8b581e669f6187b397f856a567a76ed8aba2c2Jeff Sharkey    @Deprecated
238497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    public static boolean isUidValidForPolicy(Context context, int uid) {
2394414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey        // first, quick-reject non-applications
240d0c6ccbafdebc73d03cf3cd47f02f9f6c78a69ffJeff Sharkey        if (!UserHandle.isApp(uid)) {
2414414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey            return false;
2424414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey        }
2434414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
244b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey        if (!ALLOW_PLATFORM_APP_POLICY) {
245b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            final PackageManager pm = context.getPackageManager();
246b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            final HashSet<Signature> systemSignature;
247b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            try {
248b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                systemSignature = Sets.newHashSet(
249b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                        pm.getPackageInfo("android", GET_SIGNATURES).signatures);
250b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            } catch (NameNotFoundException e) {
251b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                throw new RuntimeException("problem finding system signature", e);
252b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            }
2534414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
254b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            try {
255b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                // reject apps signed with platform cert
256b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                for (String packageName : pm.getPackagesForUid(uid)) {
257b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                    final HashSet<Signature> packageSignature = Sets.newHashSet(
258b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                            pm.getPackageInfo(packageName, GET_SIGNATURES).signatures);
259b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                    if (packageSignature.containsAll(systemSignature)) {
260b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                        return false;
261b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey                    }
2624414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey                }
263b3f19ca36c8c1301893c621d8f2150e06210722cJeff Sharkey            } catch (NameNotFoundException e) {
2644414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey            }
2654414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey        }
2664414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
2674414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey        // nothing found above; we can apply policy to UID
2684414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey        return true;
269497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey    }
270497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey
2711b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    /** {@hide} */
2721b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    public static void dumpPolicy(PrintWriter fout, int policy) {
2731b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("[");
274fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey        if ((policy & POLICY_REJECT_METERED_BACKGROUND) != 0) {
275fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey            fout.write("REJECT_METERED_BACKGROUND");
2761b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        }
2771b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("]");
2781b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    }
2791b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
2801b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    /** {@hide} */
2811b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    public static void dumpRules(PrintWriter fout, int rules) {
2821b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("[");
283fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey        if ((rules & RULE_REJECT_METERED) != 0) {
284fdfef57f498e3021a34342538aef9f1c7ccbae78Jeff Sharkey            fout.write("REJECT_METERED");
2851b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        }
2861b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey        fout.write("]");
2871b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey    }
2881b861278a2051f53ce7955fb7992fa536dc975d9Jeff Sharkey
289d5cdd597b895a48ffa9a8e39f8a2504cd9b905c4Jeff Sharkey}
290