1 /* 2 * Copyright (C) 2012 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.app; 18 19 import android.Manifest; 20 import android.annotation.RequiresPermission; 21 import android.annotation.SystemApi; 22 import android.annotation.SystemService; 23 import android.app.usage.UsageStatsManager; 24 import android.content.Context; 25 import android.media.AudioAttributes.AttributeUsage; 26 import android.os.Binder; 27 import android.os.IBinder; 28 import android.os.Parcel; 29 import android.os.Parcelable; 30 import android.os.Process; 31 import android.os.RemoteException; 32 import android.os.UserHandle; 33 import android.os.UserManager; 34 import android.util.ArrayMap; 35 36 import com.android.internal.app.IAppOpsCallback; 37 import com.android.internal.app.IAppOpsService; 38 39 import java.util.ArrayList; 40 import java.util.HashMap; 41 import java.util.List; 42 43 /** 44 * API for interacting with "application operation" tracking. 45 * 46 * <p>This API is not generally intended for third party application developers; most 47 * features are only available to system applications. 48 */ 49 @SystemService(Context.APP_OPS_SERVICE) 50 public class AppOpsManager { 51 /** 52 * <p>App ops allows callers to:</p> 53 * 54 * <ul> 55 * <li> Note when operations are happening, and find out if they are allowed for the current 56 * caller.</li> 57 * <li> Disallow specific apps from doing specific operations.</li> 58 * <li> Collect all of the current information about operations that have been executed or 59 * are not being allowed.</li> 60 * <li> Monitor for changes in whether an operation is allowed.</li> 61 * </ul> 62 * 63 * <p>Each operation is identified by a single integer; these integers are a fixed set of 64 * operations, enumerated by the OP_* constants. 65 * 66 * <p></p>When checking operations, the result is a "mode" integer indicating the current 67 * setting for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute 68 * the operation but fake its behavior enough so that the caller doesn't crash), 69 * MODE_ERRORED (throw a SecurityException back to the caller; the normal operation calls 70 * will do this for you). 71 */ 72 73 final Context mContext; 74 final IAppOpsService mService; 75 final ArrayMap<OnOpChangedListener, IAppOpsCallback> mModeWatchers 76 = new ArrayMap<OnOpChangedListener, IAppOpsCallback>(); 77 78 static IBinder sToken; 79 80 /** 81 * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is 82 * allowed to perform the given operation. 83 */ 84 public static final int MODE_ALLOWED = 0; 85 86 /** 87 * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is 88 * not allowed to perform the given operation, and this attempt should 89 * <em>silently fail</em> (it should not cause the app to crash). 90 */ 91 public static final int MODE_IGNORED = 1; 92 93 /** 94 * Result from {@link #checkOpNoThrow}, {@link #noteOpNoThrow}, {@link #startOpNoThrow}: the 95 * given caller is not allowed to perform the given operation, and this attempt should 96 * cause it to have a fatal error, typically a {@link SecurityException}. 97 */ 98 public static final int MODE_ERRORED = 2; 99 100 /** 101 * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller should 102 * use its default security check. This mode is not normally used; it should only be used 103 * with appop permissions, and callers must explicitly check for it and deal with it. 104 */ 105 public static final int MODE_DEFAULT = 3; 106 107 // when adding one of these: 108 // - increment _NUM_OP 109 // - add rows to sOpToSwitch, sOpToString, sOpNames, sOpToPerms, sOpDefault 110 // - add descriptive strings to Settings/res/values/arrays.xml 111 // - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app) 112 113 /** @hide No operation specified. */ 114 public static final int OP_NONE = -1; 115 /** @hide Access to coarse location information. */ 116 public static final int OP_COARSE_LOCATION = 0; 117 /** @hide Access to fine location information. */ 118 public static final int OP_FINE_LOCATION = 1; 119 /** @hide Causing GPS to run. */ 120 public static final int OP_GPS = 2; 121 /** @hide */ 122 public static final int OP_VIBRATE = 3; 123 /** @hide */ 124 public static final int OP_READ_CONTACTS = 4; 125 /** @hide */ 126 public static final int OP_WRITE_CONTACTS = 5; 127 /** @hide */ 128 public static final int OP_READ_CALL_LOG = 6; 129 /** @hide */ 130 public static final int OP_WRITE_CALL_LOG = 7; 131 /** @hide */ 132 public static final int OP_READ_CALENDAR = 8; 133 /** @hide */ 134 public static final int OP_WRITE_CALENDAR = 9; 135 /** @hide */ 136 public static final int OP_WIFI_SCAN = 10; 137 /** @hide */ 138 public static final int OP_POST_NOTIFICATION = 11; 139 /** @hide */ 140 public static final int OP_NEIGHBORING_CELLS = 12; 141 /** @hide */ 142 public static final int OP_CALL_PHONE = 13; 143 /** @hide */ 144 public static final int OP_READ_SMS = 14; 145 /** @hide */ 146 public static final int OP_WRITE_SMS = 15; 147 /** @hide */ 148 public static final int OP_RECEIVE_SMS = 16; 149 /** @hide */ 150 public static final int OP_RECEIVE_EMERGECY_SMS = 17; 151 /** @hide */ 152 public static final int OP_RECEIVE_MMS = 18; 153 /** @hide */ 154 public static final int OP_RECEIVE_WAP_PUSH = 19; 155 /** @hide */ 156 public static final int OP_SEND_SMS = 20; 157 /** @hide */ 158 public static final int OP_READ_ICC_SMS = 21; 159 /** @hide */ 160 public static final int OP_WRITE_ICC_SMS = 22; 161 /** @hide */ 162 public static final int OP_WRITE_SETTINGS = 23; 163 /** @hide */ 164 public static final int OP_SYSTEM_ALERT_WINDOW = 24; 165 /** @hide */ 166 public static final int OP_ACCESS_NOTIFICATIONS = 25; 167 /** @hide */ 168 public static final int OP_CAMERA = 26; 169 /** @hide */ 170 public static final int OP_RECORD_AUDIO = 27; 171 /** @hide */ 172 public static final int OP_PLAY_AUDIO = 28; 173 /** @hide */ 174 public static final int OP_READ_CLIPBOARD = 29; 175 /** @hide */ 176 public static final int OP_WRITE_CLIPBOARD = 30; 177 /** @hide */ 178 public static final int OP_TAKE_MEDIA_BUTTONS = 31; 179 /** @hide */ 180 public static final int OP_TAKE_AUDIO_FOCUS = 32; 181 /** @hide */ 182 public static final int OP_AUDIO_MASTER_VOLUME = 33; 183 /** @hide */ 184 public static final int OP_AUDIO_VOICE_VOLUME = 34; 185 /** @hide */ 186 public static final int OP_AUDIO_RING_VOLUME = 35; 187 /** @hide */ 188 public static final int OP_AUDIO_MEDIA_VOLUME = 36; 189 /** @hide */ 190 public static final int OP_AUDIO_ALARM_VOLUME = 37; 191 /** @hide */ 192 public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38; 193 /** @hide */ 194 public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39; 195 /** @hide */ 196 public static final int OP_WAKE_LOCK = 40; 197 /** @hide Continually monitoring location data. */ 198 public static final int OP_MONITOR_LOCATION = 41; 199 /** @hide Continually monitoring location data with a relatively high power request. */ 200 public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42; 201 /** @hide Retrieve current usage stats via {@link UsageStatsManager}. */ 202 public static final int OP_GET_USAGE_STATS = 43; 203 /** @hide */ 204 public static final int OP_MUTE_MICROPHONE = 44; 205 /** @hide */ 206 public static final int OP_TOAST_WINDOW = 45; 207 /** @hide Capture the device's display contents and/or audio */ 208 public static final int OP_PROJECT_MEDIA = 46; 209 /** @hide Activate a VPN connection without user intervention. */ 210 public static final int OP_ACTIVATE_VPN = 47; 211 /** @hide Access the WallpaperManagerAPI to write wallpapers. */ 212 public static final int OP_WRITE_WALLPAPER = 48; 213 /** @hide Received the assist structure from an app. */ 214 public static final int OP_ASSIST_STRUCTURE = 49; 215 /** @hide Received a screenshot from assist. */ 216 public static final int OP_ASSIST_SCREENSHOT = 50; 217 /** @hide Read the phone state. */ 218 public static final int OP_READ_PHONE_STATE = 51; 219 /** @hide Add voicemail messages to the voicemail content provider. */ 220 public static final int OP_ADD_VOICEMAIL = 52; 221 /** @hide Access APIs for SIP calling over VOIP or WiFi. */ 222 public static final int OP_USE_SIP = 53; 223 /** @hide Intercept outgoing calls. */ 224 public static final int OP_PROCESS_OUTGOING_CALLS = 54; 225 /** @hide User the fingerprint API. */ 226 public static final int OP_USE_FINGERPRINT = 55; 227 /** @hide Access to body sensors such as heart rate, etc. */ 228 public static final int OP_BODY_SENSORS = 56; 229 /** @hide Read previously received cell broadcast messages. */ 230 public static final int OP_READ_CELL_BROADCASTS = 57; 231 /** @hide Inject mock location into the system. */ 232 public static final int OP_MOCK_LOCATION = 58; 233 /** @hide Read external storage. */ 234 public static final int OP_READ_EXTERNAL_STORAGE = 59; 235 /** @hide Write external storage. */ 236 public static final int OP_WRITE_EXTERNAL_STORAGE = 60; 237 /** @hide Turned on the screen. */ 238 public static final int OP_TURN_SCREEN_ON = 61; 239 /** @hide Get device accounts. */ 240 public static final int OP_GET_ACCOUNTS = 62; 241 /** @hide Control whether an application is allowed to run in the background. */ 242 public static final int OP_RUN_IN_BACKGROUND = 63; 243 /** @hide */ 244 public static final int OP_AUDIO_ACCESSIBILITY_VOLUME = 64; 245 /** @hide Read the phone number. */ 246 public static final int OP_READ_PHONE_NUMBERS = 65; 247 /** @hide Request package installs through package installer */ 248 public static final int OP_REQUEST_INSTALL_PACKAGES = 66; 249 /** @hide Enter picture-in-picture. */ 250 public static final int OP_PICTURE_IN_PICTURE = 67; 251 /** @hide Instant app start foreground service. */ 252 public static final int OP_INSTANT_APP_START_FOREGROUND = 68; 253 /** @hide Answer incoming phone calls */ 254 public static final int OP_ANSWER_PHONE_CALLS = 69; 255 /** @hide */ 256 public static final int _NUM_OP = 70; 257 258 /** Access to coarse location information. */ 259 public static final String OPSTR_COARSE_LOCATION = "android:coarse_location"; 260 /** Access to fine location information. */ 261 public static final String OPSTR_FINE_LOCATION = 262 "android:fine_location"; 263 /** Continually monitoring location data. */ 264 public static final String OPSTR_MONITOR_LOCATION 265 = "android:monitor_location"; 266 /** Continually monitoring location data with a relatively high power request. */ 267 public static final String OPSTR_MONITOR_HIGH_POWER_LOCATION 268 = "android:monitor_location_high_power"; 269 /** Access to {@link android.app.usage.UsageStatsManager}. */ 270 public static final String OPSTR_GET_USAGE_STATS 271 = "android:get_usage_stats"; 272 /** Activate a VPN connection without user intervention. @hide */ 273 @SystemApi 274 public static final String OPSTR_ACTIVATE_VPN 275 = "android:activate_vpn"; 276 /** Allows an application to read the user's contacts data. */ 277 public static final String OPSTR_READ_CONTACTS 278 = "android:read_contacts"; 279 /** Allows an application to write to the user's contacts data. */ 280 public static final String OPSTR_WRITE_CONTACTS 281 = "android:write_contacts"; 282 /** Allows an application to read the user's call log. */ 283 public static final String OPSTR_READ_CALL_LOG 284 = "android:read_call_log"; 285 /** Allows an application to write to the user's call log. */ 286 public static final String OPSTR_WRITE_CALL_LOG 287 = "android:write_call_log"; 288 /** Allows an application to read the user's calendar data. */ 289 public static final String OPSTR_READ_CALENDAR 290 = "android:read_calendar"; 291 /** Allows an application to write to the user's calendar data. */ 292 public static final String OPSTR_WRITE_CALENDAR 293 = "android:write_calendar"; 294 /** Allows an application to initiate a phone call. */ 295 public static final String OPSTR_CALL_PHONE 296 = "android:call_phone"; 297 /** Allows an application to read SMS messages. */ 298 public static final String OPSTR_READ_SMS 299 = "android:read_sms"; 300 /** Allows an application to receive SMS messages. */ 301 public static final String OPSTR_RECEIVE_SMS 302 = "android:receive_sms"; 303 /** Allows an application to receive MMS messages. */ 304 public static final String OPSTR_RECEIVE_MMS 305 = "android:receive_mms"; 306 /** Allows an application to receive WAP push messages. */ 307 public static final String OPSTR_RECEIVE_WAP_PUSH 308 = "android:receive_wap_push"; 309 /** Allows an application to send SMS messages. */ 310 public static final String OPSTR_SEND_SMS 311 = "android:send_sms"; 312 /** Required to be able to access the camera device. */ 313 public static final String OPSTR_CAMERA 314 = "android:camera"; 315 /** Required to be able to access the microphone device. */ 316 public static final String OPSTR_RECORD_AUDIO 317 = "android:record_audio"; 318 /** Required to access phone state related information. */ 319 public static final String OPSTR_READ_PHONE_STATE 320 = "android:read_phone_state"; 321 /** Required to access phone state related information. */ 322 public static final String OPSTR_ADD_VOICEMAIL 323 = "android:add_voicemail"; 324 /** Access APIs for SIP calling over VOIP or WiFi */ 325 public static final String OPSTR_USE_SIP 326 = "android:use_sip"; 327 /** Access APIs for diverting outgoing calls */ 328 public static final String OPSTR_PROCESS_OUTGOING_CALLS 329 = "android:process_outgoing_calls"; 330 /** Use the fingerprint API. */ 331 public static final String OPSTR_USE_FINGERPRINT 332 = "android:use_fingerprint"; 333 /** Access to body sensors such as heart rate, etc. */ 334 public static final String OPSTR_BODY_SENSORS 335 = "android:body_sensors"; 336 /** Read previously received cell broadcast messages. */ 337 public static final String OPSTR_READ_CELL_BROADCASTS 338 = "android:read_cell_broadcasts"; 339 /** Inject mock location into the system. */ 340 public static final String OPSTR_MOCK_LOCATION 341 = "android:mock_location"; 342 /** Read external storage. */ 343 public static final String OPSTR_READ_EXTERNAL_STORAGE 344 = "android:read_external_storage"; 345 /** Write external storage. */ 346 public static final String OPSTR_WRITE_EXTERNAL_STORAGE 347 = "android:write_external_storage"; 348 /** Required to draw on top of other apps. */ 349 public static final String OPSTR_SYSTEM_ALERT_WINDOW 350 = "android:system_alert_window"; 351 /** Required to write/modify/update system settingss. */ 352 public static final String OPSTR_WRITE_SETTINGS 353 = "android:write_settings"; 354 /** @hide Get device accounts. */ 355 public static final String OPSTR_GET_ACCOUNTS 356 = "android:get_accounts"; 357 public static final String OPSTR_READ_PHONE_NUMBERS 358 = "android:read_phone_numbers"; 359 /** Access to picture-in-picture. */ 360 public static final String OPSTR_PICTURE_IN_PICTURE 361 = "android:picture_in_picture"; 362 /** @hide */ 363 public static final String OPSTR_INSTANT_APP_START_FOREGROUND 364 = "android:instant_app_start_foreground"; 365 /** Answer incoming phone calls */ 366 public static final String OPSTR_ANSWER_PHONE_CALLS 367 = "android:answer_phone_calls"; 368 369 // Warning: If an permission is added here it also has to be added to 370 // com.android.packageinstaller.permission.utils.EventLogger 371 private static final int[] RUNTIME_AND_APPOP_PERMISSIONS_OPS = { 372 // RUNTIME PERMISSIONS 373 // Contacts 374 OP_READ_CONTACTS, 375 OP_WRITE_CONTACTS, 376 OP_GET_ACCOUNTS, 377 // Calendar 378 OP_READ_CALENDAR, 379 OP_WRITE_CALENDAR, 380 // SMS 381 OP_SEND_SMS, 382 OP_RECEIVE_SMS, 383 OP_READ_SMS, 384 OP_RECEIVE_WAP_PUSH, 385 OP_RECEIVE_MMS, 386 OP_READ_CELL_BROADCASTS, 387 // Storage 388 OP_READ_EXTERNAL_STORAGE, 389 OP_WRITE_EXTERNAL_STORAGE, 390 // Location 391 OP_COARSE_LOCATION, 392 OP_FINE_LOCATION, 393 // Phone 394 OP_READ_PHONE_STATE, 395 OP_READ_PHONE_NUMBERS, 396 OP_CALL_PHONE, 397 OP_READ_CALL_LOG, 398 OP_WRITE_CALL_LOG, 399 OP_ADD_VOICEMAIL, 400 OP_USE_SIP, 401 OP_PROCESS_OUTGOING_CALLS, 402 OP_ANSWER_PHONE_CALLS, 403 // Microphone 404 OP_RECORD_AUDIO, 405 // Camera 406 OP_CAMERA, 407 // Body sensors 408 OP_BODY_SENSORS, 409 410 // APPOP PERMISSIONS 411 OP_ACCESS_NOTIFICATIONS, 412 OP_SYSTEM_ALERT_WINDOW, 413 OP_WRITE_SETTINGS, 414 OP_REQUEST_INSTALL_PACKAGES, 415 }; 416 417 /** 418 * This maps each operation to the operation that serves as the 419 * switch to determine whether it is allowed. Generally this is 420 * a 1:1 mapping, but for some things (like location) that have 421 * multiple low-level operations being tracked that should be 422 * presented to the user as one switch then this can be used to 423 * make them all controlled by the same single operation. 424 */ 425 private static int[] sOpToSwitch = new int[] { 426 OP_COARSE_LOCATION, 427 OP_COARSE_LOCATION, 428 OP_COARSE_LOCATION, 429 OP_VIBRATE, 430 OP_READ_CONTACTS, 431 OP_WRITE_CONTACTS, 432 OP_READ_CALL_LOG, 433 OP_WRITE_CALL_LOG, 434 OP_READ_CALENDAR, 435 OP_WRITE_CALENDAR, 436 OP_COARSE_LOCATION, 437 OP_POST_NOTIFICATION, 438 OP_COARSE_LOCATION, 439 OP_CALL_PHONE, 440 OP_READ_SMS, 441 OP_WRITE_SMS, 442 OP_RECEIVE_SMS, 443 OP_RECEIVE_SMS, 444 OP_RECEIVE_MMS, 445 OP_RECEIVE_WAP_PUSH, 446 OP_SEND_SMS, 447 OP_READ_SMS, 448 OP_WRITE_SMS, 449 OP_WRITE_SETTINGS, 450 OP_SYSTEM_ALERT_WINDOW, 451 OP_ACCESS_NOTIFICATIONS, 452 OP_CAMERA, 453 OP_RECORD_AUDIO, 454 OP_PLAY_AUDIO, 455 OP_READ_CLIPBOARD, 456 OP_WRITE_CLIPBOARD, 457 OP_TAKE_MEDIA_BUTTONS, 458 OP_TAKE_AUDIO_FOCUS, 459 OP_AUDIO_MASTER_VOLUME, 460 OP_AUDIO_VOICE_VOLUME, 461 OP_AUDIO_RING_VOLUME, 462 OP_AUDIO_MEDIA_VOLUME, 463 OP_AUDIO_ALARM_VOLUME, 464 OP_AUDIO_NOTIFICATION_VOLUME, 465 OP_AUDIO_BLUETOOTH_VOLUME, 466 OP_WAKE_LOCK, 467 OP_COARSE_LOCATION, 468 OP_COARSE_LOCATION, 469 OP_GET_USAGE_STATS, 470 OP_MUTE_MICROPHONE, 471 OP_TOAST_WINDOW, 472 OP_PROJECT_MEDIA, 473 OP_ACTIVATE_VPN, 474 OP_WRITE_WALLPAPER, 475 OP_ASSIST_STRUCTURE, 476 OP_ASSIST_SCREENSHOT, 477 OP_READ_PHONE_STATE, 478 OP_ADD_VOICEMAIL, 479 OP_USE_SIP, 480 OP_PROCESS_OUTGOING_CALLS, 481 OP_USE_FINGERPRINT, 482 OP_BODY_SENSORS, 483 OP_READ_CELL_BROADCASTS, 484 OP_MOCK_LOCATION, 485 OP_READ_EXTERNAL_STORAGE, 486 OP_WRITE_EXTERNAL_STORAGE, 487 OP_TURN_SCREEN_ON, 488 OP_GET_ACCOUNTS, 489 OP_RUN_IN_BACKGROUND, 490 OP_AUDIO_ACCESSIBILITY_VOLUME, 491 OP_READ_PHONE_NUMBERS, 492 OP_REQUEST_INSTALL_PACKAGES, 493 OP_PICTURE_IN_PICTURE, 494 OP_INSTANT_APP_START_FOREGROUND, 495 OP_ANSWER_PHONE_CALLS 496 }; 497 498 /** 499 * This maps each operation to the public string constant for it. 500 * If it doesn't have a public string constant, it maps to null. 501 */ 502 private static String[] sOpToString = new String[] { 503 OPSTR_COARSE_LOCATION, 504 OPSTR_FINE_LOCATION, 505 null, 506 null, 507 OPSTR_READ_CONTACTS, 508 OPSTR_WRITE_CONTACTS, 509 OPSTR_READ_CALL_LOG, 510 OPSTR_WRITE_CALL_LOG, 511 OPSTR_READ_CALENDAR, 512 OPSTR_WRITE_CALENDAR, 513 null, 514 null, 515 null, 516 OPSTR_CALL_PHONE, 517 OPSTR_READ_SMS, 518 null, 519 OPSTR_RECEIVE_SMS, 520 null, 521 OPSTR_RECEIVE_MMS, 522 OPSTR_RECEIVE_WAP_PUSH, 523 OPSTR_SEND_SMS, 524 null, 525 null, 526 OPSTR_WRITE_SETTINGS, 527 OPSTR_SYSTEM_ALERT_WINDOW, 528 null, 529 OPSTR_CAMERA, 530 OPSTR_RECORD_AUDIO, 531 null, 532 null, 533 null, 534 null, 535 null, 536 null, 537 null, 538 null, 539 null, 540 null, 541 null, 542 null, 543 null, 544 OPSTR_MONITOR_LOCATION, 545 OPSTR_MONITOR_HIGH_POWER_LOCATION, 546 OPSTR_GET_USAGE_STATS, 547 null, 548 null, 549 null, 550 OPSTR_ACTIVATE_VPN, 551 null, 552 null, 553 null, 554 OPSTR_READ_PHONE_STATE, 555 OPSTR_ADD_VOICEMAIL, 556 OPSTR_USE_SIP, 557 OPSTR_PROCESS_OUTGOING_CALLS, 558 OPSTR_USE_FINGERPRINT, 559 OPSTR_BODY_SENSORS, 560 OPSTR_READ_CELL_BROADCASTS, 561 OPSTR_MOCK_LOCATION, 562 OPSTR_READ_EXTERNAL_STORAGE, 563 OPSTR_WRITE_EXTERNAL_STORAGE, 564 null, 565 OPSTR_GET_ACCOUNTS, 566 null, 567 null, // OP_AUDIO_ACCESSIBILITY_VOLUME 568 OPSTR_READ_PHONE_NUMBERS, 569 null, // OP_REQUEST_INSTALL_PACKAGES 570 OPSTR_PICTURE_IN_PICTURE, 571 OPSTR_INSTANT_APP_START_FOREGROUND, 572 OPSTR_ANSWER_PHONE_CALLS, 573 }; 574 575 /** 576 * This provides a simple name for each operation to be used 577 * in debug output. 578 */ 579 private static String[] sOpNames = new String[] { 580 "COARSE_LOCATION", 581 "FINE_LOCATION", 582 "GPS", 583 "VIBRATE", 584 "READ_CONTACTS", 585 "WRITE_CONTACTS", 586 "READ_CALL_LOG", 587 "WRITE_CALL_LOG", 588 "READ_CALENDAR", 589 "WRITE_CALENDAR", 590 "WIFI_SCAN", 591 "POST_NOTIFICATION", 592 "NEIGHBORING_CELLS", 593 "CALL_PHONE", 594 "READ_SMS", 595 "WRITE_SMS", 596 "RECEIVE_SMS", 597 "RECEIVE_EMERGECY_SMS", 598 "RECEIVE_MMS", 599 "RECEIVE_WAP_PUSH", 600 "SEND_SMS", 601 "READ_ICC_SMS", 602 "WRITE_ICC_SMS", 603 "WRITE_SETTINGS", 604 "SYSTEM_ALERT_WINDOW", 605 "ACCESS_NOTIFICATIONS", 606 "CAMERA", 607 "RECORD_AUDIO", 608 "PLAY_AUDIO", 609 "READ_CLIPBOARD", 610 "WRITE_CLIPBOARD", 611 "TAKE_MEDIA_BUTTONS", 612 "TAKE_AUDIO_FOCUS", 613 "AUDIO_MASTER_VOLUME", 614 "AUDIO_VOICE_VOLUME", 615 "AUDIO_RING_VOLUME", 616 "AUDIO_MEDIA_VOLUME", 617 "AUDIO_ALARM_VOLUME", 618 "AUDIO_NOTIFICATION_VOLUME", 619 "AUDIO_BLUETOOTH_VOLUME", 620 "WAKE_LOCK", 621 "MONITOR_LOCATION", 622 "MONITOR_HIGH_POWER_LOCATION", 623 "GET_USAGE_STATS", 624 "MUTE_MICROPHONE", 625 "TOAST_WINDOW", 626 "PROJECT_MEDIA", 627 "ACTIVATE_VPN", 628 "WRITE_WALLPAPER", 629 "ASSIST_STRUCTURE", 630 "ASSIST_SCREENSHOT", 631 "OP_READ_PHONE_STATE", 632 "ADD_VOICEMAIL", 633 "USE_SIP", 634 "PROCESS_OUTGOING_CALLS", 635 "USE_FINGERPRINT", 636 "BODY_SENSORS", 637 "READ_CELL_BROADCASTS", 638 "MOCK_LOCATION", 639 "READ_EXTERNAL_STORAGE", 640 "WRITE_EXTERNAL_STORAGE", 641 "TURN_ON_SCREEN", 642 "GET_ACCOUNTS", 643 "RUN_IN_BACKGROUND", 644 "AUDIO_ACCESSIBILITY_VOLUME", 645 "READ_PHONE_NUMBERS", 646 "REQUEST_INSTALL_PACKAGES", 647 "PICTURE_IN_PICTURE", 648 "INSTANT_APP_START_FOREGROUND", 649 "ANSWER_PHONE_CALLS", 650 }; 651 652 /** 653 * This optionally maps a permission to an operation. If there 654 * is no permission associated with an operation, it is null. 655 */ 656 private static String[] sOpPerms = new String[] { 657 android.Manifest.permission.ACCESS_COARSE_LOCATION, 658 android.Manifest.permission.ACCESS_FINE_LOCATION, 659 null, 660 android.Manifest.permission.VIBRATE, 661 android.Manifest.permission.READ_CONTACTS, 662 android.Manifest.permission.WRITE_CONTACTS, 663 android.Manifest.permission.READ_CALL_LOG, 664 android.Manifest.permission.WRITE_CALL_LOG, 665 android.Manifest.permission.READ_CALENDAR, 666 android.Manifest.permission.WRITE_CALENDAR, 667 android.Manifest.permission.ACCESS_WIFI_STATE, 668 null, // no permission required for notifications 669 null, // neighboring cells shares the coarse location perm 670 android.Manifest.permission.CALL_PHONE, 671 android.Manifest.permission.READ_SMS, 672 null, // no permission required for writing sms 673 android.Manifest.permission.RECEIVE_SMS, 674 android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST, 675 android.Manifest.permission.RECEIVE_MMS, 676 android.Manifest.permission.RECEIVE_WAP_PUSH, 677 android.Manifest.permission.SEND_SMS, 678 android.Manifest.permission.READ_SMS, 679 null, // no permission required for writing icc sms 680 android.Manifest.permission.WRITE_SETTINGS, 681 android.Manifest.permission.SYSTEM_ALERT_WINDOW, 682 android.Manifest.permission.ACCESS_NOTIFICATIONS, 683 android.Manifest.permission.CAMERA, 684 android.Manifest.permission.RECORD_AUDIO, 685 null, // no permission for playing audio 686 null, // no permission for reading clipboard 687 null, // no permission for writing clipboard 688 null, // no permission for taking media buttons 689 null, // no permission for taking audio focus 690 null, // no permission for changing master volume 691 null, // no permission for changing voice volume 692 null, // no permission for changing ring volume 693 null, // no permission for changing media volume 694 null, // no permission for changing alarm volume 695 null, // no permission for changing notification volume 696 null, // no permission for changing bluetooth volume 697 android.Manifest.permission.WAKE_LOCK, 698 null, // no permission for generic location monitoring 699 null, // no permission for high power location monitoring 700 android.Manifest.permission.PACKAGE_USAGE_STATS, 701 null, // no permission for muting/unmuting microphone 702 null, // no permission for displaying toasts 703 null, // no permission for projecting media 704 null, // no permission for activating vpn 705 null, // no permission for supporting wallpaper 706 null, // no permission for receiving assist structure 707 null, // no permission for receiving assist screenshot 708 Manifest.permission.READ_PHONE_STATE, 709 Manifest.permission.ADD_VOICEMAIL, 710 Manifest.permission.USE_SIP, 711 Manifest.permission.PROCESS_OUTGOING_CALLS, 712 Manifest.permission.USE_FINGERPRINT, 713 Manifest.permission.BODY_SENSORS, 714 Manifest.permission.READ_CELL_BROADCASTS, 715 null, 716 Manifest.permission.READ_EXTERNAL_STORAGE, 717 Manifest.permission.WRITE_EXTERNAL_STORAGE, 718 null, // no permission for turning the screen on 719 Manifest.permission.GET_ACCOUNTS, 720 null, // no permission for running in background 721 null, // no permission for changing accessibility volume 722 Manifest.permission.READ_PHONE_NUMBERS, 723 Manifest.permission.REQUEST_INSTALL_PACKAGES, 724 null, // no permission for entering picture-in-picture on hide 725 Manifest.permission.INSTANT_APP_FOREGROUND_SERVICE, 726 Manifest.permission.ANSWER_PHONE_CALLS, 727 }; 728 729 /** 730 * Specifies whether an Op should be restricted by a user restriction. 731 * Each Op should be filled with a restriction string from UserManager or 732 * null to specify it is not affected by any user restriction. 733 */ 734 private static String[] sOpRestrictions = new String[] { 735 UserManager.DISALLOW_SHARE_LOCATION, //COARSE_LOCATION 736 UserManager.DISALLOW_SHARE_LOCATION, //FINE_LOCATION 737 UserManager.DISALLOW_SHARE_LOCATION, //GPS 738 null, //VIBRATE 739 null, //READ_CONTACTS 740 null, //WRITE_CONTACTS 741 UserManager.DISALLOW_OUTGOING_CALLS, //READ_CALL_LOG 742 UserManager.DISALLOW_OUTGOING_CALLS, //WRITE_CALL_LOG 743 null, //READ_CALENDAR 744 null, //WRITE_CALENDAR 745 UserManager.DISALLOW_SHARE_LOCATION, //WIFI_SCAN 746 null, //POST_NOTIFICATION 747 null, //NEIGHBORING_CELLS 748 null, //CALL_PHONE 749 UserManager.DISALLOW_SMS, //READ_SMS 750 UserManager.DISALLOW_SMS, //WRITE_SMS 751 UserManager.DISALLOW_SMS, //RECEIVE_SMS 752 null, //RECEIVE_EMERGENCY_SMS 753 UserManager.DISALLOW_SMS, //RECEIVE_MMS 754 null, //RECEIVE_WAP_PUSH 755 UserManager.DISALLOW_SMS, //SEND_SMS 756 UserManager.DISALLOW_SMS, //READ_ICC_SMS 757 UserManager.DISALLOW_SMS, //WRITE_ICC_SMS 758 null, //WRITE_SETTINGS 759 UserManager.DISALLOW_CREATE_WINDOWS, //SYSTEM_ALERT_WINDOW 760 null, //ACCESS_NOTIFICATIONS 761 UserManager.DISALLOW_CAMERA, //CAMERA 762 UserManager.DISALLOW_RECORD_AUDIO, //RECORD_AUDIO 763 null, //PLAY_AUDIO 764 null, //READ_CLIPBOARD 765 null, //WRITE_CLIPBOARD 766 null, //TAKE_MEDIA_BUTTONS 767 null, //TAKE_AUDIO_FOCUS 768 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_MASTER_VOLUME 769 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_VOICE_VOLUME 770 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_RING_VOLUME 771 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_MEDIA_VOLUME 772 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_ALARM_VOLUME 773 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_NOTIFICATION_VOLUME 774 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_BLUETOOTH_VOLUME 775 null, //WAKE_LOCK 776 UserManager.DISALLOW_SHARE_LOCATION, //MONITOR_LOCATION 777 UserManager.DISALLOW_SHARE_LOCATION, //MONITOR_HIGH_POWER_LOCATION 778 null, //GET_USAGE_STATS 779 UserManager.DISALLOW_UNMUTE_MICROPHONE, // MUTE_MICROPHONE 780 UserManager.DISALLOW_CREATE_WINDOWS, // TOAST_WINDOW 781 null, //PROJECT_MEDIA 782 null, // ACTIVATE_VPN 783 UserManager.DISALLOW_WALLPAPER, // WRITE_WALLPAPER 784 null, // ASSIST_STRUCTURE 785 null, // ASSIST_SCREENSHOT 786 null, // READ_PHONE_STATE 787 null, // ADD_VOICEMAIL 788 null, // USE_SIP 789 null, // PROCESS_OUTGOING_CALLS 790 null, // USE_FINGERPRINT 791 null, // BODY_SENSORS 792 null, // READ_CELL_BROADCASTS 793 null, // MOCK_LOCATION 794 null, // READ_EXTERNAL_STORAGE 795 null, // WRITE_EXTERNAL_STORAGE 796 null, // TURN_ON_SCREEN 797 null, // GET_ACCOUNTS 798 null, // RUN_IN_BACKGROUND 799 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_ACCESSIBILITY_VOLUME 800 null, // READ_PHONE_NUMBERS 801 null, // REQUEST_INSTALL_PACKAGES 802 null, // ENTER_PICTURE_IN_PICTURE_ON_HIDE 803 null, // INSTANT_APP_START_FOREGROUND 804 null, // ANSWER_PHONE_CALLS 805 }; 806 807 /** 808 * This specifies whether each option should allow the system 809 * (and system ui) to bypass the user restriction when active. 810 */ 811 private static boolean[] sOpAllowSystemRestrictionBypass = new boolean[] { 812 true, //COARSE_LOCATION 813 true, //FINE_LOCATION 814 false, //GPS 815 false, //VIBRATE 816 false, //READ_CONTACTS 817 false, //WRITE_CONTACTS 818 false, //READ_CALL_LOG 819 false, //WRITE_CALL_LOG 820 false, //READ_CALENDAR 821 false, //WRITE_CALENDAR 822 true, //WIFI_SCAN 823 false, //POST_NOTIFICATION 824 false, //NEIGHBORING_CELLS 825 false, //CALL_PHONE 826 false, //READ_SMS 827 false, //WRITE_SMS 828 false, //RECEIVE_SMS 829 false, //RECEIVE_EMERGECY_SMS 830 false, //RECEIVE_MMS 831 false, //RECEIVE_WAP_PUSH 832 false, //SEND_SMS 833 false, //READ_ICC_SMS 834 false, //WRITE_ICC_SMS 835 false, //WRITE_SETTINGS 836 true, //SYSTEM_ALERT_WINDOW 837 false, //ACCESS_NOTIFICATIONS 838 false, //CAMERA 839 false, //RECORD_AUDIO 840 false, //PLAY_AUDIO 841 false, //READ_CLIPBOARD 842 false, //WRITE_CLIPBOARD 843 false, //TAKE_MEDIA_BUTTONS 844 false, //TAKE_AUDIO_FOCUS 845 false, //AUDIO_MASTER_VOLUME 846 false, //AUDIO_VOICE_VOLUME 847 false, //AUDIO_RING_VOLUME 848 false, //AUDIO_MEDIA_VOLUME 849 false, //AUDIO_ALARM_VOLUME 850 false, //AUDIO_NOTIFICATION_VOLUME 851 false, //AUDIO_BLUETOOTH_VOLUME 852 false, //WAKE_LOCK 853 false, //MONITOR_LOCATION 854 false, //MONITOR_HIGH_POWER_LOCATION 855 false, //GET_USAGE_STATS 856 false, //MUTE_MICROPHONE 857 true, //TOAST_WINDOW 858 false, //PROJECT_MEDIA 859 false, //ACTIVATE_VPN 860 false, //WALLPAPER 861 false, //ASSIST_STRUCTURE 862 false, //ASSIST_SCREENSHOT 863 false, //READ_PHONE_STATE 864 false, //ADD_VOICEMAIL 865 false, // USE_SIP 866 false, // PROCESS_OUTGOING_CALLS 867 false, // USE_FINGERPRINT 868 false, // BODY_SENSORS 869 false, // READ_CELL_BROADCASTS 870 false, // MOCK_LOCATION 871 false, // READ_EXTERNAL_STORAGE 872 false, // WRITE_EXTERNAL_STORAGE 873 false, // TURN_ON_SCREEN 874 false, // GET_ACCOUNTS 875 false, // RUN_IN_BACKGROUND 876 false, // AUDIO_ACCESSIBILITY_VOLUME 877 false, // READ_PHONE_NUMBERS 878 false, // REQUEST_INSTALL_PACKAGES 879 false, // ENTER_PICTURE_IN_PICTURE_ON_HIDE 880 false, // INSTANT_APP_START_FOREGROUND 881 false, // ANSWER_PHONE_CALLS 882 }; 883 884 /** 885 * This specifies the default mode for each operation. 886 */ 887 private static int[] sOpDefaultMode = new int[] { 888 AppOpsManager.MODE_ALLOWED, 889 AppOpsManager.MODE_ALLOWED, 890 AppOpsManager.MODE_ALLOWED, 891 AppOpsManager.MODE_ALLOWED, 892 AppOpsManager.MODE_ALLOWED, 893 AppOpsManager.MODE_ALLOWED, 894 AppOpsManager.MODE_ALLOWED, 895 AppOpsManager.MODE_ALLOWED, 896 AppOpsManager.MODE_ALLOWED, 897 AppOpsManager.MODE_ALLOWED, 898 AppOpsManager.MODE_ALLOWED, 899 AppOpsManager.MODE_ALLOWED, 900 AppOpsManager.MODE_ALLOWED, 901 AppOpsManager.MODE_ALLOWED, 902 AppOpsManager.MODE_ALLOWED, 903 AppOpsManager.MODE_IGNORED, // OP_WRITE_SMS 904 AppOpsManager.MODE_ALLOWED, 905 AppOpsManager.MODE_ALLOWED, 906 AppOpsManager.MODE_ALLOWED, 907 AppOpsManager.MODE_ALLOWED, 908 AppOpsManager.MODE_ALLOWED, 909 AppOpsManager.MODE_ALLOWED, 910 AppOpsManager.MODE_ALLOWED, 911 AppOpsManager.MODE_DEFAULT, // OP_WRITE_SETTINGS 912 AppOpsManager.MODE_DEFAULT, // OP_SYSTEM_ALERT_WINDOW 913 AppOpsManager.MODE_ALLOWED, 914 AppOpsManager.MODE_ALLOWED, 915 AppOpsManager.MODE_ALLOWED, 916 AppOpsManager.MODE_ALLOWED, 917 AppOpsManager.MODE_ALLOWED, 918 AppOpsManager.MODE_ALLOWED, 919 AppOpsManager.MODE_ALLOWED, 920 AppOpsManager.MODE_ALLOWED, 921 AppOpsManager.MODE_ALLOWED, 922 AppOpsManager.MODE_ALLOWED, 923 AppOpsManager.MODE_ALLOWED, 924 AppOpsManager.MODE_ALLOWED, 925 AppOpsManager.MODE_ALLOWED, 926 AppOpsManager.MODE_ALLOWED, 927 AppOpsManager.MODE_ALLOWED, 928 AppOpsManager.MODE_ALLOWED, 929 AppOpsManager.MODE_ALLOWED, 930 AppOpsManager.MODE_ALLOWED, 931 AppOpsManager.MODE_DEFAULT, // OP_GET_USAGE_STATS 932 AppOpsManager.MODE_ALLOWED, 933 AppOpsManager.MODE_ALLOWED, 934 AppOpsManager.MODE_IGNORED, // OP_PROJECT_MEDIA 935 AppOpsManager.MODE_IGNORED, // OP_ACTIVATE_VPN 936 AppOpsManager.MODE_ALLOWED, 937 AppOpsManager.MODE_ALLOWED, 938 AppOpsManager.MODE_ALLOWED, 939 AppOpsManager.MODE_ALLOWED, 940 AppOpsManager.MODE_ALLOWED, 941 AppOpsManager.MODE_ALLOWED, 942 AppOpsManager.MODE_ALLOWED, 943 AppOpsManager.MODE_ALLOWED, 944 AppOpsManager.MODE_ALLOWED, 945 AppOpsManager.MODE_ALLOWED, 946 AppOpsManager.MODE_ERRORED, // OP_MOCK_LOCATION 947 AppOpsManager.MODE_ALLOWED, 948 AppOpsManager.MODE_ALLOWED, 949 AppOpsManager.MODE_ALLOWED, // OP_TURN_ON_SCREEN 950 AppOpsManager.MODE_ALLOWED, 951 AppOpsManager.MODE_ALLOWED, // OP_RUN_IN_BACKGROUND 952 AppOpsManager.MODE_ALLOWED, // OP_AUDIO_ACCESSIBILITY_VOLUME 953 AppOpsManager.MODE_ALLOWED, 954 AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES 955 AppOpsManager.MODE_ALLOWED, // OP_PICTURE_IN_PICTURE 956 AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND 957 AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS 958 }; 959 960 /** 961 * This specifies whether each option is allowed to be reset 962 * when resetting all app preferences. Disable reset for 963 * app ops that are under strong control of some part of the 964 * system (such as OP_WRITE_SMS, which should be allowed only 965 * for whichever app is selected as the current SMS app). 966 */ 967 private static boolean[] sOpDisableReset = new boolean[] { 968 false, 969 false, 970 false, 971 false, 972 false, 973 false, 974 false, 975 false, 976 false, 977 false, 978 false, 979 false, 980 false, 981 false, 982 false, 983 true, // OP_WRITE_SMS 984 false, 985 false, 986 false, 987 false, 988 false, 989 false, 990 false, 991 false, 992 false, 993 false, 994 false, 995 false, 996 false, 997 false, 998 false, 999 false, 1000 false, 1001 false, 1002 false, 1003 false, 1004 false, 1005 false, 1006 false, 1007 false, 1008 false, 1009 false, 1010 false, 1011 false, 1012 false, 1013 false, 1014 false, 1015 false, 1016 false, 1017 false, 1018 false, 1019 false, 1020 false, 1021 false, 1022 false, 1023 false, 1024 false, 1025 false, 1026 false, 1027 false, 1028 false, 1029 false, 1030 false, 1031 false, 1032 false, // OP_AUDIO_ACCESSIBILITY_VOLUME 1033 false, 1034 false, // OP_REQUEST_INSTALL_PACKAGES 1035 false, // OP_PICTURE_IN_PICTURE 1036 false, 1037 false, // ANSWER_PHONE_CALLS 1038 }; 1039 1040 /** 1041 * Mapping from an app op name to the app op code. 1042 */ 1043 private static HashMap<String, Integer> sOpStrToOp = new HashMap<>(); 1044 1045 /** 1046 * Mapping from a permission to the corresponding app op. 1047 */ 1048 private static HashMap<String, Integer> sPermToOp = new HashMap<>(); 1049 1050 static { 1051 if (sOpToSwitch.length != _NUM_OP) { 1052 throw new IllegalStateException("sOpToSwitch length " + sOpToSwitch.length 1053 + " should be " + _NUM_OP); 1054 } 1055 if (sOpToString.length != _NUM_OP) { 1056 throw new IllegalStateException("sOpToString length " + sOpToString.length 1057 + " should be " + _NUM_OP); 1058 } 1059 if (sOpNames.length != _NUM_OP) { 1060 throw new IllegalStateException("sOpNames length " + sOpNames.length 1061 + " should be " + _NUM_OP); 1062 } 1063 if (sOpPerms.length != _NUM_OP) { 1064 throw new IllegalStateException("sOpPerms length " + sOpPerms.length 1065 + " should be " + _NUM_OP); 1066 } 1067 if (sOpDefaultMode.length != _NUM_OP) { 1068 throw new IllegalStateException("sOpDefaultMode length " + sOpDefaultMode.length 1069 + " should be " + _NUM_OP); 1070 } 1071 if (sOpDisableReset.length != _NUM_OP) { 1072 throw new IllegalStateException("sOpDisableReset length " + sOpDisableReset.length 1073 + " should be " + _NUM_OP); 1074 } 1075 if (sOpRestrictions.length != _NUM_OP) { 1076 throw new IllegalStateException("sOpRestrictions length " + sOpRestrictions.length 1077 + " should be " + _NUM_OP); 1078 } 1079 if (sOpAllowSystemRestrictionBypass.length != _NUM_OP) { 1080 throw new IllegalStateException("sOpAllowSYstemRestrictionsBypass length " 1081 + sOpRestrictions.length + " should be " + _NUM_OP); 1082 } 1083 for (int i=0; i<_NUM_OP; i++) { 1084 if (sOpToString[i] != null) { sOpStrToOp.put(sOpToString[i], i)1085 sOpStrToOp.put(sOpToString[i], i); 1086 } 1087 } 1088 for (int op : RUNTIME_AND_APPOP_PERMISSIONS_OPS) { 1089 if (sOpPerms[op] != null) { sPermToOp.put(sOpPerms[op], op)1090 sPermToOp.put(sOpPerms[op], op); 1091 } 1092 } 1093 } 1094 1095 /** 1096 * Retrieve the op switch that controls the given operation. 1097 * @hide 1098 */ opToSwitch(int op)1099 public static int opToSwitch(int op) { 1100 return sOpToSwitch[op]; 1101 } 1102 1103 /** 1104 * Retrieve a non-localized name for the operation, for debugging output. 1105 * @hide 1106 */ opToName(int op)1107 public static String opToName(int op) { 1108 if (op == OP_NONE) return "NONE"; 1109 return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")"); 1110 } 1111 1112 /** 1113 * @hide 1114 */ strDebugOpToOp(String op)1115 public static int strDebugOpToOp(String op) { 1116 for (int i=0; i<sOpNames.length; i++) { 1117 if (sOpNames[i].equals(op)) { 1118 return i; 1119 } 1120 } 1121 throw new IllegalArgumentException("Unknown operation string: " + op); 1122 } 1123 1124 /** 1125 * Retrieve the permission associated with an operation, or null if there is not one. 1126 * @hide 1127 */ opToPermission(int op)1128 public static String opToPermission(int op) { 1129 return sOpPerms[op]; 1130 } 1131 1132 /** 1133 * Retrieve the user restriction associated with an operation, or null if there is not one. 1134 * @hide 1135 */ opToRestriction(int op)1136 public static String opToRestriction(int op) { 1137 return sOpRestrictions[op]; 1138 } 1139 1140 /** 1141 * Retrieve the app op code for a permission, or null if there is not one. 1142 * This API is intended to be used for mapping runtime or appop permissions 1143 * to the corresponding app op. 1144 * @hide 1145 */ permissionToOpCode(String permission)1146 public static int permissionToOpCode(String permission) { 1147 Integer boxedOpCode = sPermToOp.get(permission); 1148 return boxedOpCode != null ? boxedOpCode : OP_NONE; 1149 } 1150 1151 /** 1152 * Retrieve whether the op allows the system (and system ui) to 1153 * bypass the user restriction. 1154 * @hide 1155 */ opAllowSystemBypassRestriction(int op)1156 public static boolean opAllowSystemBypassRestriction(int op) { 1157 return sOpAllowSystemRestrictionBypass[op]; 1158 } 1159 1160 /** 1161 * Retrieve the default mode for the operation. 1162 * @hide 1163 */ opToDefaultMode(int op)1164 public static int opToDefaultMode(int op) { 1165 return sOpDefaultMode[op]; 1166 } 1167 1168 /** 1169 * Retrieve whether the op allows itself to be reset. 1170 * @hide 1171 */ opAllowsReset(int op)1172 public static boolean opAllowsReset(int op) { 1173 return !sOpDisableReset[op]; 1174 } 1175 1176 /** 1177 * Class holding all of the operation information associated with an app. 1178 * @hide 1179 */ 1180 public static class PackageOps implements Parcelable { 1181 private final String mPackageName; 1182 private final int mUid; 1183 private final List<OpEntry> mEntries; 1184 PackageOps(String packageName, int uid, List<OpEntry> entries)1185 public PackageOps(String packageName, int uid, List<OpEntry> entries) { 1186 mPackageName = packageName; 1187 mUid = uid; 1188 mEntries = entries; 1189 } 1190 getPackageName()1191 public String getPackageName() { 1192 return mPackageName; 1193 } 1194 getUid()1195 public int getUid() { 1196 return mUid; 1197 } 1198 getOps()1199 public List<OpEntry> getOps() { 1200 return mEntries; 1201 } 1202 1203 @Override describeContents()1204 public int describeContents() { 1205 return 0; 1206 } 1207 1208 @Override writeToParcel(Parcel dest, int flags)1209 public void writeToParcel(Parcel dest, int flags) { 1210 dest.writeString(mPackageName); 1211 dest.writeInt(mUid); 1212 dest.writeInt(mEntries.size()); 1213 for (int i=0; i<mEntries.size(); i++) { 1214 mEntries.get(i).writeToParcel(dest, flags); 1215 } 1216 } 1217 PackageOps(Parcel source)1218 PackageOps(Parcel source) { 1219 mPackageName = source.readString(); 1220 mUid = source.readInt(); 1221 mEntries = new ArrayList<OpEntry>(); 1222 final int N = source.readInt(); 1223 for (int i=0; i<N; i++) { 1224 mEntries.add(OpEntry.CREATOR.createFromParcel(source)); 1225 } 1226 } 1227 1228 public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() { 1229 @Override public PackageOps createFromParcel(Parcel source) { 1230 return new PackageOps(source); 1231 } 1232 1233 @Override public PackageOps[] newArray(int size) { 1234 return new PackageOps[size]; 1235 } 1236 }; 1237 } 1238 1239 /** 1240 * Class holding the information about one unique operation of an application. 1241 * @hide 1242 */ 1243 public static class OpEntry implements Parcelable { 1244 private final int mOp; 1245 private final int mMode; 1246 private final long mTime; 1247 private final long mRejectTime; 1248 private final int mDuration; 1249 private final int mProxyUid; 1250 private final String mProxyPackageName; 1251 OpEntry(int op, int mode, long time, long rejectTime, int duration, int proxyUid, String proxyPackage)1252 public OpEntry(int op, int mode, long time, long rejectTime, int duration, 1253 int proxyUid, String proxyPackage) { 1254 mOp = op; 1255 mMode = mode; 1256 mTime = time; 1257 mRejectTime = rejectTime; 1258 mDuration = duration; 1259 mProxyUid = proxyUid; 1260 mProxyPackageName = proxyPackage; 1261 } 1262 getOp()1263 public int getOp() { 1264 return mOp; 1265 } 1266 getMode()1267 public int getMode() { 1268 return mMode; 1269 } 1270 getTime()1271 public long getTime() { 1272 return mTime; 1273 } 1274 getRejectTime()1275 public long getRejectTime() { 1276 return mRejectTime; 1277 } 1278 isRunning()1279 public boolean isRunning() { 1280 return mDuration == -1; 1281 } 1282 getDuration()1283 public int getDuration() { 1284 return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration; 1285 } 1286 getProxyUid()1287 public int getProxyUid() { 1288 return mProxyUid; 1289 } 1290 getProxyPackageName()1291 public String getProxyPackageName() { 1292 return mProxyPackageName; 1293 } 1294 1295 @Override describeContents()1296 public int describeContents() { 1297 return 0; 1298 } 1299 1300 @Override writeToParcel(Parcel dest, int flags)1301 public void writeToParcel(Parcel dest, int flags) { 1302 dest.writeInt(mOp); 1303 dest.writeInt(mMode); 1304 dest.writeLong(mTime); 1305 dest.writeLong(mRejectTime); 1306 dest.writeInt(mDuration); 1307 dest.writeInt(mProxyUid); 1308 dest.writeString(mProxyPackageName); 1309 } 1310 OpEntry(Parcel source)1311 OpEntry(Parcel source) { 1312 mOp = source.readInt(); 1313 mMode = source.readInt(); 1314 mTime = source.readLong(); 1315 mRejectTime = source.readLong(); 1316 mDuration = source.readInt(); 1317 mProxyUid = source.readInt(); 1318 mProxyPackageName = source.readString(); 1319 } 1320 1321 public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() { 1322 @Override public OpEntry createFromParcel(Parcel source) { 1323 return new OpEntry(source); 1324 } 1325 1326 @Override public OpEntry[] newArray(int size) { 1327 return new OpEntry[size]; 1328 } 1329 }; 1330 } 1331 1332 /** 1333 * Callback for notification of changes to operation state. 1334 */ 1335 public interface OnOpChangedListener { onOpChanged(String op, String packageName)1336 public void onOpChanged(String op, String packageName); 1337 } 1338 1339 /** 1340 * Callback for notification of changes to operation state. 1341 * This allows you to see the raw op codes instead of strings. 1342 * @hide 1343 */ 1344 public static class OnOpChangedInternalListener implements OnOpChangedListener { onOpChanged(String op, String packageName)1345 public void onOpChanged(String op, String packageName) { } onOpChanged(int op, String packageName)1346 public void onOpChanged(int op, String packageName) { } 1347 } 1348 AppOpsManager(Context context, IAppOpsService service)1349 AppOpsManager(Context context, IAppOpsService service) { 1350 mContext = context; 1351 mService = service; 1352 } 1353 1354 /** 1355 * Retrieve current operation state for all applications. 1356 * 1357 * @param ops The set of operations you are interested in, or null if you want all of them. 1358 * @hide 1359 */ getPackagesForOps(int[] ops)1360 public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) { 1361 try { 1362 return mService.getPackagesForOps(ops); 1363 } catch (RemoteException e) { 1364 throw e.rethrowFromSystemServer(); 1365 } 1366 } 1367 1368 /** 1369 * Retrieve current operation state for one application. 1370 * 1371 * @param uid The uid of the application of interest. 1372 * @param packageName The name of the application of interest. 1373 * @param ops The set of operations you are interested in, or null if you want all of them. 1374 * @hide 1375 */ getOpsForPackage(int uid, String packageName, int[] ops)1376 public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) { 1377 try { 1378 return mService.getOpsForPackage(uid, packageName, ops); 1379 } catch (RemoteException e) { 1380 throw e.rethrowFromSystemServer(); 1381 } 1382 } 1383 1384 /** 1385 * Sets given app op in the specified mode for app ops in the UID. 1386 * This applies to all apps currently in the UID or installed in 1387 * this UID in the future. 1388 * 1389 * @param code The app op. 1390 * @param uid The UID for which to set the app. 1391 * @param mode The app op mode to set. 1392 * @hide 1393 */ setUidMode(int code, int uid, int mode)1394 public void setUidMode(int code, int uid, int mode) { 1395 try { 1396 mService.setUidMode(code, uid, mode); 1397 } catch (RemoteException e) { 1398 throw e.rethrowFromSystemServer(); 1399 } 1400 } 1401 1402 /** 1403 * Sets given app op in the specified mode for app ops in the UID. 1404 * This applies to all apps currently in the UID or installed in 1405 * this UID in the future. 1406 * 1407 * @param appOp The app op. 1408 * @param uid The UID for which to set the app. 1409 * @param mode The app op mode to set. 1410 * @hide 1411 */ 1412 @SystemApi 1413 @RequiresPermission(android.Manifest.permission.UPDATE_APP_OPS_STATS) setUidMode(String appOp, int uid, int mode)1414 public void setUidMode(String appOp, int uid, int mode) { 1415 try { 1416 mService.setUidMode(AppOpsManager.strOpToOp(appOp), uid, mode); 1417 } catch (RemoteException e) { 1418 throw e.rethrowFromSystemServer(); 1419 } 1420 } 1421 1422 /** @hide */ setUserRestriction(int code, boolean restricted, IBinder token)1423 public void setUserRestriction(int code, boolean restricted, IBinder token) { 1424 setUserRestriction(code, restricted, token, /*exceptionPackages*/null); 1425 } 1426 1427 /** @hide */ setUserRestriction(int code, boolean restricted, IBinder token, String[] exceptionPackages)1428 public void setUserRestriction(int code, boolean restricted, IBinder token, 1429 String[] exceptionPackages) { 1430 setUserRestrictionForUser(code, restricted, token, exceptionPackages, mContext.getUserId()); 1431 } 1432 1433 /** @hide */ setUserRestrictionForUser(int code, boolean restricted, IBinder token, String[] exceptionPackages, int userId)1434 public void setUserRestrictionForUser(int code, boolean restricted, IBinder token, 1435 String[] exceptionPackages, int userId) { 1436 try { 1437 mService.setUserRestriction(code, restricted, token, userId, exceptionPackages); 1438 } catch (RemoteException e) { 1439 throw e.rethrowFromSystemServer(); 1440 } 1441 } 1442 1443 /** @hide */ setMode(int code, int uid, String packageName, int mode)1444 public void setMode(int code, int uid, String packageName, int mode) { 1445 try { 1446 mService.setMode(code, uid, packageName, mode); 1447 } catch (RemoteException e) { 1448 throw e.rethrowFromSystemServer(); 1449 } 1450 } 1451 1452 /** 1453 * Set a non-persisted restriction on an audio operation at a stream-level. 1454 * Restrictions are temporary additional constraints imposed on top of the persisted rules 1455 * defined by {@link #setMode}. 1456 * 1457 * @param code The operation to restrict. 1458 * @param usage The {@link android.media.AudioAttributes} usage value. 1459 * @param mode The restriction mode (MODE_IGNORED,MODE_ERRORED) or MODE_ALLOWED to unrestrict. 1460 * @param exceptionPackages Optional list of packages to exclude from the restriction. 1461 * @hide 1462 */ setRestriction(int code, @AttributeUsage int usage, int mode, String[] exceptionPackages)1463 public void setRestriction(int code, @AttributeUsage int usage, int mode, 1464 String[] exceptionPackages) { 1465 try { 1466 final int uid = Binder.getCallingUid(); 1467 mService.setAudioRestriction(code, usage, uid, mode, exceptionPackages); 1468 } catch (RemoteException e) { 1469 throw e.rethrowFromSystemServer(); 1470 } 1471 } 1472 1473 /** @hide */ resetAllModes()1474 public void resetAllModes() { 1475 try { 1476 mService.resetAllModes(UserHandle.myUserId(), null); 1477 } catch (RemoteException e) { 1478 throw e.rethrowFromSystemServer(); 1479 } 1480 } 1481 1482 /** 1483 * Gets the app op name associated with a given permission. 1484 * The app op name is one of the public constants defined 1485 * in this class such as {@link #OPSTR_COARSE_LOCATION}. 1486 * This API is intended to be used for mapping runtime 1487 * permissions to the corresponding app op. 1488 * 1489 * @param permission The permission. 1490 * @return The app op associated with the permission or null. 1491 */ permissionToOp(String permission)1492 public static String permissionToOp(String permission) { 1493 final Integer opCode = sPermToOp.get(permission); 1494 if (opCode == null) { 1495 return null; 1496 } 1497 return sOpToString[opCode]; 1498 } 1499 1500 /** 1501 * Monitor for changes to the operating mode for the given op in the given app package. 1502 * @param op The operation to monitor, one of OPSTR_*. 1503 * @param packageName The name of the application to monitor. 1504 * @param callback Where to report changes. 1505 */ startWatchingMode(String op, String packageName, final OnOpChangedListener callback)1506 public void startWatchingMode(String op, String packageName, 1507 final OnOpChangedListener callback) { 1508 startWatchingMode(strOpToOp(op), packageName, callback); 1509 } 1510 1511 /** 1512 * Monitor for changes to the operating mode for the given op in the given app package. 1513 * @param op The operation to monitor, one of OP_*. 1514 * @param packageName The name of the application to monitor. 1515 * @param callback Where to report changes. 1516 * @hide 1517 */ startWatchingMode(int op, String packageName, final OnOpChangedListener callback)1518 public void startWatchingMode(int op, String packageName, final OnOpChangedListener callback) { 1519 synchronized (mModeWatchers) { 1520 IAppOpsCallback cb = mModeWatchers.get(callback); 1521 if (cb == null) { 1522 cb = new IAppOpsCallback.Stub() { 1523 public void opChanged(int op, int uid, String packageName) { 1524 if (callback instanceof OnOpChangedInternalListener) { 1525 ((OnOpChangedInternalListener)callback).onOpChanged(op, packageName); 1526 } 1527 if (sOpToString[op] != null) { 1528 callback.onOpChanged(sOpToString[op], packageName); 1529 } 1530 } 1531 }; 1532 mModeWatchers.put(callback, cb); 1533 } 1534 try { 1535 mService.startWatchingMode(op, packageName, cb); 1536 } catch (RemoteException e) { 1537 throw e.rethrowFromSystemServer(); 1538 } 1539 } 1540 } 1541 1542 /** 1543 * Stop monitoring that was previously started with {@link #startWatchingMode}. All 1544 * monitoring associated with this callback will be removed. 1545 */ stopWatchingMode(OnOpChangedListener callback)1546 public void stopWatchingMode(OnOpChangedListener callback) { 1547 synchronized (mModeWatchers) { 1548 IAppOpsCallback cb = mModeWatchers.get(callback); 1549 if (cb != null) { 1550 try { 1551 mService.stopWatchingMode(cb); 1552 } catch (RemoteException e) { 1553 throw e.rethrowFromSystemServer(); 1554 } 1555 } 1556 } 1557 } 1558 buildSecurityExceptionMsg(int op, int uid, String packageName)1559 private String buildSecurityExceptionMsg(int op, int uid, String packageName) { 1560 return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op]; 1561 } 1562 1563 /** 1564 * {@hide} 1565 */ strOpToOp(String op)1566 public static int strOpToOp(String op) { 1567 Integer val = sOpStrToOp.get(op); 1568 if (val == null) { 1569 throw new IllegalArgumentException("Unknown operation string: " + op); 1570 } 1571 return val; 1572 } 1573 1574 /** 1575 * Do a quick check for whether an application might be able to perform an operation. 1576 * This is <em>not</em> a security check; you must use {@link #noteOp(String, int, String)} 1577 * or {@link #startOp(String, int, String)} for your actual security checks, which also 1578 * ensure that the given uid and package name are consistent. This function can just be 1579 * used for a quick check to see if an operation has been disabled for the application, 1580 * as an early reject of some work. This does not modify the time stamp or other data 1581 * about the operation. 1582 * @param op The operation to check. One of the OPSTR_* constants. 1583 * @param uid The user id of the application attempting to perform the operation. 1584 * @param packageName The name of the application attempting to perform the operation. 1585 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1586 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1587 * causing the app to crash). 1588 * @throws SecurityException If the app has been configured to crash on this op. 1589 */ checkOp(String op, int uid, String packageName)1590 public int checkOp(String op, int uid, String packageName) { 1591 return checkOp(strOpToOp(op), uid, packageName); 1592 } 1593 1594 /** 1595 * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it 1596 * returns {@link #MODE_ERRORED}. 1597 */ checkOpNoThrow(String op, int uid, String packageName)1598 public int checkOpNoThrow(String op, int uid, String packageName) { 1599 return checkOpNoThrow(strOpToOp(op), uid, packageName); 1600 } 1601 1602 /** 1603 * Make note of an application performing an operation. Note that you must pass 1604 * in both the uid and name of the application to be checked; this function will verify 1605 * that these two match, and if not, return {@link #MODE_IGNORED}. If this call 1606 * succeeds, the last execution time of the operation for this app will be updated to 1607 * the current time. 1608 * @param op The operation to note. One of the OPSTR_* constants. 1609 * @param uid The user id of the application attempting to perform the operation. 1610 * @param packageName The name of the application attempting to perform the operation. 1611 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1612 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1613 * causing the app to crash). 1614 * @throws SecurityException If the app has been configured to crash on this op. 1615 */ noteOp(String op, int uid, String packageName)1616 public int noteOp(String op, int uid, String packageName) { 1617 return noteOp(strOpToOp(op), uid, packageName); 1618 } 1619 1620 /** 1621 * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it 1622 * returns {@link #MODE_ERRORED}. 1623 */ noteOpNoThrow(String op, int uid, String packageName)1624 public int noteOpNoThrow(String op, int uid, String packageName) { 1625 return noteOpNoThrow(strOpToOp(op), uid, packageName); 1626 } 1627 1628 /** 1629 * Make note of an application performing an operation on behalf of another 1630 * application when handling an IPC. Note that you must pass the package name 1631 * of the application that is being proxied while its UID will be inferred from 1632 * the IPC state; this function will verify that the calling uid and proxied 1633 * package name match, and if not, return {@link #MODE_IGNORED}. If this call 1634 * succeeds, the last execution time of the operation for the proxied app and 1635 * your app will be updated to the current time. 1636 * @param op The operation to note. One of the OPSTR_* constants. 1637 * @param proxiedPackageName The name of the application calling into the proxy application. 1638 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1639 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1640 * causing the app to crash). 1641 * @throws SecurityException If the app has been configured to crash on this op. 1642 */ noteProxyOp(String op, String proxiedPackageName)1643 public int noteProxyOp(String op, String proxiedPackageName) { 1644 return noteProxyOp(strOpToOp(op), proxiedPackageName); 1645 } 1646 1647 /** 1648 * Like {@link #noteProxyOp(String, String)} but instead 1649 * of throwing a {@link SecurityException} it returns {@link #MODE_ERRORED}. 1650 */ noteProxyOpNoThrow(String op, String proxiedPackageName)1651 public int noteProxyOpNoThrow(String op, String proxiedPackageName) { 1652 return noteProxyOpNoThrow(strOpToOp(op), proxiedPackageName); 1653 } 1654 1655 /** 1656 * Report that an application has started executing a long-running operation. Note that you 1657 * must pass in both the uid and name of the application to be checked; this function will 1658 * verify that these two match, and if not, return {@link #MODE_IGNORED}. If this call 1659 * succeeds, the last execution time of the operation for this app will be updated to 1660 * the current time and the operation will be marked as "running". In this case you must 1661 * later call {@link #finishOp(String, int, String)} to report when the application is no 1662 * longer performing the operation. 1663 * @param op The operation to start. One of the OPSTR_* constants. 1664 * @param uid The user id of the application attempting to perform the operation. 1665 * @param packageName The name of the application attempting to perform the operation. 1666 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1667 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1668 * causing the app to crash). 1669 * @throws SecurityException If the app has been configured to crash on this op. 1670 */ startOp(String op, int uid, String packageName)1671 public int startOp(String op, int uid, String packageName) { 1672 return startOp(strOpToOp(op), uid, packageName); 1673 } 1674 1675 /** 1676 * Like {@link #startOp} but instead of throwing a {@link SecurityException} it 1677 * returns {@link #MODE_ERRORED}. 1678 */ startOpNoThrow(String op, int uid, String packageName)1679 public int startOpNoThrow(String op, int uid, String packageName) { 1680 return startOpNoThrow(strOpToOp(op), uid, packageName); 1681 } 1682 1683 /** 1684 * Report that an application is no longer performing an operation that had previously 1685 * been started with {@link #startOp(String, int, String)}. There is no validation of input 1686 * or result; the parameters supplied here must be the exact same ones previously passed 1687 * in when starting the operation. 1688 */ finishOp(String op, int uid, String packageName)1689 public void finishOp(String op, int uid, String packageName) { 1690 finishOp(strOpToOp(op), uid, packageName); 1691 } 1692 1693 /** 1694 * Do a quick check for whether an application might be able to perform an operation. 1695 * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)} 1696 * or {@link #startOp(int, int, String)} for your actual security checks, which also 1697 * ensure that the given uid and package name are consistent. This function can just be 1698 * used for a quick check to see if an operation has been disabled for the application, 1699 * as an early reject of some work. This does not modify the time stamp or other data 1700 * about the operation. 1701 * @param op The operation to check. One of the OP_* constants. 1702 * @param uid The user id of the application attempting to perform the operation. 1703 * @param packageName The name of the application attempting to perform the operation. 1704 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1705 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1706 * causing the app to crash). 1707 * @throws SecurityException If the app has been configured to crash on this op. 1708 * @hide 1709 */ checkOp(int op, int uid, String packageName)1710 public int checkOp(int op, int uid, String packageName) { 1711 try { 1712 int mode = mService.checkOperation(op, uid, packageName); 1713 if (mode == MODE_ERRORED) { 1714 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1715 } 1716 return mode; 1717 } catch (RemoteException e) { 1718 throw e.rethrowFromSystemServer(); 1719 } 1720 } 1721 1722 /** 1723 * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it 1724 * returns {@link #MODE_ERRORED}. 1725 * @hide 1726 */ checkOpNoThrow(int op, int uid, String packageName)1727 public int checkOpNoThrow(int op, int uid, String packageName) { 1728 try { 1729 return mService.checkOperation(op, uid, packageName); 1730 } catch (RemoteException e) { 1731 throw e.rethrowFromSystemServer(); 1732 } 1733 } 1734 1735 /** 1736 * Do a quick check to validate if a package name belongs to a UID. 1737 * 1738 * @throws SecurityException if the package name doesn't belong to the given 1739 * UID, or if ownership cannot be verified. 1740 */ checkPackage(int uid, String packageName)1741 public void checkPackage(int uid, String packageName) { 1742 try { 1743 if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) { 1744 throw new SecurityException( 1745 "Package " + packageName + " does not belong to " + uid); 1746 } 1747 } catch (RemoteException e) { 1748 throw e.rethrowFromSystemServer(); 1749 } 1750 } 1751 1752 /** 1753 * Like {@link #checkOp} but at a stream-level for audio operations. 1754 * @hide 1755 */ checkAudioOp(int op, int stream, int uid, String packageName)1756 public int checkAudioOp(int op, int stream, int uid, String packageName) { 1757 try { 1758 final int mode = mService.checkAudioOperation(op, stream, uid, packageName); 1759 if (mode == MODE_ERRORED) { 1760 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1761 } 1762 return mode; 1763 } catch (RemoteException e) { 1764 throw e.rethrowFromSystemServer(); 1765 } 1766 } 1767 1768 /** 1769 * Like {@link #checkAudioOp} but instead of throwing a {@link SecurityException} it 1770 * returns {@link #MODE_ERRORED}. 1771 * @hide 1772 */ checkAudioOpNoThrow(int op, int stream, int uid, String packageName)1773 public int checkAudioOpNoThrow(int op, int stream, int uid, String packageName) { 1774 try { 1775 return mService.checkAudioOperation(op, stream, uid, packageName); 1776 } catch (RemoteException e) { 1777 throw e.rethrowFromSystemServer(); 1778 } 1779 } 1780 1781 /** 1782 * Make note of an application performing an operation. Note that you must pass 1783 * in both the uid and name of the application to be checked; this function will verify 1784 * that these two match, and if not, return {@link #MODE_IGNORED}. If this call 1785 * succeeds, the last execution time of the operation for this app will be updated to 1786 * the current time. 1787 * @param op The operation to note. One of the OP_* constants. 1788 * @param uid The user id of the application attempting to perform the operation. 1789 * @param packageName The name of the application attempting to perform the operation. 1790 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1791 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1792 * causing the app to crash). 1793 * @throws SecurityException If the app has been configured to crash on this op. 1794 * @hide 1795 */ noteOp(int op, int uid, String packageName)1796 public int noteOp(int op, int uid, String packageName) { 1797 try { 1798 int mode = mService.noteOperation(op, uid, packageName); 1799 if (mode == MODE_ERRORED) { 1800 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1801 } 1802 return mode; 1803 } catch (RemoteException e) { 1804 throw e.rethrowFromSystemServer(); 1805 } 1806 } 1807 1808 /** 1809 * Make note of an application performing an operation on behalf of another 1810 * application when handling an IPC. Note that you must pass the package name 1811 * of the application that is being proxied while its UID will be inferred from 1812 * the IPC state; this function will verify that the calling uid and proxied 1813 * package name match, and if not, return {@link #MODE_IGNORED}. If this call 1814 * succeeds, the last execution time of the operation for the proxied app and 1815 * your app will be updated to the current time. 1816 * @param op The operation to note. One of the OPSTR_* constants. 1817 * @param proxiedPackageName The name of the application calling into the proxy application. 1818 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1819 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1820 * causing the app to crash). 1821 * @throws SecurityException If the proxy or proxied app has been configured to 1822 * crash on this op. 1823 * 1824 * @hide 1825 */ noteProxyOp(int op, String proxiedPackageName)1826 public int noteProxyOp(int op, String proxiedPackageName) { 1827 int mode = noteProxyOpNoThrow(op, proxiedPackageName); 1828 if (mode == MODE_ERRORED) { 1829 throw new SecurityException("Proxy package " + mContext.getOpPackageName() 1830 + " from uid " + Process.myUid() + " or calling package " 1831 + proxiedPackageName + " from uid " + Binder.getCallingUid() 1832 + " not allowed to perform " + sOpNames[op]); 1833 } 1834 return mode; 1835 } 1836 1837 /** 1838 * Like {@link #noteProxyOp(int, String)} but instead 1839 * of throwing a {@link SecurityException} it returns {@link #MODE_ERRORED}. 1840 * @hide 1841 */ noteProxyOpNoThrow(int op, String proxiedPackageName)1842 public int noteProxyOpNoThrow(int op, String proxiedPackageName) { 1843 try { 1844 return mService.noteProxyOperation(op, mContext.getOpPackageName(), 1845 Binder.getCallingUid(), proxiedPackageName); 1846 } catch (RemoteException e) { 1847 throw e.rethrowFromSystemServer(); 1848 } 1849 } 1850 1851 /** 1852 * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it 1853 * returns {@link #MODE_ERRORED}. 1854 * @hide 1855 */ noteOpNoThrow(int op, int uid, String packageName)1856 public int noteOpNoThrow(int op, int uid, String packageName) { 1857 try { 1858 return mService.noteOperation(op, uid, packageName); 1859 } catch (RemoteException e) { 1860 throw e.rethrowFromSystemServer(); 1861 } 1862 } 1863 1864 /** @hide */ noteOp(int op)1865 public int noteOp(int op) { 1866 return noteOp(op, Process.myUid(), mContext.getOpPackageName()); 1867 } 1868 1869 /** @hide */ getToken(IAppOpsService service)1870 public static IBinder getToken(IAppOpsService service) { 1871 synchronized (AppOpsManager.class) { 1872 if (sToken != null) { 1873 return sToken; 1874 } 1875 try { 1876 sToken = service.getToken(new Binder()); 1877 } catch (RemoteException e) { 1878 throw e.rethrowFromSystemServer(); 1879 } 1880 return sToken; 1881 } 1882 } 1883 1884 /** 1885 * Report that an application has started executing a long-running operation. Note that you 1886 * must pass in both the uid and name of the application to be checked; this function will 1887 * verify that these two match, and if not, return {@link #MODE_IGNORED}. If this call 1888 * succeeds, the last execution time of the operation for this app will be updated to 1889 * the current time and the operation will be marked as "running". In this case you must 1890 * later call {@link #finishOp(int, int, String)} to report when the application is no 1891 * longer performing the operation. 1892 * @param op The operation to start. One of the OP_* constants. 1893 * @param uid The user id of the application attempting to perform the operation. 1894 * @param packageName The name of the application attempting to perform the operation. 1895 * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or 1896 * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without 1897 * causing the app to crash). 1898 * @throws SecurityException If the app has been configured to crash on this op. 1899 * @hide 1900 */ startOp(int op, int uid, String packageName)1901 public int startOp(int op, int uid, String packageName) { 1902 try { 1903 int mode = mService.startOperation(getToken(mService), op, uid, packageName); 1904 if (mode == MODE_ERRORED) { 1905 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName)); 1906 } 1907 return mode; 1908 } catch (RemoteException e) { 1909 throw e.rethrowFromSystemServer(); 1910 } 1911 } 1912 1913 /** 1914 * Like {@link #startOp} but instead of throwing a {@link SecurityException} it 1915 * returns {@link #MODE_ERRORED}. 1916 * @hide 1917 */ startOpNoThrow(int op, int uid, String packageName)1918 public int startOpNoThrow(int op, int uid, String packageName) { 1919 try { 1920 return mService.startOperation(getToken(mService), op, uid, packageName); 1921 } catch (RemoteException e) { 1922 throw e.rethrowFromSystemServer(); 1923 } 1924 } 1925 1926 /** @hide */ startOp(int op)1927 public int startOp(int op) { 1928 return startOp(op, Process.myUid(), mContext.getOpPackageName()); 1929 } 1930 1931 /** 1932 * Report that an application is no longer performing an operation that had previously 1933 * been started with {@link #startOp(int, int, String)}. There is no validation of input 1934 * or result; the parameters supplied here must be the exact same ones previously passed 1935 * in when starting the operation. 1936 * @hide 1937 */ finishOp(int op, int uid, String packageName)1938 public void finishOp(int op, int uid, String packageName) { 1939 try { 1940 mService.finishOperation(getToken(mService), op, uid, packageName); 1941 } catch (RemoteException e) { 1942 throw e.rethrowFromSystemServer(); 1943 } 1944 } 1945 1946 /** @hide */ finishOp(int op)1947 public void finishOp(int op) { 1948 finishOp(op, Process.myUid(), mContext.getOpPackageName()); 1949 } 1950 1951 /** @hide */ isOperationActive(int code, int uid, String packageName)1952 public boolean isOperationActive(int code, int uid, String packageName) { 1953 try { 1954 return mService.isOperationActive(code, uid, packageName); 1955 } catch (RemoteException e) { 1956 throw e.rethrowFromSystemServer(); 1957 } 1958 } 1959 } 1960