AppOpsManager.java revision f5d831915dd11e77cdcf5669228c55fe17a21c5e
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 19e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackbornimport android.os.Binder; 20e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackbornimport android.os.IBinder; 213e82ba1a67b0c756ab6a289985f4cfc53725b311Dianne Hackbornimport android.util.ArrayMap; 22a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService; 23c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackbornimport com.android.internal.app.IAppOpsCallback; 24a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.ArrayList; 2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List; 2735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 28a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 2935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel; 3035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable; 31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process; 32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException; 33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 34d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn/** 35d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * API for interacting with "application operation" tracking. Allows you to: 36d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 371304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <ul> 381304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Note when operations are happening, and find out if they are allowed for the current 391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * caller.</li> 401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Disallow specific apps from doing specific operations.</li> 411304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Collect all of the current information about operations that have been executed or are not 421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * being allowed.</li> 431304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Monitor for changes in whether an operation is allowed.</li> 441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * </ul> 45d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <p>Each operation is identified by a single integer; these integers are a fixed set of 47d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * operations, enumerated by the OP_* constants. 48d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <p></p>When checking operations, the result is a "mode" integer indicating the current setting 50d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute the operation but 51d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * fake its behavior enough so that the caller doesn't crash), MODE_ERRORED (through a 52d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * SecurityException back to the caller; the normal operation calls will do this for you). 53d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 54a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager { 55a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final Context mContext; 56a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final IAppOpsService mService; 573e82ba1a67b0c756ab6a289985f4cfc53725b311Dianne Hackborn final ArrayMap<Callback, IAppOpsCallback> mModeWatchers 583e82ba1a67b0c756ab6a289985f4cfc53725b311Dianne Hackborn = new ArrayMap<Callback, IAppOpsCallback>(); 59a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 60e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn static IBinder sToken; 61e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn 62a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ALLOWED = 0; 63a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_IGNORED = 1; 64a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ERRORED = 2; 65a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 66fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // when adding one of these: 67fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - increment _NUM_OP 68f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun // - add rows to sOpToSwitch, sOpNames, sOpPerms, sOpDefaultMode 69fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - add descriptive strings to Settings/res/values/arrays.xml 700b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie // - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app) 711304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn 721304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** No operation specified. */ 73f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_NONE = -1; 741304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** Access to coarse location information. */ 7535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_COARSE_LOCATION = 0; 761304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** Access to fine location information. */ 7735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_FINE_LOCATION = 1; 781304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** Causing GPS to run. */ 7935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_GPS = 2; 801304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 8135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_VIBRATE = 3; 821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 8335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CONTACTS = 4; 841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 8535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CONTACTS = 5; 861304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 8735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CALL_LOG = 6; 881304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 8935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CALL_LOG = 7; 901304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_READ_CALENDAR = 8; 921304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WRITE_CALENDAR = 9; 941304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 955e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WIFI_SCAN = 10; 961304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 974a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler public static final int OP_POST_NOTIFICATION = 11; 981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 99f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_NEIGHBORING_CELLS = 12; 1001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 101f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_CALL_PHONE = 13; 1021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 103f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_SMS = 14; 1041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 105f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_SMS = 15; 1061304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 107f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_SMS = 16; 1081304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 109f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_EMERGECY_SMS = 17; 1101304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 111f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_MMS = 18; 1121304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 113f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_WAP_PUSH = 19; 1141304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 115f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_SEND_SMS = 20; 1161304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 117f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_ICC_SMS = 21; 1181304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 119f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_ICC_SMS = 22; 1201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 121961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn public static final int OP_WRITE_SETTINGS = 23; 1221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 123c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public static final int OP_SYSTEM_ALERT_WINDOW = 24; 1241304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 125fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler public static final int OP_ACCESS_NOTIFICATIONS = 25; 1261304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 127d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_CAMERA = 26; 1281304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 129d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_RECORD_AUDIO = 27; 1301304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 131d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_PLAY_AUDIO = 28; 1321304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 133efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_READ_CLIPBOARD = 29; 1341304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 135efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_WRITE_CLIPBOARD = 30; 1361304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 137ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_MEDIA_BUTTONS = 31; 1381304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 139ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_AUDIO_FOCUS = 32; 1401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 141ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MASTER_VOLUME = 33; 1421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 143ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_VOICE_VOLUME = 34; 1441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 145ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_RING_VOLUME = 35; 1461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 147ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MEDIA_VOLUME = 36; 1481304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 149ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_ALARM_VOLUME = 37; 1501304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 151ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38; 1521304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 153ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39; 1541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 155713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public static final int OP_WAKE_LOCK = 40; 1561304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** Continually monitoring location data. */ 1571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn public static final int OP_MONITOR_LOCATION = 41; 1580b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie /** Continually monitoring location data with a relatively high power request. */ 1590b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42; 160f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** @hide */ 1610b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie public static final int _NUM_OP = 43; 162f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 163f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 164f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This maps each operation to the operation that serves as the 165f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * switch to determine whether it is allowed. Generally this is 166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * a 1:1 mapping, but for some things (like location) that have 167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * multiple low-level operations being tracked that should be 1680b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie * presented to the user as one switch then this can be used to 169f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * make them all controlled by the same single operation. 170f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 171f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn private static int[] sOpToSwitch = new int[] { 172f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 173f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 174f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 175f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_VIBRATE, 176f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CONTACTS, 177f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CONTACTS, 178f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALL_LOG, 179f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALL_LOG, 180f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALENDAR, 181f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALENDAR, 182f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 183f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_POST_NOTIFICATION, 184f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 185f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_CALL_PHONE, 186f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 187f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 18818966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 18918966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 19018966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 19118966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 19218966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_SEND_SMS, 193f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 194f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 195961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn OP_WRITE_SETTINGS, 196c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn OP_SYSTEM_ALERT_WINDOW, 197fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler OP_ACCESS_NOTIFICATIONS, 198d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_CAMERA, 199d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_RECORD_AUDIO, 200d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_PLAY_AUDIO, 201efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_READ_CLIPBOARD, 202efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_WRITE_CLIPBOARD, 203ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_MEDIA_BUTTONS, 204ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_AUDIO_FOCUS, 205ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MASTER_VOLUME, 206ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_VOICE_VOLUME, 207ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_RING_VOLUME, 208ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MEDIA_VOLUME, 209ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_ALARM_VOLUME, 210ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_NOTIFICATION_VOLUME, 211ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_BLUETOOTH_VOLUME, 212713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn OP_WAKE_LOCK, 2131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn OP_COARSE_LOCATION, 2140b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie OP_COARSE_LOCATION, 215f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn }; 2165e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 217f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 218f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This provides a simple name for each operation to be used 219f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * in debug output. 220f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 2215e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpNames = new String[] { 222f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "COARSE_LOCATION", 223f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "FINE_LOCATION", 224f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "GPS", 225f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "VIBRATE", 226f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CONTACTS", 227f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CONTACTS", 228f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALL_LOG", 229f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALL_LOG", 230f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALENDAR", 231f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALENDAR", 232f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WIFI_SCAN", 233f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "POST_NOTIFICATION", 234f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "NEIGHBORING_CELLS", 235f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "CALL_PHONE", 236f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_SMS", 237f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_SMS", 238f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_SMS", 239f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_EMERGECY_SMS", 240f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_MMS", 241f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_WAP_PUSH", 242f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "SEND_SMS", 243f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_ICC_SMS", 244f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_ICC_SMS", 245961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn "WRITE_SETTINGS", 246c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn "SYSTEM_ALERT_WINDOW", 247fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler "ACCESS_NOTIFICATIONS", 248d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "CAMERA", 249d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "RECORD_AUDIO", 250d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "PLAY_AUDIO", 251efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "READ_CLIPBOARD", 252efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "WRITE_CLIPBOARD", 253ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_MEDIA_BUTTONS", 254ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_AUDIO_FOCUS", 255ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MASTER_VOLUME", 256ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_VOICE_VOLUME", 257ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_RING_VOLUME", 258ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MEDIA_VOLUME", 259ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_ALARM_VOLUME", 260ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_NOTIFICATION_VOLUME", 261ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_BLUETOOTH_VOLUME", 262713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn "WAKE_LOCK", 2631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn "MONITOR_LOCATION", 2640b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie "MONITOR_HIGH_POWER_LOCATION", 2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 2665e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 267f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 268f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This optionally maps a permission to an operation. If there 269f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * is no permission associated with an operation, it is null. 270f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 2715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpPerms = new String[] { 272f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_COARSE_LOCATION, 273f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_FINE_LOCATION, 274f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, 275f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.VIBRATE, 276f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CONTACTS, 277f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CONTACTS, 278f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALL_LOG, 279f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALL_LOG, 280f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALENDAR, 281f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALENDAR, 282f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // no permission required for notifications 283f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_WIFI_STATE, 284f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // neighboring cells shares the coarse location perm 285f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.CALL_PHONE, 286f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 287f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 288f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_SMS, 289f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST, 290f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_MMS, 291f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_WAP_PUSH, 292f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.SEND_SMS, 293f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 294f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 295961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn android.Manifest.permission.WRITE_SETTINGS, 296c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn android.Manifest.permission.SYSTEM_ALERT_WINDOW, 297fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler android.Manifest.permission.ACCESS_NOTIFICATIONS, 298d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.CAMERA, 299d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.RECORD_AUDIO, 300d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn null, // no permission for playing audio 301efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for reading clipboard 302efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for writing clipboard 303ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking media buttons 304ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking audio focus 305ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing master volume 306ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing voice volume 307ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing ring volume 308ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing media volume 309ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing alarm volume 310ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing notification volume 311ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing bluetooth volume 312713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn android.Manifest.permission.WAKE_LOCK, 3131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn null, // no permission for generic location monitoring 3140b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie null, // no permission for high power location monitoring 3155e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 3165e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 317d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 318f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * This specifies the default mode for each operation. 319f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun */ 320f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun private static int[] sOpDefaultMode = new int[] { 321f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 322f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 323f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 324f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 325f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 326f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 327f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 328f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 329f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 330f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 331f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 332f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 333f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 334f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 335f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 336f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_IGNORED, // OP_WRITE_SMS 337f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 338f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 339f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 340f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 341f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 342f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 343f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 344f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 345f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 346f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 347f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 348f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 349f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 350f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 351f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 352f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 353f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 354f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 355f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 356f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 357f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 358f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 359f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 360f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 361f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 362f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 363f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 364f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun }; 365f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun 366f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun /** 367d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the op switch that controls the given operation. 3681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 369d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 370f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static int opToSwitch(int op) { 371f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn return sOpToSwitch[op]; 372f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 373f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 374d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 375d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve a non-localized name for the operation, for debugging output. 376d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 3775e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToName(int op) { 378c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (op == OP_NONE) return "NONE"; 3795e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")"); 3805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 381a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 382d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 383d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the permission associated with an operation, or null if there is not one. 3841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 385d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 3865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToPermission(int op) { 3875e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return sOpPerms[op]; 388a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 389a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 390d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 391f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * Retrieve the default mode for the operation. 392f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * @hide 393f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun */ 394f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun public static int opToDefaultMode(int op) { 395f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun return sOpDefaultMode[op]; 396f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun } 397f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun 398f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun /** 399d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding all of the operation information associated with an app. 4001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 401d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 40235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class PackageOps implements Parcelable { 40335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final String mPackageName; 40435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mUid; 40535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final List<OpEntry> mEntries; 40635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 40735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public PackageOps(String packageName, int uid, List<OpEntry> entries) { 40835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = packageName; 40935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = uid; 41035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = entries; 41135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 41235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 41335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public String getPackageName() { 41435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mPackageName; 41535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 41635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 41735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getUid() { 41835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mUid; 41935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 42035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 42135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<OpEntry> getOps() { 42235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mEntries; 42335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 42435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 42535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 42635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 42735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 42835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 42935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 43035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 43135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 43235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeString(mPackageName); 43335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mUid); 43435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mEntries.size()); 43535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<mEntries.size(); i++) { 43635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.get(i).writeToParcel(dest, flags); 43735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 43835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 43935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 44035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn PackageOps(Parcel source) { 44135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = source.readString(); 44235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = source.readInt(); 44335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = new ArrayList<OpEntry>(); 44435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn final int N = source.readInt(); 44535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<N; i++) { 44635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.add(OpEntry.CREATOR.createFromParcel(source)); 44735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 44835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 44935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 45035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() { 45135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps createFromParcel(Parcel source) { 45235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps(source); 45335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 45435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 45535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps[] newArray(int size) { 45635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps[size]; 45735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 45835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 45935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 46035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 461d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 462d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding the information about one unique operation of an application. 4631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 464d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 46535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class OpEntry implements Parcelable { 46635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mOp; 4675e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final int mMode; 46835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final long mTime; 4695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final long mRejectTime; 47035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mDuration; 47135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 4725e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public OpEntry(int op, int mode, long time, long rejectTime, int duration) { 47335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = op; 4745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = mode; 47535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = time; 4765e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = rejectTime; 47735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = duration; 47835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 47935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 48035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getOp() { 48135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mOp; 48235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 48335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 4845e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public int getMode() { 4855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mMode; 4865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 4875e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 48835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public long getTime() { 48935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mTime; 49035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 49135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 4925e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public long getRejectTime() { 4935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mRejectTime; 4945e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 4955e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 49635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public boolean isRunning() { 49735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1; 49835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 49935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 50035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getDuration() { 50135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; 50235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 50335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 50435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 50535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 50635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 50735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 50835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 50935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 51035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 51135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mOp); 5125e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeInt(mMode); 51335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeLong(mTime); 5145e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeLong(mRejectTime); 51535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mDuration); 51635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 51735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 51835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn OpEntry(Parcel source) { 51935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = source.readInt(); 5205e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = source.readInt(); 52135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = source.readLong(); 5225e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = source.readLong(); 52335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = source.readInt(); 52435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 52535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 52635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() { 52735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry createFromParcel(Parcel source) { 52835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry(source); 52935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 53035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 53135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry[] newArray(int size) { 53235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry[size]; 53335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 53435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 53535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 53635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 537d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 538d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Callback for notification of changes to operation state. 539d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 540c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public interface Callback { 541c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void opChanged(int op, String packageName); 542c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 543c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 5441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn AppOpsManager(Context context, IAppOpsService service) { 545a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mContext = context; 546a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = service; 547a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 548a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 549d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 550d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for all applications. 551d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 552d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 5531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 554d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 55535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) { 55635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 55735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.getPackagesForOps(ops); 55835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 55935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 56035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return null; 56135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 56235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 563d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 564d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for one application. 565d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 566d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param uid The uid of the application of interest. 567d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param packageName The name of the application of interest. 568d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 5691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 570d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 57172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) { 57272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn try { 57372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return mService.getOpsForPackage(uid, packageName, ops); 57472e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } catch (RemoteException e) { 57572e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 57672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return null; 57772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 57872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn 5791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 5805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public void setMode(int code, int uid, String packageName, int mode) { 5815e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn try { 5825e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mService.setMode(code, uid, packageName, mode); 5835e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } catch (RemoteException e) { 5845e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 5855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 5865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 587607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn /** @hide */ 588607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn public void resetAllModes() { 589607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn try { 590607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn mService.resetAllModes(); 591607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } catch (RemoteException e) { 592607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } 593607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } 594607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn 5951304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 5961304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Monitor for changes to the operating mode for the given op in the given app package. 5971304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to monitor, one of OP_*. 5981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application to monitor. 5991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param callback Where to report changes. 6001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 601c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void startWatchingMode(int op, String packageName, final Callback callback) { 602c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 603c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 604c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb == null) { 605c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn cb = new IAppOpsCallback.Stub() { 606c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void opChanged(int op, String packageName) { 607c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn callback.opChanged(op, packageName); 608c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 609c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn }; 610c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mModeWatchers.put(callback, cb); 611c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 612c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 613c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.startWatchingMode(op, packageName, cb); 614c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 615c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 616c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 617c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 618c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 6191304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 6201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Stop monitoring that was previously started with {@link #startWatchingMode}. All 6211304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * monitoring associated with this callback will be removed. 6221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 623c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void stopWatchingMode(Callback callback) { 624c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 625c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 626c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb != null) { 627c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 628c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.stopWatchingMode(cb); 629c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 630c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 631c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 632c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 633c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 634c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 63595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn private String buildSecurityExceptionMsg(int op, int uid, String packageName) { 63695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op]; 63795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } 63895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn 6391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 6401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Do a quick check for whether an application might be able to perform an operation. 6411304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)} 6421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * or {@link #startOp(int, int, String)} for your actual security checks, which also 6431304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * ensure that the given uid and package name are consistent. This function can just be 6441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * used for a quick check to see if an operation has been disabled for the application, 6451304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * as an early reject of some work. This does not modify the time stamp or other data 6461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * about the operation. 6471304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to check. One of the OP_* constants. 6481304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 6491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 6501304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 6511304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 6521304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 6531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 6541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 65535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOp(int op, int uid, String packageName) { 65635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 65735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn int mode = mService.checkOperation(op, uid, packageName); 65835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn if (mode == MODE_ERRORED) { 65995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 66035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 66135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mode; 66235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 66335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 66435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 66535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 66635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 6671304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 6681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it 6691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 6701304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 67135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOpNoThrow(int op, int uid, String packageName) { 67235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 67335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.checkOperation(op, uid, packageName); 67435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 67535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 67635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 67735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 67835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 6791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 680911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * Do a quick check to validate if a package name belongs to a UID. 681911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * 682911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * @throws SecurityException if the package name doesn't belong to the given 683911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * UID, or if ownership cannot be verified. 684911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey */ 685911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey public void checkPackage(int uid, String packageName) { 686911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey try { 687911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) { 688911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey throw new SecurityException( 689911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey "Package " + packageName + " does not belong to " + uid); 690911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 691911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } catch (RemoteException e) { 692911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey throw new SecurityException("Unable to verify package ownership", e); 693911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 694911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 695911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey 696911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey /** 6971304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Make note of an application performing an operation. Note that you must pass 6981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * in both the uid and name of the application to be checked; this function will verify 6991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * that these two match, and if not, return {@link #MODE_IGNORED}. If this call 7001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 7011304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * the current time. 7021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to note. One of the OP_* constants. 7031304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 7041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 7051304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 7061304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 7071304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 7081304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 7091304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 710a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op, int uid, String packageName) { 711a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 712a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.noteOperation(op, uid, packageName); 713a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 71495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 715a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 716a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 717a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 718a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 719a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 720a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 721a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 7221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 7231304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it 7241304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 7251304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 726a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOpNoThrow(int op, int uid, String packageName) { 727a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 728a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.noteOperation(op, uid, packageName); 729a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 730a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 731a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 732a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 733a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 7341304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 735a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op) { 73695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return noteOp(op, Process.myUid(), mContext.getOpPackageName()); 737a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 738a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 739e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn /** @hide */ 740e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn public static IBinder getToken(IAppOpsService service) { 741e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn synchronized (AppOpsManager.class) { 742e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn if (sToken != null) { 743e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return sToken; 744e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 745e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn try { 746e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn sToken = service.getToken(new Binder()); 747e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } catch (RemoteException e) { 748e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn // System is dead, whatevs. 749e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 750e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return sToken; 751e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 752e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 753e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn 7541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 7551304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Report that an application has started executing a long-running operation. Note that you 7561304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * must pass in both the uid and name of the application to be checked; this function will 7571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * verify that these two match, and if not, return {@link #MODE_IGNORED}. If this call 7581304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 7591304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * the current time and the operation will be marked as "running". In this case you must 7601304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * later call {@link #finishOp(int, int, String)} to report when the application is no 7611304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * longer performing the operation. 7621304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to start. One of the OP_* constants. 7631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 7641304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 7651304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 7661304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 7671304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 7681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 7691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 770a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op, int uid, String packageName) { 771a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 772e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn int mode = mService.startOperation(getToken(mService), op, uid, packageName); 773a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 77495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 775a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 776a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 777a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 778a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 779a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 780a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 781a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 7821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 7831304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #startOp} but instead of throwing a {@link SecurityException} it 7841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 7851304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 786a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOpNoThrow(int op, int uid, String packageName) { 787a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 788e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return mService.startOperation(getToken(mService), op, uid, packageName); 789a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 790a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 791a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 792a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 793a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 7941304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 795a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op) { 79695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return startOp(op, Process.myUid(), mContext.getOpPackageName()); 797a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 798a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 7991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 8001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Report that an application is no longer performing an operation that had previously 8011304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * been started with {@link #startOp(int, int, String)}. There is no validation of input 8021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * or result; the parameters supplied here must be the exact same ones previously passed 8031304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * in when starting the operation. 8041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 805a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op, int uid, String packageName) { 806a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 807e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mService.finishOperation(getToken(mService), op, uid, packageName); 808a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 809a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 810a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 811a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 812a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op) { 81395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn finishOp(op, Process.myUid(), mContext.getOpPackageName()); 814a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 815a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn} 816