AppOpsManager.java revision ba50b97cff80e73620a0e3d13cae169e095974a7
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 19d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackbornimport android.Manifest; 20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService; 21c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackbornimport com.android.internal.app.IAppOpsCallback; 22a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 2335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.ArrayList; 24c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackbornimport java.util.HashMap; 2535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List; 2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 27a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 2835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel; 2935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable; 30a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process; 31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException; 32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 33d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn/** 34d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * API for interacting with "application operation" tracking. Allows you to: 35d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 36d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Note when operations are happening, and find out if they are allowed for the current caller. 37d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Disallow specific apps from doing specific operations. 38d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Collect all of the current information about operations that have been executed or are not 39d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * being allowed. 40d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Monitor for changes in whether an operation is allowed. 41d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 42d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Each operation is identified by a single integer; these integers are a fixed set of 43d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * operations, enumerated by the OP_* constants. 44d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 45d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * When checking operations, the result is a "mode" integer indicating the current setting 46d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute the operation but 47d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * fake its behavior enough so that the caller doesn't crash), MODE_ERRORED (through a 48d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * SecurityException back to the caller; the normal operation calls will do this for you). 49d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 50d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @hide 51d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 52a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager { 53a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final Context mContext; 54a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final IAppOpsService mService; 55c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn final HashMap<Callback, IAppOpsCallback> mModeWatchers 56c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn = new HashMap<Callback, IAppOpsCallback>(); 57a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 58a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ALLOWED = 0; 59a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_IGNORED = 1; 60a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ERRORED = 2; 61a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 62fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // when adding one of these: 63fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - increment _NUM_OP 64fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - add rows to sOpToSwitch, sOpNames, sOpPerms 65fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - add descriptive strings to Settings/res/values/arrays.xml 66f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_NONE = -1; 6735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_COARSE_LOCATION = 0; 6835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_FINE_LOCATION = 1; 6935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_GPS = 2; 7035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_VIBRATE = 3; 7135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CONTACTS = 4; 7235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CONTACTS = 5; 7335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CALL_LOG = 6; 7435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CALL_LOG = 7; 755e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_READ_CALENDAR = 8; 765e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WRITE_CALENDAR = 9; 775e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WIFI_SCAN = 10; 784a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler public static final int OP_POST_NOTIFICATION = 11; 79f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_NEIGHBORING_CELLS = 12; 80f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_CALL_PHONE = 13; 81f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_SMS = 14; 82f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_SMS = 15; 83f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_SMS = 16; 84f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_EMERGECY_SMS = 17; 85f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_MMS = 18; 86f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_WAP_PUSH = 19; 87f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_SEND_SMS = 20; 88f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_ICC_SMS = 21; 89f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_ICC_SMS = 22; 90961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn public static final int OP_WRITE_SETTINGS = 23; 91c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public static final int OP_SYSTEM_ALERT_WINDOW = 24; 92fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler public static final int OP_ACCESS_NOTIFICATIONS = 25; 93d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_CAMERA = 26; 94d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_RECORD_AUDIO = 27; 95d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_PLAY_AUDIO = 28; 96efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_READ_CLIPBOARD = 29; 97efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_WRITE_CLIPBOARD = 30; 98ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_MEDIA_BUTTONS = 31; 99ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_AUDIO_FOCUS = 32; 100ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MASTER_VOLUME = 33; 101ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_VOICE_VOLUME = 34; 102ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_RING_VOLUME = 35; 103ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MEDIA_VOLUME = 36; 104ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_ALARM_VOLUME = 37; 105ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38; 106ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39; 107f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** @hide */ 108ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int _NUM_OP = 40; 109f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 110f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 111f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This maps each operation to the operation that serves as the 112f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * switch to determine whether it is allowed. Generally this is 113f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * a 1:1 mapping, but for some things (like location) that have 114f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * multiple low-level operations being tracked that should be 115f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * presented to hte user as one switch then this can be used to 116f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * make them all controlled by the same single operation. 117f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 118f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn private static int[] sOpToSwitch = new int[] { 119f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 120f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 121f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 122f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_VIBRATE, 123f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CONTACTS, 124f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CONTACTS, 125f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALL_LOG, 126f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALL_LOG, 127f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALENDAR, 128f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALENDAR, 129f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 130f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_POST_NOTIFICATION, 131f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 132f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_CALL_PHONE, 133f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 134f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 135f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 136f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 137f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 138f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 139f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 140f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 141f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 142961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn OP_WRITE_SETTINGS, 143c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn OP_SYSTEM_ALERT_WINDOW, 144fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler OP_ACCESS_NOTIFICATIONS, 145d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_CAMERA, 146d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_RECORD_AUDIO, 147d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_PLAY_AUDIO, 148efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_READ_CLIPBOARD, 149efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_WRITE_CLIPBOARD, 150ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_MEDIA_BUTTONS, 151ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_AUDIO_FOCUS, 152ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MASTER_VOLUME, 153ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_VOICE_VOLUME, 154ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_RING_VOLUME, 155ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MEDIA_VOLUME, 156ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_ALARM_VOLUME, 157ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_NOTIFICATION_VOLUME, 158ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_BLUETOOTH_VOLUME, 159f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn }; 1605e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 161f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 162f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This provides a simple name for each operation to be used 163f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * in debug output. 164f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 1655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpNames = new String[] { 166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "COARSE_LOCATION", 167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "FINE_LOCATION", 168f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "GPS", 169f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "VIBRATE", 170f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CONTACTS", 171f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CONTACTS", 172f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALL_LOG", 173f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALL_LOG", 174f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALENDAR", 175f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALENDAR", 176f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WIFI_SCAN", 177f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "POST_NOTIFICATION", 178f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "NEIGHBORING_CELLS", 179f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "CALL_PHONE", 180f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_SMS", 181f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_SMS", 182f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_SMS", 183f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_EMERGECY_SMS", 184f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_MMS", 185f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_WAP_PUSH", 186f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "SEND_SMS", 187f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_ICC_SMS", 188f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_ICC_SMS", 189961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn "WRITE_SETTINGS", 190c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn "SYSTEM_ALERT_WINDOW", 191fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler "ACCESS_NOTIFICATIONS", 192d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "CAMERA", 193d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "RECORD_AUDIO", 194d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "PLAY_AUDIO", 195efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "READ_CLIPBOARD", 196efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "WRITE_CLIPBOARD", 197ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_MEDIA_BUTTONS", 198ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_AUDIO_FOCUS", 199ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MASTER_VOLUME", 200ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_VOICE_VOLUME", 201ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_RING_VOLUME", 202ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MEDIA_VOLUME", 203ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_ALARM_VOLUME", 204ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_NOTIFICATION_VOLUME", 205ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_BLUETOOTH_VOLUME", 2065e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 2075e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 208f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 209f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This optionally maps a permission to an operation. If there 210f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * is no permission associated with an operation, it is null. 211f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 2125e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpPerms = new String[] { 213f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_COARSE_LOCATION, 214f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_FINE_LOCATION, 215f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, 216f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.VIBRATE, 217f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CONTACTS, 218f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CONTACTS, 219f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALL_LOG, 220f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALL_LOG, 221f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALENDAR, 222f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALENDAR, 223f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // no permission required for notifications 224f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_WIFI_STATE, 225f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // neighboring cells shares the coarse location perm 226f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.CALL_PHONE, 227f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 228f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 229f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_SMS, 230f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST, 231f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_MMS, 232f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_WAP_PUSH, 233f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.SEND_SMS, 234f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 235f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 236961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn android.Manifest.permission.WRITE_SETTINGS, 237c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn android.Manifest.permission.SYSTEM_ALERT_WINDOW, 238fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler android.Manifest.permission.ACCESS_NOTIFICATIONS, 239d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.CAMERA, 240d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.RECORD_AUDIO, 241d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn null, // no permission for playing audio 242efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for reading clipboard 243efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for writing clipboard 244ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking media buttons 245ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking audio focus 246ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing master volume 247ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing voice volume 248ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing ring volume 249ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing media volume 250ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing alarm volume 251ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing notification volume 252ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing bluetooth volume 2535e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 2545e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 255d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 256d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the op switch that controls the given operation. 257d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 258f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static int opToSwitch(int op) { 259f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn return sOpToSwitch[op]; 260f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 261f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 262d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 263d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve a non-localized name for the operation, for debugging output. 264d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToName(int op) { 266c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (op == OP_NONE) return "NONE"; 2675e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")"); 2685e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 269a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 270d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 271d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the permission associated with an operation, or null if there is not one. 272d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 2735e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToPermission(int op) { 2745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return sOpPerms[op]; 275a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 276a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 277d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 278d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding all of the operation information associated with an app. 279d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 28035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class PackageOps implements Parcelable { 28135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final String mPackageName; 28235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mUid; 28335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final List<OpEntry> mEntries; 28435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 28535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public PackageOps(String packageName, int uid, List<OpEntry> entries) { 28635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = packageName; 28735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = uid; 28835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = entries; 28935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 29035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 29135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public String getPackageName() { 29235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mPackageName; 29335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 29435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 29535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getUid() { 29635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mUid; 29735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 29835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 29935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<OpEntry> getOps() { 30035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mEntries; 30135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 30235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 30335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 30435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 30535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 30635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 30735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 30835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 30935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 31035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeString(mPackageName); 31135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mUid); 31235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mEntries.size()); 31335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<mEntries.size(); i++) { 31435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.get(i).writeToParcel(dest, flags); 31535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 31635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 31735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 31835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn PackageOps(Parcel source) { 31935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = source.readString(); 32035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = source.readInt(); 32135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = new ArrayList<OpEntry>(); 32235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn final int N = source.readInt(); 32335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<N; i++) { 32435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.add(OpEntry.CREATOR.createFromParcel(source)); 32535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 32635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 32735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 32835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() { 32935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps createFromParcel(Parcel source) { 33035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps(source); 33135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 33235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 33335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps[] newArray(int size) { 33435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps[size]; 33535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 33635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 33735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 33835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 339d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 340d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding the information about one unique operation of an application. 341d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 34235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class OpEntry implements Parcelable { 34335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mOp; 3445e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final int mMode; 34535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final long mTime; 3465e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final long mRejectTime; 34735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mDuration; 34835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 3495e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public OpEntry(int op, int mode, long time, long rejectTime, int duration) { 35035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = op; 3515e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = mode; 35235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = time; 3535e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = rejectTime; 35435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = duration; 35535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 35635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 35735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getOp() { 35835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mOp; 35935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 36035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 3615e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public int getMode() { 3625e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mMode; 3635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 3645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 36535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public long getTime() { 36635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mTime; 36735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 36835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 3695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public long getRejectTime() { 3705e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mRejectTime; 3715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 3725e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 37335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public boolean isRunning() { 37435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1; 37535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 37635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 37735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getDuration() { 37835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; 37935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 38035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 38135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 38235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 38335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 38435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 38535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 38635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 38735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 38835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mOp); 3895e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeInt(mMode); 39035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeLong(mTime); 3915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeLong(mRejectTime); 39235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mDuration); 39335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 39435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 39535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn OpEntry(Parcel source) { 39635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = source.readInt(); 3975e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = source.readInt(); 39835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = source.readLong(); 3995e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = source.readLong(); 40035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = source.readInt(); 40135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 40235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 40335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() { 40435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry createFromParcel(Parcel source) { 40535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry(source); 40635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 40735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 40835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry[] newArray(int size) { 40935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry[size]; 41035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 41135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 41235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 41335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 414d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 415d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Callback for notification of changes to operation state. 416d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 417c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public interface Callback { 418c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void opChanged(int op, String packageName); 419c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 420c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 421a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public AppOpsManager(Context context, IAppOpsService service) { 422a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mContext = context; 423a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = service; 424a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 425a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 426d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 427d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for all applications. 428d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 429d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 430d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 43135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) { 43235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 43335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.getPackagesForOps(ops); 43435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 43535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 43635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return null; 43735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 43835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 439d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 440d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for one application. 441d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 442d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param uid The uid of the application of interest. 443d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param packageName The name of the application of interest. 444d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 445d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 44672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) { 44772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn try { 44872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return mService.getOpsForPackage(uid, packageName, ops); 44972e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } catch (RemoteException e) { 45072e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 45172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return null; 45272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 45372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn 4545e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public void setMode(int code, int uid, String packageName, int mode) { 4555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn try { 4565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mService.setMode(code, uid, packageName, mode); 4575e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } catch (RemoteException e) { 4585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 4595e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 4605e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 461c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void startWatchingMode(int op, String packageName, final Callback callback) { 462c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 463c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 464c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb == null) { 465c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn cb = new IAppOpsCallback.Stub() { 466c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void opChanged(int op, String packageName) { 467c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn callback.opChanged(op, packageName); 468c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 469c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn }; 470c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mModeWatchers.put(callback, cb); 471c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 472c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 473c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.startWatchingMode(op, packageName, cb); 474c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 475c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 476c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 477c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 478c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 479c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void stopWatchingMode(Callback callback) { 480c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 481c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 482c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb != null) { 483c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 484c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.stopWatchingMode(cb); 485c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 486c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 487c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 488c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 489c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 490c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 49135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOp(int op, int uid, String packageName) { 49235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 49335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn int mode = mService.checkOperation(op, uid, packageName); 49435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn if (mode == MODE_ERRORED) { 49535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn throw new SecurityException("Operation not allowed"); 49635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 49735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mode; 49835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 49935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 50035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 50135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 50235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 50335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOpNoThrow(int op, int uid, String packageName) { 50435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 50535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.checkOperation(op, uid, packageName); 50635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 50735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 50835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 50935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 51035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op, int uid, String packageName) { 512a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 513a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.noteOperation(op, uid, packageName); 514a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn throw new SecurityException("Operation not allowed"); 516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 522a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 523a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOpNoThrow(int op, int uid, String packageName) { 524a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 525a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.noteOperation(op, uid, packageName); 526a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 527a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 528a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 529a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 530a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 531a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op) { 532d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return noteOp(op, Process.myUid(), mContext.getBasePackageName()); 533a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 534a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 535a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op, int uid, String packageName) { 536a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 537a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.startOperation(op, uid, packageName); 538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn throw new SecurityException("Operation not allowed"); 540a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 541a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 542a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 543a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 544a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 545a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 546a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 547a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOpNoThrow(int op, int uid, String packageName) { 548a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 549a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.startOperation(op, uid, packageName); 550a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 551a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 552a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 553a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 554a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 555a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op) { 556d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn return startOp(op, Process.myUid(), mContext.getBasePackageName()); 557a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 558a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 559a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op, int uid, String packageName) { 560a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 561a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService.finishOperation(op, uid, packageName); 562a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 563a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 564a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 565a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 566a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op) { 567d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn finishOp(op, Process.myUid(), mContext.getBasePackageName()); 568a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 569a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn} 570