AppOpsManager.java revision 961321fe4ed4431a6362d729d9e4ea26bdecde61
1a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn/* 2a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * Copyright (C) 2012 The Android Open Source Project 3a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * 4a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * you may not use this file except in compliance with the License. 6a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * You may obtain a copy of the License at 7a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * 8a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * 10a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * See the License for the specific language governing permissions and 14a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn * limitations under the License. 15a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn */ 16a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 17a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpackage android.app; 18a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 19f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackbornimport android.Manifest; 20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService; 21a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.ArrayList; 2335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List; 2435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 25a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel; 2735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable; 28a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process; 29a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException; 30a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn/** @hide */ 32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager { 33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final Context mContext; 34a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final IAppOpsService mService; 35a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 36a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ALLOWED = 0; 37a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_IGNORED = 1; 38a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ERRORED = 2; 39a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 40f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_NONE = -1; 4135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_COARSE_LOCATION = 0; 4235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_FINE_LOCATION = 1; 4335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_GPS = 2; 4435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_VIBRATE = 3; 4535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CONTACTS = 4; 4635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CONTACTS = 5; 4735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CALL_LOG = 6; 4835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CALL_LOG = 7; 495e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_READ_CALENDAR = 8; 505e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WRITE_CALENDAR = 9; 515e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WIFI_SCAN = 10; 524a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler public static final int OP_POST_NOTIFICATION = 11; 53f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_NEIGHBORING_CELLS = 12; 54f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_CALL_PHONE = 13; 55f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_SMS = 14; 56f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_SMS = 15; 57f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_SMS = 16; 58f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_EMERGECY_SMS = 17; 59f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_MMS = 18; 60f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_WAP_PUSH = 19; 61f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_SEND_SMS = 20; 62f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_ICC_SMS = 21; 63f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_ICC_SMS = 22; 64961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn public static final int OP_WRITE_SETTINGS = 23; 65f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** @hide */ 66961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn public static final int _NUM_OP = 24; 67f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 68f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 69f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This maps each operation to the operation that serves as the 70f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * switch to determine whether it is allowed. Generally this is 71f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * a 1:1 mapping, but for some things (like location) that have 72f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * multiple low-level operations being tracked that should be 73f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * presented to hte user as one switch then this can be used to 74f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * make them all controlled by the same single operation. 75f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 76f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn private static int[] sOpToSwitch = new int[] { 77f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 78f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 79f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 80f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_VIBRATE, 81f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CONTACTS, 82f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CONTACTS, 83f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALL_LOG, 84f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALL_LOG, 85f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALENDAR, 86f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALENDAR, 87f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 88f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_POST_NOTIFICATION, 89f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 90f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_CALL_PHONE, 91f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 92f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 93f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 94f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 95f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 96f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 97f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 98f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 99f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 100961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn OP_WRITE_SETTINGS, 101f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn }; 1025e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 103f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 104f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This provides a simple name for each operation to be used 105f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * in debug output. 106f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 1075e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpNames = new String[] { 108f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "COARSE_LOCATION", 109f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "FINE_LOCATION", 110f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "GPS", 111f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "VIBRATE", 112f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CONTACTS", 113f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CONTACTS", 114f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALL_LOG", 115f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALL_LOG", 116f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALENDAR", 117f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALENDAR", 118f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WIFI_SCAN", 119f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "POST_NOTIFICATION", 120f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "NEIGHBORING_CELLS", 121f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "CALL_PHONE", 122f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_SMS", 123f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_SMS", 124f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_SMS", 125f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_EMERGECY_SMS", 126f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_MMS", 127f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_WAP_PUSH", 128f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "SEND_SMS", 129f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_ICC_SMS", 130f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_ICC_SMS", 131961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn "WRITE_SETTINGS", 1325e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 1335e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 134f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 135f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This optionally maps a permission to an operation. If there 136f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * is no permission associated with an operation, it is null. 137f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 1385e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpPerms = new String[] { 139f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_COARSE_LOCATION, 140f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_FINE_LOCATION, 141f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, 142f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.VIBRATE, 143f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CONTACTS, 144f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CONTACTS, 145f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALL_LOG, 146f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALL_LOG, 147f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALENDAR, 148f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALENDAR, 149f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // no permission required for notifications 150f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_WIFI_STATE, 151f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // neighboring cells shares the coarse location perm 152f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.CALL_PHONE, 153f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 154f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 155f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_SMS, 156f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST, 157f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_MMS, 158f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_WAP_PUSH, 159f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.SEND_SMS, 160f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 161f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 162961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn android.Manifest.permission.WRITE_SETTINGS, 1635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 1645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 165f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static int opToSwitch(int op) { 166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn return sOpToSwitch[op]; 167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 168f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 1695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToName(int op) { 1705e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")"); 1715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 172a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 1735e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToPermission(int op) { 1745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return sOpPerms[op]; 175a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 176a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 17735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class PackageOps implements Parcelable { 17835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final String mPackageName; 17935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mUid; 18035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final List<OpEntry> mEntries; 18135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 18235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public PackageOps(String packageName, int uid, List<OpEntry> entries) { 18335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = packageName; 18435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = uid; 18535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = entries; 18635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 18735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 18835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public String getPackageName() { 18935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mPackageName; 19035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 19135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 19235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getUid() { 19335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mUid; 19435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 19535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 19635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<OpEntry> getOps() { 19735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mEntries; 19835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 19935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 20035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 20135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 20235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 20335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 20435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 20535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 20635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 20735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeString(mPackageName); 20835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mUid); 20935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mEntries.size()); 21035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<mEntries.size(); i++) { 21135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.get(i).writeToParcel(dest, flags); 21235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 21335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 21435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 21535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn PackageOps(Parcel source) { 21635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = source.readString(); 21735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = source.readInt(); 21835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = new ArrayList<OpEntry>(); 21935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn final int N = source.readInt(); 22035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<N; i++) { 22135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.add(OpEntry.CREATOR.createFromParcel(source)); 22235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 22335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 22435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 22535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() { 22635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps createFromParcel(Parcel source) { 22735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps(source); 22835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 22935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 23035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps[] newArray(int size) { 23135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps[size]; 23235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 23335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 23435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 23535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 23635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class OpEntry implements Parcelable { 23735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mOp; 2385e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final int mMode; 23935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final long mTime; 2405e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final long mRejectTime; 24135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mDuration; 24235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 2435e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public OpEntry(int op, int mode, long time, long rejectTime, int duration) { 24435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = op; 2455e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = mode; 24635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = time; 2475e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = rejectTime; 24835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = duration; 24935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 25035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 25135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getOp() { 25235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mOp; 25335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 25435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 2555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public int getMode() { 2565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mMode; 2575e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 2585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 25935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public long getTime() { 26035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mTime; 26135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 26235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 2635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public long getRejectTime() { 2645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mRejectTime; 2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 2665e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 26735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public boolean isRunning() { 26835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1; 26935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 27035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 27135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getDuration() { 27235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; 27335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 27435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 27535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 27635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 27735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 27835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 27935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 28035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 28135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 28235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mOp); 2835e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeInt(mMode); 28435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeLong(mTime); 2855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeLong(mRejectTime); 28635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mDuration); 28735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 28835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 28935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn OpEntry(Parcel source) { 29035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = source.readInt(); 2915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = source.readInt(); 29235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = source.readLong(); 2935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = source.readLong(); 29435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = source.readInt(); 29535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 29635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 29735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() { 29835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry createFromParcel(Parcel source) { 29935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry(source); 30035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 30135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 30235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry[] newArray(int size) { 30335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry[size]; 30435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 30535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 30635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 30735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 308a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public AppOpsManager(Context context, IAppOpsService service) { 309a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mContext = context; 310a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = service; 311a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 312a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 31335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) { 31435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 31535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.getPackagesForOps(ops); 31635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 31735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 31835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return null; 31935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 32035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 32172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) { 32272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn try { 32372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return mService.getOpsForPackage(uid, packageName, ops); 32472e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } catch (RemoteException e) { 32572e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 32672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return null; 32772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 32872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn 3295e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public void setMode(int code, int uid, String packageName, int mode) { 3305e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn try { 3315e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mService.setMode(code, uid, packageName, mode); 3325e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } catch (RemoteException e) { 3335e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 3345e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 3355e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 33635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOp(int op, int uid, String packageName) { 33735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 33835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn int mode = mService.checkOperation(op, uid, packageName); 33935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn if (mode == MODE_ERRORED) { 34035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn throw new SecurityException("Operation not allowed"); 34135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 34235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mode; 34335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 34435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 34535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 34635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 34735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 34835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOpNoThrow(int op, int uid, String packageName) { 34935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 35035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.checkOperation(op, uid, packageName); 35135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 35235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 35335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 35435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 35535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 356a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op, int uid, String packageName) { 357a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 358a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.noteOperation(op, uid, packageName); 359a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 360a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn throw new SecurityException("Operation not allowed"); 361a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 362a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 363a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 364a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 365a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 366a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 367a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 368a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOpNoThrow(int op, int uid, String packageName) { 369a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 370a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.noteOperation(op, uid, packageName); 371a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 372a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 373a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 374a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 375a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 376a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op) { 377d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return noteOp(op, Process.myUid(), mContext.getBasePackageName()); 378a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 379a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 380a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op, int uid, String packageName) { 381a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 382a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.startOperation(op, uid, packageName); 383a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 384a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn throw new SecurityException("Operation not allowed"); 385a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 386a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 387a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 388a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 389a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 390a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 391a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 392a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOpNoThrow(int op, int uid, String packageName) { 393a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 394a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.startOperation(op, uid, packageName); 395a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 396a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 397a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 398a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 399a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 400a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op) { 401d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return startOp(op, Process.myUid(), mContext.getBasePackageName()); 402a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 403a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 404a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op, int uid, String packageName) { 405a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 406a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService.finishOperation(op, uid, packageName); 407a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 408a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 409a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 410a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 411a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op) { 412d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn finishOp(op, Process.myUid(), mContext.getBasePackageName()); 413a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 414a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn} 415