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