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; 269bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackbornimport java.util.HashMap; 2735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List; 2835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 29a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 3035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel; 3135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable; 32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process; 33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException; 34a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 35d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn/** 369bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * API for interacting with "application operation" tracking. 37d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 389bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <p>This API is not generally intended for third party application developers; most 399bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * features are only available to system applicatins. Obtain an instance of it through 409bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * {@link Context#getSystemService(String) Context.getSystemService} with 419bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * {@link Context#APP_OPS_SERVICE Context.APP_OPS_SERVICE}.</p> 42d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 43a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager { 449bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 459bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <p>App ops allows callers to:</p> 469bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * 479bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <ul> 489bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <li> Note when operations are happening, and find out if they are allowed for the current 499bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * caller.</li> 509bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <li> Disallow specific apps from doing specific operations.</li> 519bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <li> Collect all of the current information about operations that have been executed or 529bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * are not being allowed.</li> 539bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <li> Monitor for changes in whether an operation is allowed.</li> 549bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * </ul> 559bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * 569bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <p>Each operation is identified by a single integer; these integers are a fixed set of 579bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * operations, enumerated by the OP_* constants. 589bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * 599bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <p></p>When checking operations, the result is a "mode" integer indicating the current 609bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * setting for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute 619bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * the operation but fake its behavior enough so that the caller doesn't crash), 629bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * MODE_ERRORED (throw a SecurityException back to the caller; the normal operation calls 639bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * will do this for you). 649bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 659bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 66a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final Context mContext; 67a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn final IAppOpsService mService; 689bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn final ArrayMap<OnOpChangedListener, IAppOpsCallback> mModeWatchers 699bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn = new ArrayMap<OnOpChangedListener, IAppOpsCallback>(); 70a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 71e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn static IBinder sToken; 72e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn 739bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 749bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is 759bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * allowed to perform the given operation. 769bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 77a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ALLOWED = 0; 789bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 799bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 809bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is 819bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * not allowed to perform the given operation, and this attempt should 829bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * <em>silently fail</em> (it should not cause the app to crash). 839bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 84a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_IGNORED = 1; 859bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 869bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 879bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Result from {@link #checkOpNoThrow}, {@link #noteOpNoThrow}, {@link #startOpNoThrow}: the 889bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * given caller is not allowed to perform the given operation, and this attempt should 899bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * cause it to have a fatal error, typically a {@link SecurityException}. 909bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 91a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public static final int MODE_ERRORED = 2; 92a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 93fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // when adding one of these: 94fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - increment _NUM_OP 959bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn // - add rows to sOpToSwitch, sOpToString, sOpNames, sOpPerms, sOpDefaultMode 96fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler // - add descriptive strings to Settings/res/values/arrays.xml 970b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie // - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app) 981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn 999bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide No operation specified. */ 100f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_NONE = -1; 1019bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide Access to coarse location information. */ 10235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_COARSE_LOCATION = 0; 1039bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide Access to fine location information. */ 10435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_FINE_LOCATION = 1; 1059bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide Causing GPS to run. */ 10635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_GPS = 2; 1071304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 10835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_VIBRATE = 3; 1091304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 11035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CONTACTS = 4; 1111304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 11235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CONTACTS = 5; 1131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 11435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_READ_CALL_LOG = 6; 1151304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 11635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final int OP_WRITE_CALL_LOG = 7; 1171304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1185e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_READ_CALENDAR = 8; 1191304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1205e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WRITE_CALENDAR = 9; 1211304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1225e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static final int OP_WIFI_SCAN = 10; 1231304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1244a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler public static final int OP_POST_NOTIFICATION = 11; 1251304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 126f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_NEIGHBORING_CELLS = 12; 1271304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 128f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static final int OP_CALL_PHONE = 13; 1291304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 130f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_SMS = 14; 1311304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 132f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_SMS = 15; 1331304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 134f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_SMS = 16; 1351304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 136f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_EMERGECY_SMS = 17; 1371304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 138f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_MMS = 18; 1391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 140f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_RECEIVE_WAP_PUSH = 19; 1411304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 142f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_SEND_SMS = 20; 1431304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 144f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_READ_ICC_SMS = 21; 1451304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 146f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn public static final int OP_WRITE_ICC_SMS = 22; 1471304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 148961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn public static final int OP_WRITE_SETTINGS = 23; 1491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 150c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public static final int OP_SYSTEM_ALERT_WINDOW = 24; 1511304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 152fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler public static final int OP_ACCESS_NOTIFICATIONS = 25; 1531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 154d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_CAMERA = 26; 1551304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 156d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_RECORD_AUDIO = 27; 1571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 158d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn public static final int OP_PLAY_AUDIO = 28; 1591304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 160efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_READ_CLIPBOARD = 29; 1611304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 162efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn public static final int OP_WRITE_CLIPBOARD = 30; 1631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 164ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_MEDIA_BUTTONS = 31; 1651304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 166ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_TAKE_AUDIO_FOCUS = 32; 1671304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 168ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MASTER_VOLUME = 33; 1691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 170ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_VOICE_VOLUME = 34; 1711304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 172ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_RING_VOLUME = 35; 1731304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 174ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_MEDIA_VOLUME = 36; 1751304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 176ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_ALARM_VOLUME = 37; 1771304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 178ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38; 1791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 180ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39; 1811304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 182713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn public static final int OP_WAKE_LOCK = 40; 1839bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide Continually monitoring location data. */ 1841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn public static final int OP_MONITOR_LOCATION = 41; 1859bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide Continually monitoring location data with a relatively high power request. */ 1860b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42; 187f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** @hide */ 1880b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie public static final int _NUM_OP = 43; 189f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 1909bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** Access to coarse location information. */ 1919bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public static final String OPSTR_COARSE_LOCATION = 1929bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn "android:coarse_location"; 1939bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** Access to fine location information. */ 1949bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public static final String OPSTR_FINE_LOCATION = 1959bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn "android:fine_location"; 1969bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** Continually monitoring location data. */ 1979bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public static final String OPSTR_MONITOR_LOCATION 1989bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn = "android:monitor_location"; 1999bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** Continually monitoring location data with a relatively high power request. */ 2009bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public static final String OPSTR_MONITOR_HIGH_POWER_LOCATION 2019bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn = "android:monitor_location_high_power"; 2029bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 203f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 204f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This maps each operation to the operation that serves as the 205f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * switch to determine whether it is allowed. Generally this is 206f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * a 1:1 mapping, but for some things (like location) that have 207f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * multiple low-level operations being tracked that should be 2080b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie * presented to the user as one switch then this can be used to 209f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * make them all controlled by the same single operation. 210f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 211f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn private static int[] sOpToSwitch = new int[] { 212f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 213f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 214f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 215f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_VIBRATE, 216f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CONTACTS, 217f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CONTACTS, 218f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALL_LOG, 219f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALL_LOG, 220f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_READ_CALENDAR, 221f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_WRITE_CALENDAR, 222f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 223f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_POST_NOTIFICATION, 224f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_COARSE_LOCATION, 225f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn OP_CALL_PHONE, 226f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 227f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 22818966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 22918966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 23018966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 23118966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_RECEIVE_SMS, 23218966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun OP_SEND_SMS, 233f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_READ_SMS, 234f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn OP_WRITE_SMS, 235961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn OP_WRITE_SETTINGS, 236c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn OP_SYSTEM_ALERT_WINDOW, 237fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler OP_ACCESS_NOTIFICATIONS, 238d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_CAMERA, 239d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_RECORD_AUDIO, 240d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn OP_PLAY_AUDIO, 241efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_READ_CLIPBOARD, 242efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn OP_WRITE_CLIPBOARD, 243ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_MEDIA_BUTTONS, 244ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_TAKE_AUDIO_FOCUS, 245ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MASTER_VOLUME, 246ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_VOICE_VOLUME, 247ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_RING_VOLUME, 248ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_MEDIA_VOLUME, 249ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_ALARM_VOLUME, 250ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_NOTIFICATION_VOLUME, 251ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn OP_AUDIO_BLUETOOTH_VOLUME, 252713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn OP_WAKE_LOCK, 2531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn OP_COARSE_LOCATION, 2540b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie OP_COARSE_LOCATION, 255f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn }; 2565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 257f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 2589bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * This maps each operation to the public string constant for it. 2599bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * If it doesn't have a public string constant, it maps to null. 2609bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 2619bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn private static String[] sOpToString = new String[] { 2629bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn OPSTR_COARSE_LOCATION, 2639bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn OPSTR_FINE_LOCATION, 2649bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2659bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2669bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2679bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2689bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2699bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2709bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2719bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2729bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2739bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2749bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2759bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2769bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2779bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2789bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2799bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2809bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2819bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2829bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2839bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2849bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2859bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2869bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2879bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2889bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2899bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2909bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2919bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2929bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2939bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2949bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2959bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2969bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2979bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2989bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 2999bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 3009bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 3019bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 3029bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn null, 3039bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn OPSTR_MONITOR_LOCATION, 3049bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn OPSTR_MONITOR_HIGH_POWER_LOCATION, 3059bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn }; 3069bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 3079bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 308f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This provides a simple name for each operation to be used 309f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * in debug output. 310f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 3115e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpNames = new String[] { 312f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "COARSE_LOCATION", 313f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "FINE_LOCATION", 314f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "GPS", 315f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "VIBRATE", 316f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CONTACTS", 317f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CONTACTS", 318f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALL_LOG", 319f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALL_LOG", 320f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "READ_CALENDAR", 321f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WRITE_CALENDAR", 322f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "WIFI_SCAN", 323f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "POST_NOTIFICATION", 324f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "NEIGHBORING_CELLS", 325f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn "CALL_PHONE", 326f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_SMS", 327f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_SMS", 328f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_SMS", 329f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_EMERGECY_SMS", 330f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_MMS", 331f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "RECEIVE_WAP_PUSH", 332f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "SEND_SMS", 333f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "READ_ICC_SMS", 334f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn "WRITE_ICC_SMS", 335961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn "WRITE_SETTINGS", 336c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn "SYSTEM_ALERT_WINDOW", 337fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler "ACCESS_NOTIFICATIONS", 338d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "CAMERA", 339d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "RECORD_AUDIO", 340d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn "PLAY_AUDIO", 341efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "READ_CLIPBOARD", 342efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn "WRITE_CLIPBOARD", 343ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_MEDIA_BUTTONS", 344ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "TAKE_AUDIO_FOCUS", 345ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MASTER_VOLUME", 346ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_VOICE_VOLUME", 347ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_RING_VOLUME", 348ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_MEDIA_VOLUME", 349ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_ALARM_VOLUME", 350ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_NOTIFICATION_VOLUME", 351ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn "AUDIO_BLUETOOTH_VOLUME", 352713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn "WAKE_LOCK", 3531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn "MONITOR_LOCATION", 3540b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie "MONITOR_HIGH_POWER_LOCATION", 3555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 3565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 357f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 358f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * This optionally maps a permission to an operation. If there 359f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * is no permission associated with an operation, it is null. 360f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 3615e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private static String[] sOpPerms = new String[] { 362f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_COARSE_LOCATION, 363f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_FINE_LOCATION, 364f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, 365f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.VIBRATE, 366f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CONTACTS, 367f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CONTACTS, 368f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALL_LOG, 369f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALL_LOG, 370f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.READ_CALENDAR, 371f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.WRITE_CALENDAR, 372f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // no permission required for notifications 373f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.ACCESS_WIFI_STATE, 374f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn null, // neighboring cells shares the coarse location perm 375f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn android.Manifest.permission.CALL_PHONE, 376f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 377f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 378f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_SMS, 379f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST, 380f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_MMS, 381f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.RECEIVE_WAP_PUSH, 382f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.SEND_SMS, 383f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.READ_SMS, 384f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn android.Manifest.permission.WRITE_SMS, 385961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn android.Manifest.permission.WRITE_SETTINGS, 386c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn android.Manifest.permission.SYSTEM_ALERT_WINDOW, 387fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler android.Manifest.permission.ACCESS_NOTIFICATIONS, 388d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.CAMERA, 389d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn android.Manifest.permission.RECORD_AUDIO, 390d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn null, // no permission for playing audio 391efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for reading clipboard 392efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn null, // no permission for writing clipboard 393ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking media buttons 394ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for taking audio focus 395ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing master volume 396ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing voice volume 397ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing ring volume 398ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing media volume 399ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing alarm volume 400ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing notification volume 401ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn null, // no permission for changing bluetooth volume 402713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn android.Manifest.permission.WAKE_LOCK, 4031304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn null, // no permission for generic location monitoring 4040b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie null, // no permission for high power location monitoring 4055e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn }; 4065e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 407d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 408f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * This specifies the default mode for each operation. 409f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun */ 410f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun private static int[] sOpDefaultMode = new int[] { 411f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 412f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 413f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 414f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 415f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 416f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 417f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 418f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 419f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 420f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 421f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 422f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 423f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 424f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 425f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 426f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_IGNORED, // OP_WRITE_SMS 427f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 428f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 429f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 430f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 431f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 432f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 433f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 434f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 435f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 436f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 437f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 438f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 439f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 440f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 441f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 442f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 443f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 444f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 445f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 446f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 447f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 448f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 449f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 450f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 451f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 452f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 453f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun AppOpsManager.MODE_ALLOWED, 454f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun }; 455f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun 4568828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn /** 4578828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * This specifies whether each option is allowed to be reset 4588828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * when resetting all app preferences. Disable reset for 4598828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * app ops that are under strong control of some part of the 4608828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * system (such as OP_WRITE_SMS, which should be allowed only 4618828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * for whichever app is selected as the current SMS app). 4628828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn */ 4638828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn private static boolean[] sOpDisableReset = new boolean[] { 4648828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4658828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4668828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4678828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4688828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4698828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4708828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4718828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4728828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4738828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4748828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4758828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4768828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4778828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4788828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4798828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn true, // OP_WRITE_SMS 4808828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4818828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4828828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4838828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4848828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4858828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4868828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4878828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4888828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4898828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4908828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4918828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4928828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4938828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4948828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4958828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4968828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4978828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4988828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 4998828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5008828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5018828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5028828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5038828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5048828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5058828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5068828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn false, 5078828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn }; 5088828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn 5099bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn private static HashMap<String, Integer> sOpStrToOp = new HashMap<String, Integer>(); 5109bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 5119bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn static { 5129bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpToSwitch.length != _NUM_OP) { 5138828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpToSwitch length " + sOpToSwitch.length 5149bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn + " should be " + _NUM_OP); 5159bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5169bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpToString.length != _NUM_OP) { 5178828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpToString length " + sOpToString.length 5189bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn + " should be " + _NUM_OP); 5199bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5209bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpNames.length != _NUM_OP) { 5218828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpNames length " + sOpNames.length 5229bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn + " should be " + _NUM_OP); 5239bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5249bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpPerms.length != _NUM_OP) { 5258828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpPerms length " + sOpPerms.length 5269bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn + " should be " + _NUM_OP); 5279bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5289bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpDefaultMode.length != _NUM_OP) { 5298828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpDefaultMode length " + sOpDefaultMode.length 5308828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn + " should be " + _NUM_OP); 5318828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn } 5328828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn if (sOpDisableReset.length != _NUM_OP) { 5338828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn throw new IllegalStateException("sOpDisableReset length " + sOpDisableReset.length 5349bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn + " should be " + _NUM_OP); 5359bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5369bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn for (int i=0; i<_NUM_OP; i++) { 5379bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpToString[i] != null) { 5389bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn sOpStrToOp.put(sOpToString[i], i); 5399bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5409bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5419bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 5429bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 543f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun /** 544d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the op switch that controls the given operation. 5451304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 546d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 547f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public static int opToSwitch(int op) { 548f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn return sOpToSwitch[op]; 549f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 550f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 551d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 552d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve a non-localized name for the operation, for debugging output. 5539bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 554d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 5555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToName(int op) { 556c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (op == OP_NONE) return "NONE"; 5575e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")"); 5585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 559a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 560d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 561d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve the permission associated with an operation, or null if there is not one. 5621304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 563d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 5645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public static String opToPermission(int op) { 5655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return sOpPerms[op]; 566a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 567a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 568d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 569f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * Retrieve the default mode for the operation. 570f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun * @hide 571f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun */ 572f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun public static int opToDefaultMode(int op) { 573f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun return sOpDefaultMode[op]; 574f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun } 575f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun 576f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun /** 5778828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * Retrieve whether the op allows itself to be reset. 5788828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn * @hide 5798828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn */ 5808828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn public static boolean opAllowsReset(int op) { 5818828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn return !sOpDisableReset[op]; 5828828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn } 5838828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn 5848828d3a153e28fe631edcd5145e6cc706e0b34c8Dianne Hackborn /** 585d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding all of the operation information associated with an app. 5861304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 587d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 58835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class PackageOps implements Parcelable { 58935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final String mPackageName; 59035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mUid; 59135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final List<OpEntry> mEntries; 59235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 59335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public PackageOps(String packageName, int uid, List<OpEntry> entries) { 59435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = packageName; 59535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = uid; 59635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = entries; 59735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 59835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 59935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public String getPackageName() { 60035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mPackageName; 60135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 60235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 60335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getUid() { 60435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mUid; 60535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 60635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 60735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<OpEntry> getOps() { 60835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mEntries; 60935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 61035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 61135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 61235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 61335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 61435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 61535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 61635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 61735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 61835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeString(mPackageName); 61935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mUid); 62035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mEntries.size()); 62135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<mEntries.size(); i++) { 62235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.get(i).writeToParcel(dest, flags); 62335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 62435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 62535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 62635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn PackageOps(Parcel source) { 62735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mPackageName = source.readString(); 62835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mUid = source.readInt(); 62935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries = new ArrayList<OpEntry>(); 63035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn final int N = source.readInt(); 63135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn for (int i=0; i<N; i++) { 63235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mEntries.add(OpEntry.CREATOR.createFromParcel(source)); 63335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 63435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 63535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 63635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() { 63735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps createFromParcel(Parcel source) { 63835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps(source); 63935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 64035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 64135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public PackageOps[] newArray(int size) { 64235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new PackageOps[size]; 64335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 64435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 64535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 64635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 647d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 648d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Class holding the information about one unique operation of an application. 6491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 650d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 65135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static class OpEntry implements Parcelable { 65235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mOp; 6535e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final int mMode; 65435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final long mTime; 6555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn private final long mRejectTime; 65635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn private final int mDuration; 65735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 6585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public OpEntry(int op, int mode, long time, long rejectTime, int duration) { 65935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = op; 6605e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = mode; 66135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = time; 6625e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = rejectTime; 66335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = duration; 66435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 66535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 66635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getOp() { 66735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mOp; 66835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 66935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 6705e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public int getMode() { 6715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mMode; 6725e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 6735e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 67435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public long getTime() { 67535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mTime; 67635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 67735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 6785e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public long getRejectTime() { 6795e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn return mRejectTime; 6805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 6815e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 68235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public boolean isRunning() { 68335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1; 68435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 68535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 68635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int getDuration() { 68735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; 68835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 68935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 69035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 69135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int describeContents() { 69235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return 0; 69335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 69435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 69535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override 69635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public void writeToParcel(Parcel dest, int flags) { 69735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mOp); 6985e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeInt(mMode); 69935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeLong(mTime); 7005e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn dest.writeLong(mRejectTime); 70135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn dest.writeInt(mDuration); 70235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 70335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 70435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn OpEntry(Parcel source) { 70535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mOp = source.readInt(); 7065e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mMode = source.readInt(); 70735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mTime = source.readLong(); 7085e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mRejectTime = source.readLong(); 70935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn mDuration = source.readInt(); 71035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 71135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 71235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() { 71335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry createFromParcel(Parcel source) { 71435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry(source); 71535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 71635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 71735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn @Override public OpEntry[] newArray(int size) { 71835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return new OpEntry[size]; 71935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 72035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn }; 72135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 72235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 723d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 724d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Callback for notification of changes to operation state. 725d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 7269bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public interface OnOpChangedListener { 7279bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void onOpChanged(String op, String packageName); 7289bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 7299bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 7309bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 7319bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Callback for notification of changes to operation state. 7329bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * This allows you to see the raw op codes instead of strings. 7339bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 7349bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 7359bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public static class OnOpChangedInternalListener implements OnOpChangedListener { 7369bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void onOpChanged(String op, String packageName) { } 7379bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void onOpChanged(int op, String packageName) { } 738c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 739c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 7401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn AppOpsManager(Context context, IAppOpsService service) { 741a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mContext = context; 742a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = service; 743a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 744a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 745d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 746d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for all applications. 747d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 748d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 7491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 750d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 75135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) { 75235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 75335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.getPackagesForOps(ops); 75435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 75535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 75635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return null; 75735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 75835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 759d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn /** 760d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Retrieve current operation state for one application. 761d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * 762d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param uid The uid of the application of interest. 763d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param packageName The name of the application of interest. 764d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @param ops The set of operations you are interested in, or null if you want all of them. 7651304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @hide 766d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */ 76772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) { 76872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn try { 76972e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return mService.getOpsForPackage(uid, packageName, ops); 77072e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } catch (RemoteException e) { 77172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 77272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn return null; 77372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn } 77472e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn 7751304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 7765e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn public void setMode(int code, int uid, String packageName, int mode) { 7775e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn try { 7785e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn mService.setMode(code, uid, packageName, mode); 7795e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } catch (RemoteException e) { 7805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 7815e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn } 7825e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn 783607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn /** @hide */ 784607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn public void resetAllModes() { 785607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn try { 786607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn mService.resetAllModes(); 787607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } catch (RemoteException e) { 788607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } 789607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn } 790607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn 7911304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 7921304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Monitor for changes to the operating mode for the given op in the given app package. 793e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn * @param op The operation to monitor, one of OPSTR_*. 794e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn * @param packageName The name of the application to monitor. 795e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn * @param callback Where to report changes. 796e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn */ 797e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn public void startWatchingMode(String op, String packageName, 798e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn final OnOpChangedListener callback) { 799e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn startWatchingMode(strOpToOp(op), packageName, callback); 800e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn } 801e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn 802e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn /** 803e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn * Monitor for changes to the operating mode for the given op in the given app package. 8041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to monitor, one of OP_*. 8051304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application to monitor. 8061304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param callback Where to report changes. 807e4cb66fd77084b2642e519bb7f4c27ae7ef95939Dianne Hackborn * @hide 8081304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 8099bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void startWatchingMode(int op, String packageName, final OnOpChangedListener callback) { 810c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 811c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 812c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb == null) { 813c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn cb = new IAppOpsCallback.Stub() { 814c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn public void opChanged(int op, String packageName) { 8159bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (callback instanceof OnOpChangedInternalListener) { 8169bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn ((OnOpChangedInternalListener)callback).onOpChanged(op, packageName); 8179bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 8189bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (sOpToString[op] != null) { 8199bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn callback.onOpChanged(sOpToString[op], packageName); 8209bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 821c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 822c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn }; 823c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mModeWatchers.put(callback, cb); 824c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 825c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 826c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.startWatchingMode(op, packageName, cb); 827c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 828c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 829c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 830c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 831c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 8321304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 8331304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Stop monitoring that was previously started with {@link #startWatchingMode}. All 8341304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * monitoring associated with this callback will be removed. 8351304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 8369bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void stopWatchingMode(OnOpChangedListener callback) { 837c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn synchronized (mModeWatchers) { 838c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn IAppOpsCallback cb = mModeWatchers.get(callback); 839c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn if (cb != null) { 840c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn try { 841c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn mService.stopWatchingMode(cb); 842c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } catch (RemoteException e) { 843c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 844c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 845c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 846c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn } 847c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn 84895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn private String buildSecurityExceptionMsg(int op, int uid, String packageName) { 84995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op]; 85095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn } 85195d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn 8529bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn private int strOpToOp(String op) { 8539bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn Integer val = sOpStrToOp.get(op); 8549bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn if (val == null) { 8559bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn throw new IllegalArgumentException("Unknown operation string: " + op); 8569bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 8579bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return val; 8589bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 8599bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 8609bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 8619bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Do a quick check for whether an application might be able to perform an operation. 8629bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * This is <em>not</em> a security check; you must use {@link #noteOp(String, int, String)} 8639bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * or {@link #startOp(String, int, String)} for your actual security checks, which also 8649bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * ensure that the given uid and package name are consistent. This function can just be 8659bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * used for a quick check to see if an operation has been disabled for the application, 8669bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * as an early reject of some work. This does not modify the time stamp or other data 8679bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * about the operation. 8689bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param op The operation to check. One of the OPSTR_* constants. 8699bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 8709bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 8719bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 8729bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 8739bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * causing the app to crash). 8749bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 8759bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 8769bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int checkOp(String op, int uid, String packageName) { 8779bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return checkOp(strOpToOp(op), uid, packageName); 8789bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 8799bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 8809bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 8819bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Like {@link #checkOp but instead of throwing a {@link SecurityException} it 8829bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * returns {@link #MODE_ERRORED}. 8839bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 8849bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int checkOpNoThrow(String op, int uid, String packageName) { 8859bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return checkOpNoThrow(strOpToOp(op), uid, packageName); 8869bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 8879bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 8889bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 8899bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Make note of an application performing an operation. Note that you must pass 8909bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * in both the uid and name of the application to be checked; this function will verify 8919bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * that these two match, and if not, return {@link #MODE_IGNORED}. If this call 8929bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 8939bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * the current time. 8949bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param op The operation to note. One of the OPSTR_* constants. 8959bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 8969bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 8979bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 8989bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 8999bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * causing the app to crash). 9009bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 9019bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 9029bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int noteOp(String op, int uid, String packageName) { 9039bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return noteOp(strOpToOp(op), uid, packageName); 9049bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 9059bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 9069bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 9079bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it 9089bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * returns {@link #MODE_ERRORED}. 9099bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 9109bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int noteOpNoThrow(String op, int uid, String packageName) { 9119bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return noteOpNoThrow(strOpToOp(op), uid, packageName); 9129bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 9139bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 9149bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 9159bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Report that an application has started executing a long-running operation. Note that you 9169bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * must pass in both the uid and name of the application to be checked; this function will 9179bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * verify that these two match, and if not, return {@link #MODE_IGNORED}. If this call 9189bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 9199bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * the current time and the operation will be marked as "running". In this case you must 9209bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * later call {@link #finishOp(String, int, String)} to report when the application is no 9219bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * longer performing the operation. 9229bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param op The operation to start. One of the OPSTR_* constants. 9239bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 9249bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 9259bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 9269bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 9279bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * causing the app to crash). 9289bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 9299bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 9309bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int startOp(String op, int uid, String packageName) { 9319bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return startOp(strOpToOp(op), uid, packageName); 9329bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 9339bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 9349bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 9359bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Like {@link #startOp} but instead of throwing a {@link SecurityException} it 9369bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * returns {@link #MODE_ERRORED}. 9379bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 9389bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public int startOpNoThrow(String op, int uid, String packageName) { 9399bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn return startOpNoThrow(strOpToOp(op), uid, packageName); 9409bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 9419bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 9429bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** 9439bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * Report that an application is no longer performing an operation that had previously 9449bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * been started with {@link #startOp(String, int, String)}. There is no validation of input 9459bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * or result; the parameters supplied here must be the exact same ones previously passed 9469bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * in when starting the operation. 9479bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn */ 9489bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn public void finishOp(String op, int uid, String packageName) { 9499bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn finishOp(strOpToOp(op), uid, packageName); 9509bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn } 9519bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn 9521304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 9531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Do a quick check for whether an application might be able to perform an operation. 9541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)} 9551304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * or {@link #startOp(int, int, String)} for your actual security checks, which also 9561304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * ensure that the given uid and package name are consistent. This function can just be 9571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * used for a quick check to see if an operation has been disabled for the application, 9581304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * as an early reject of some work. This does not modify the time stamp or other data 9591304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * about the operation. 9601304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to check. One of the OP_* constants. 9611304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 9621304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 9631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 9641304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 9651304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 9661304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 9679bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 9681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 96935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOp(int op, int uid, String packageName) { 97035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 97135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn int mode = mService.checkOperation(op, uid, packageName); 97235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn if (mode == MODE_ERRORED) { 97395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 97435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 97535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mode; 97635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 97735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 97835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 97935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 98035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 9811304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 9821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it 9831304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 9849bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 9851304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 98635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn public int checkOpNoThrow(int op, int uid, String packageName) { 98735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn try { 98835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return mService.checkOperation(op, uid, packageName); 98935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } catch (RemoteException e) { 99035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 99135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn return MODE_IGNORED; 99235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn } 99335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn 9941304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 995911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * Do a quick check to validate if a package name belongs to a UID. 996911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * 997911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * @throws SecurityException if the package name doesn't belong to the given 998911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey * UID, or if ownership cannot be verified. 999911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey */ 1000911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey public void checkPackage(int uid, String packageName) { 1001911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey try { 1002911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) { 1003911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey throw new SecurityException( 1004911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey "Package " + packageName + " does not belong to " + uid); 1005911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 1006911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } catch (RemoteException e) { 1007911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey throw new SecurityException("Unable to verify package ownership", e); 1008911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 1009911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey } 1010911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey 1011911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey /** 10121304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Make note of an application performing an operation. Note that you must pass 10131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * in both the uid and name of the application to be checked; this function will verify 10141304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * that these two match, and if not, return {@link #MODE_IGNORED}. If this call 10151304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 10161304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * the current time. 10171304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to note. One of the OP_* constants. 10181304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 10191304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 10201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 10211304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 10221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 10231304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 10249bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 10251304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 1026a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op, int uid, String packageName) { 1027a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 1028a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn int mode = mService.noteOperation(op, uid, packageName); 1029a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 103095d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1031a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1032a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 1033a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 1034a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1035a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 1036a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1037a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 10381304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 10391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it 10401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 10419bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 10421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 1043a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOpNoThrow(int op, int uid, String packageName) { 1044a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 1045a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mService.noteOperation(op, uid, packageName); 1046a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 1047a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1048a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 1049a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1050a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 10511304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1052a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int noteOp(int op) { 105395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return noteOp(op, Process.myUid(), mContext.getOpPackageName()); 1054a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1055a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 1056e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn /** @hide */ 1057e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn public static IBinder getToken(IAppOpsService service) { 1058e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn synchronized (AppOpsManager.class) { 1059e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn if (sToken != null) { 1060e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return sToken; 1061e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 1062e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn try { 1063e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn sToken = service.getToken(new Binder()); 1064e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } catch (RemoteException e) { 1065e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn // System is dead, whatevs. 1066e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 1067e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return sToken; 1068e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 1069e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn } 1070e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn 10711304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 10721304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Report that an application has started executing a long-running operation. Note that you 10731304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * must pass in both the uid and name of the application to be checked; this function will 10741304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * verify that these two match, and if not, return {@link #MODE_IGNORED}. If this call 10751304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * succeeds, the last execution time of the operation for this app will be updated to 10761304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * the current time and the operation will be marked as "running". In this case you must 10771304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * later call {@link #finishOp(int, int, String)} to report when the application is no 10781304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * longer performing the operation. 10791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param op The operation to start. One of the OP_* constants. 10801304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param uid The user id of the application attempting to perform the operation. 10811304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @param packageName The name of the application attempting to perform the operation. 10821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 10831304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 10841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * causing the app to crash). 10851304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * @throws SecurityException If the app has been configured to crash on this op. 10869bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 10871304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 1088a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op, int uid, String packageName) { 1089a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 1090e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn int mode = mService.startOperation(getToken(mService), op, uid, packageName); 1091a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn if (mode == MODE_ERRORED) { 109295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1093a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1094a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return mode; 1095a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 1096a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1097a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 1098a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1099a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 11001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 11011304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Like {@link #startOp} but instead of throwing a {@link SecurityException} it 11021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * returns {@link #MODE_ERRORED}. 11039bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 11041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 1105a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOpNoThrow(int op, int uid, String packageName) { 1106a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 1107e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn return mService.startOperation(getToken(mService), op, uid, packageName); 1108a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 1109a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1110a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn return MODE_IGNORED; 1111a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1112a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 11131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** @hide */ 1114a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public int startOp(int op) { 111595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn return startOp(op, Process.myUid(), mContext.getOpPackageName()); 1116a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1117a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 11181304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn /** 11191304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * Report that an application is no longer performing an operation that had previously 11201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * been started with {@link #startOp(int, int, String)}. There is no validation of input 11211304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * or result; the parameters supplied here must be the exact same ones previously passed 11221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * in when starting the operation. 11239bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn * @hide 11241304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn */ 1125a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op, int uid, String packageName) { 1126a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn try { 1127e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn mService.finishOperation(getToken(mService), op, uid, packageName); 1128a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } catch (RemoteException e) { 1129a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1130a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1131a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 11329bb0ee9131b0fa8cf2720f200575ba2ede48a65cDianne Hackborn /** @hide */ 1133a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public void finishOp(int op) { 113495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn finishOp(op, Process.myUid(), mContext.getOpPackageName()); 1135a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 1136a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn} 1137