blob: b331d84010d03b15c525dd7b16d9b0624e9b35fd [file] [log] [blame]
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001/*
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
17package android.app;
18
Svet Ganov16a16892015-04-16 10:32:04 -070019import android.Manifest;
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060020import android.annotation.RequiresPermission;
Jeff Davidson05542602014-08-11 14:07:27 -070021import android.annotation.SystemApi;
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060022import android.annotation.SystemService;
Jeff Davidson05542602014-08-11 14:07:27 -070023import android.app.usage.UsageStatsManager;
24import android.content.Context;
John Spurlock7b414672014-07-18 13:02:39 -040025import android.media.AudioAttributes.AttributeUsage;
Dianne Hackborne98f5db2013-07-17 17:23:25 -070026import android.os.Binder;
27import android.os.IBinder;
Dianne Hackborn35654b62013-01-14 17:38:02 -080028import android.os.Parcel;
29import android.os.Parcelable;
Dianne Hackborna06de0f2012-12-11 16:34:47 -080030import android.os.Process;
31import android.os.RemoteException;
Dianne Hackborn7b7c58b2014-12-02 18:32:20 -080032import android.os.UserHandle;
Jeff Davidson05542602014-08-11 14:07:27 -070033import android.os.UserManager;
34import android.util.ArrayMap;
35
36import com.android.internal.app.IAppOpsCallback;
37import com.android.internal.app.IAppOpsService;
38
39import java.util.ArrayList;
40import java.util.HashMap;
41import java.util.List;
Dianne Hackborna06de0f2012-12-11 16:34:47 -080042
Dianne Hackbornd7d28e62013-02-12 14:59:53 -080043/**
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070044 * API for interacting with "application operation" tracking.
Dianne Hackbornd7d28e62013-02-12 14:59:53 -080045 *
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070046 * <p>This API is not generally intended for third party application developers; most
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060047 * features are only available to system applications.
Dianne Hackbornd7d28e62013-02-12 14:59:53 -080048 */
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -060049@SystemService(Context.APP_OPS_SERVICE)
Dianne Hackborna06de0f2012-12-11 16:34:47 -080050public class AppOpsManager {
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070051 /**
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
Dianne Hackborna06de0f2012-12-11 16:34:47 -080073 final Context mContext;
74 final IAppOpsService mService;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070075 final ArrayMap<OnOpChangedListener, IAppOpsCallback> mModeWatchers
76 = new ArrayMap<OnOpChangedListener, IAppOpsCallback>();
Dianne Hackborna06de0f2012-12-11 16:34:47 -080077
Dianne Hackborne98f5db2013-07-17 17:23:25 -070078 static IBinder sToken;
79
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070080 /**
81 * Result from {@link #checkOp}, {@link #noteOp}, {@link #startOp}: the given caller is
82 * allowed to perform the given operation.
83 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -080084 public static final int MODE_ALLOWED = 0;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070085
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 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -080091 public static final int MODE_IGNORED = 1;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -070092
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 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -080098 public static final int MODE_ERRORED = 2;
99
Dianne Hackborn33f5ddd2014-07-21 15:35:45 -0700100 /**
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
Daniel Sandlerfde19b12013-01-17 00:21:05 -0500107 // when adding one of these:
108 // - increment _NUM_OP
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -0700109 // - add rows to sOpToSwitch, sOpToString, sOpNames, sOpToPerms, sOpDefault
Daniel Sandlerfde19b12013-01-17 00:21:05 -0500110 // - add descriptive strings to Settings/res/values/arrays.xml
David Christie0b837452013-07-29 16:02:13 -0700111 // - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app)
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700112
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700113 /** @hide No operation specified. */
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800114 public static final int OP_NONE = -1;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700115 /** @hide Access to coarse location information. */
Dianne Hackborn35654b62013-01-14 17:38:02 -0800116 public static final int OP_COARSE_LOCATION = 0;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700117 /** @hide Access to fine location information. */
Dianne Hackborn35654b62013-01-14 17:38:02 -0800118 public static final int OP_FINE_LOCATION = 1;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700119 /** @hide Causing GPS to run. */
Dianne Hackborn35654b62013-01-14 17:38:02 -0800120 public static final int OP_GPS = 2;
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800121 /** @hide */
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700122 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;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700197 /** @hide Continually monitoring location data. */
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700198 public static final int OP_MONITOR_LOCATION = 41;
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700199 /** @hide Continually monitoring location data with a relatively high power request. */
David Christie0b837452013-07-29 16:02:13 -0700200 public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42;
Dianne Hackborne22b3b12014-05-07 18:06:44 -0700201 /** @hide Retrieve current usage stats via {@link UsageStatsManager}. */
202 public static final int OP_GET_USAGE_STATS = 43;
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700203 /** @hide */
Emily Bernier22c921a2014-05-28 11:01:32 -0400204 public static final int OP_MUTE_MICROPHONE = 44;
205 /** @hide */
Jason Monk1c7c3192014-06-26 12:52:18 -0400206 public static final int OP_TOAST_WINDOW = 45;
Michael Wrightc39d47a2014-07-08 18:07:36 -0700207 /** @hide Capture the device's display contents and/or audio */
208 public static final int OP_PROJECT_MEDIA = 46;
Jeff Davidson05542602014-08-11 14:07:27 -0700209 /** @hide Activate a VPN connection without user intervention. */
210 public static final int OP_ACTIVATE_VPN = 47;
Benjamin Franzf3ece362015-02-11 10:51:10 +0000211 /** @hide Access the WallpaperManagerAPI to write wallpapers. */
212 public static final int OP_WRITE_WALLPAPER = 48;
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700213 /** @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;
Svet Ganov16a16892015-04-16 10:32:04 -0700217 /** @hide Read the phone state. */
218 public static final int OP_READ_PHONE_STATE = 51;
Svet Ganovc3300092015-04-17 09:07:22 -0700219 /** @hide Add voicemail messages to the voicemail content provider. */
220 public static final int OP_ADD_VOICEMAIL = 52;
Svetoslav5335b672015-04-29 12:00:51 -0700221 /** @hide Access APIs for SIP calling over VOIP or WiFi. */
222 public static final int OP_USE_SIP = 53;
Svetoslavc656e6f2015-04-29 14:08:16 -0700223 /** @hide Intercept outgoing calls. */
224 public static final int OP_PROCESS_OUTGOING_CALLS = 54;
Svetoslav4af76a52015-04-29 15:29:46 -0700225 /** @hide User the fingerprint API. */
226 public static final int OP_USE_FINGERPRINT = 55;
Svet Ganovb9d71a62015-04-30 10:38:13 -0700227 /** @hide Access to body sensors such as heart rate, etc. */
228 public static final int OP_BODY_SENSORS = 56;
Svet Ganovede43162015-05-02 17:42:44 -0700229 /** @hide Read previously received cell broadcast messages. */
230 public static final int OP_READ_CELL_BROADCASTS = 57;
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700231 /** @hide Inject mock location into the system. */
232 public static final int OP_MOCK_LOCATION = 58;
Svet Ganov921c7df2015-06-29 21:51:41 -0700233 /** @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;
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700237 /** @hide Turned on the screen. */
238 public static final int OP_TURN_SCREEN_ON = 61;
Svetoslavf3f02ac2015-09-08 14:36:35 -0700239 /** @hide Get device accounts. */
240 public static final int OP_GET_ACCOUNTS = 62;
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700241 /** @hide Control whether an application is allowed to run in the background. */
242 public static final int OP_RUN_IN_BACKGROUND = 63;
Jason Monk1c7c3192014-06-26 12:52:18 -0400243 /** @hide */
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800244 public static final int OP_AUDIO_ACCESSIBILITY_VOLUME = 64;
Chad Brubaker73ec8f92016-11-10 11:24:40 -0800245 /** @hide Read the phone number. */
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700246 public static final int OP_READ_PHONE_NUMBERS = 65;
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800247 /** @hide Request package installs through package installer */
248 public static final int OP_REQUEST_INSTALL_PACKAGES = 66;
Winson Chungf4ac0632017-03-17 12:34:12 -0700249 /** @hide Enter picture-in-picture. */
250 public static final int OP_PICTURE_IN_PICTURE = 67;
Chad Brubaker97b383f2017-02-02 15:04:35 -0800251 /** @hide Instant app start foreground service. */
252 public static final int OP_INSTANT_APP_START_FOREGROUND = 68;
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800253 /** @hide Answer incoming phone calls */
254 public static final int OP_ANSWER_PHONE_CALLS = 69;
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800255 /** @hide */
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800256 public static final int _NUM_OP = 70;
Dianne Hackborna06de0f2012-12-11 16:34:47 -0800257
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700258 /** Access to coarse location information. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700259 public static final String OPSTR_COARSE_LOCATION = "android:coarse_location";
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700260 /** 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";
Dianne Hackborn5064e7c2014-09-02 10:57:16 -0700269 /** Access to {@link android.app.usage.UsageStatsManager}. */
270 public static final String OPSTR_GET_USAGE_STATS
271 = "android:get_usage_stats";
Jeff Davidson05542602014-08-11 14:07:27 -0700272 /** Activate a VPN connection without user intervention. @hide */
273 @SystemApi
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700274 public static final String OPSTR_ACTIVATE_VPN
275 = "android:activate_vpn";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700276 /** Allows an application to read the user's contacts data. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700277 public static final String OPSTR_READ_CONTACTS
278 = "android:read_contacts";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700279 /** Allows an application to write to the user's contacts data. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700280 public static final String OPSTR_WRITE_CONTACTS
281 = "android:write_contacts";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700282 /** Allows an application to read the user's call log. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700283 public static final String OPSTR_READ_CALL_LOG
284 = "android:read_call_log";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700285 /** Allows an application to write to the user's call log. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700286 public static final String OPSTR_WRITE_CALL_LOG
287 = "android:write_call_log";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700288 /** Allows an application to read the user's calendar data. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700289 public static final String OPSTR_READ_CALENDAR
290 = "android:read_calendar";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700291 /** Allows an application to write to the user's calendar data. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700292 public static final String OPSTR_WRITE_CALENDAR
293 = "android:write_calendar";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700294 /** Allows an application to initiate a phone call. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700295 public static final String OPSTR_CALL_PHONE
296 = "android:call_phone";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700297 /** Allows an application to read SMS messages. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700298 public static final String OPSTR_READ_SMS
299 = "android:read_sms";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700300 /** Allows an application to receive SMS messages. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700301 public static final String OPSTR_RECEIVE_SMS
302 = "android:receive_sms";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700303 /** Allows an application to receive MMS messages. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700304 public static final String OPSTR_RECEIVE_MMS
305 = "android:receive_mms";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700306 /** Allows an application to receive WAP push messages. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700307 public static final String OPSTR_RECEIVE_WAP_PUSH
308 = "android:receive_wap_push";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700309 /** Allows an application to send SMS messages. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700310 public static final String OPSTR_SEND_SMS
311 = "android:send_sms";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700312 /** Required to be able to access the camera device. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700313 public static final String OPSTR_CAMERA
314 = "android:camera";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700315 /** Required to be able to access the microphone device. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700316 public static final String OPSTR_RECORD_AUDIO
317 = "android:record_audio";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700318 /** Required to access phone state related information. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700319 public static final String OPSTR_READ_PHONE_STATE
320 = "android:read_phone_state";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700321 /** Required to access phone state related information. */
Svet Ganov6e8f67c2015-04-29 17:35:19 -0700322 public static final String OPSTR_ADD_VOICEMAIL
323 = "android:add_voicemail";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700324 /** Access APIs for SIP calling over VOIP or WiFi */
Svet Ganovb9d71a62015-04-30 10:38:13 -0700325 public static final String OPSTR_USE_SIP
326 = "android:use_sip";
Svet Ganove8e89422016-09-22 19:56:50 -0700327 /** Access APIs for diverting outgoing calls */
Svet Ganov824ad6e2016-09-22 19:36:53 -0700328 public static final String OPSTR_PROCESS_OUTGOING_CALLS
329 = "android:process_outgoing_calls";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700330 /** Use the fingerprint API. */
Svet Ganovb9d71a62015-04-30 10:38:13 -0700331 public static final String OPSTR_USE_FINGERPRINT
332 = "android:use_fingerprint";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700333 /** Access to body sensors such as heart rate, etc. */
Svet Ganovb9d71a62015-04-30 10:38:13 -0700334 public static final String OPSTR_BODY_SENSORS
335 = "android:body_sensors";
Svet Ganov715cf2a2015-06-13 17:31:29 -0700336 /** Read previously received cell broadcast messages. */
Svet Ganovede43162015-05-02 17:42:44 -0700337 public static final String OPSTR_READ_CELL_BROADCASTS
338 = "android:read_cell_broadcasts";
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700339 /** Inject mock location into the system. */
340 public static final String OPSTR_MOCK_LOCATION
341 = "android:mock_location";
Svet Ganov921c7df2015-06-29 21:51:41 -0700342 /** 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";
Billy Lau24b9c832015-07-20 17:34:09 +0100348 /** 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";
Svetoslavf3f02ac2015-09-08 14:36:35 -0700354 /** @hide Get device accounts. */
355 public static final String OPSTR_GET_ACCOUNTS
356 = "android:get_accounts";
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700357 public static final String OPSTR_READ_PHONE_NUMBERS
358 = "android:read_phone_numbers";
Winson Chungf4ac0632017-03-17 12:34:12 -0700359 /** Access to picture-in-picture. */
360 public static final String OPSTR_PICTURE_IN_PICTURE
361 = "android:picture_in_picture";
Chad Brubaker97b383f2017-02-02 15:04:35 -0800362 /** @hide */
363 public static final String OPSTR_INSTANT_APP_START_FOREGROUND
364 = "android:instant_app_start_foreground";
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800365 /** Answer incoming phone calls */
366 public static final String OPSTR_ANSWER_PHONE_CALLS
367 = "android:answer_phone_calls";
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700368
Philip P. Moltmanne56c08e2017-03-15 12:46:04 -0700369 // Warning: If an permission is added here it also has to be added to
370 // com.android.packageinstaller.permission.utils.EventLogger
Svet Ganovda0acdf2017-02-15 10:28:51 -0800371 private static final int[] RUNTIME_AND_APPOP_PERMISSIONS_OPS = {
372 // RUNTIME PERMISSIONS
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -0700373 // 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,
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700395 OP_READ_PHONE_NUMBERS,
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -0700396 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,
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800402 OP_ANSWER_PHONE_CALLS,
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -0700403 // Microphone
404 OP_RECORD_AUDIO,
405 // Camera
406 OP_CAMERA,
407 // Body sensors
Svet Ganovda0acdf2017-02-15 10:28:51 -0800408 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,
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -0700415 };
416
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800417 /**
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
David Christie0b837452013-07-29 16:02:13 -0700422 * presented to the user as one switch then this can be used to
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800423 * 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,
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800440 OP_READ_SMS,
441 OP_WRITE_SMS,
David Braun18966a82013-09-10 13:14:46 -0700442 OP_RECEIVE_SMS,
443 OP_RECEIVE_SMS,
Svet Ganov99e4d512016-09-21 19:50:14 -0700444 OP_RECEIVE_MMS,
445 OP_RECEIVE_WAP_PUSH,
David Braun18966a82013-09-10 13:14:46 -0700446 OP_SEND_SMS,
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800447 OP_READ_SMS,
448 OP_WRITE_SMS,
Dianne Hackborn961321f2013-02-05 17:22:41 -0800449 OP_WRITE_SETTINGS,
Dianne Hackbornc2293022013-02-06 23:14:49 -0800450 OP_SYSTEM_ALERT_WINDOW,
Daniel Sandlerfde19b12013-01-17 00:21:05 -0500451 OP_ACCESS_NOTIFICATIONS,
Dianne Hackbornd7d28e62013-02-12 14:59:53 -0800452 OP_CAMERA,
453 OP_RECORD_AUDIO,
454 OP_PLAY_AUDIO,
Dianne Hackbornefcc1a22013-02-25 18:02:35 -0800455 OP_READ_CLIPBOARD,
456 OP_WRITE_CLIPBOARD,
Dianne Hackbornba50b97c2013-04-30 15:04:46 -0700457 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,
Dianne Hackborn713df152013-05-17 11:27:57 -0700466 OP_WAKE_LOCK,
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700467 OP_COARSE_LOCATION,
David Christie0b837452013-07-29 16:02:13 -0700468 OP_COARSE_LOCATION,
Dianne Hackborne22b3b12014-05-07 18:06:44 -0700469 OP_GET_USAGE_STATS,
Jason Monk1c7c3192014-06-26 12:52:18 -0400470 OP_MUTE_MICROPHONE,
471 OP_TOAST_WINDOW,
Michael Wrightc39d47a2014-07-08 18:07:36 -0700472 OP_PROJECT_MEDIA,
Jeff Davidson05542602014-08-11 14:07:27 -0700473 OP_ACTIVATE_VPN,
Benjamin Franzf3ece362015-02-11 10:51:10 +0000474 OP_WRITE_WALLPAPER,
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700475 OP_ASSIST_STRUCTURE,
476 OP_ASSIST_SCREENSHOT,
Svet Ganovc3300092015-04-17 09:07:22 -0700477 OP_READ_PHONE_STATE,
Svetoslav5335b672015-04-29 12:00:51 -0700478 OP_ADD_VOICEMAIL,
Svetoslavc656e6f2015-04-29 14:08:16 -0700479 OP_USE_SIP,
Svetoslav4af76a52015-04-29 15:29:46 -0700480 OP_PROCESS_OUTGOING_CALLS,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700481 OP_USE_FINGERPRINT,
Svet Ganovede43162015-05-02 17:42:44 -0700482 OP_BODY_SENSORS,
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700483 OP_READ_CELL_BROADCASTS,
Svet Ganov921c7df2015-06-29 21:51:41 -0700484 OP_MOCK_LOCATION,
485 OP_READ_EXTERNAL_STORAGE,
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700486 OP_WRITE_EXTERNAL_STORAGE,
487 OP_TURN_SCREEN_ON,
Svetoslavf3f02ac2015-09-08 14:36:35 -0700488 OP_GET_ACCOUNTS,
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700489 OP_RUN_IN_BACKGROUND,
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800490 OP_AUDIO_ACCESSIBILITY_VOLUME,
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700491 OP_READ_PHONE_NUMBERS,
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800492 OP_REQUEST_INSTALL_PACKAGES,
Winson Chungf4ac0632017-03-17 12:34:12 -0700493 OP_PICTURE_IN_PICTURE,
Chad Brubaker97b383f2017-02-02 15:04:35 -0800494 OP_INSTANT_APP_START_FOREGROUND,
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800495 OP_ANSWER_PHONE_CALLS
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800496 };
497
498 /**
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700499 * 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,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700507 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,
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700524 null,
525 null,
Billy Lau24b9c832015-07-20 17:34:09 +0100526 OPSTR_WRITE_SETTINGS,
527 OPSTR_SYSTEM_ALERT_WINDOW,
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700528 null,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700529 OPSTR_CAMERA,
530 OPSTR_RECORD_AUDIO,
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700531 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,
Dianne Hackborn5064e7c2014-09-02 10:57:16 -0700546 OPSTR_GET_USAGE_STATS,
Emily Bernier22c921a2014-05-28 11:01:32 -0400547 null,
Jason Monk1c7c3192014-06-26 12:52:18 -0400548 null,
Michael Wrightc39d47a2014-07-08 18:07:36 -0700549 null,
Jeff Davidson05542602014-08-11 14:07:27 -0700550 OPSTR_ACTIVATE_VPN,
Benjamin Franzf3ece362015-02-11 10:51:10 +0000551 null,
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700552 null,
553 null,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700554 OPSTR_READ_PHONE_STATE,
555 OPSTR_ADD_VOICEMAIL,
556 OPSTR_USE_SIP,
Svet Ganov824ad6e2016-09-22 19:36:53 -0700557 OPSTR_PROCESS_OUTGOING_CALLS,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700558 OPSTR_USE_FINGERPRINT,
Svet Ganovede43162015-05-02 17:42:44 -0700559 OPSTR_BODY_SENSORS,
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700560 OPSTR_READ_CELL_BROADCASTS,
Svet Ganov921c7df2015-06-29 21:51:41 -0700561 OPSTR_MOCK_LOCATION,
562 OPSTR_READ_EXTERNAL_STORAGE,
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700563 OPSTR_WRITE_EXTERNAL_STORAGE,
564 null,
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700565 OPSTR_GET_ACCOUNTS,
566 null,
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800567 null, // OP_AUDIO_ACCESSIBILITY_VOLUME
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700568 OPSTR_READ_PHONE_NUMBERS,
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800569 null, // OP_REQUEST_INSTALL_PACKAGES
Winson Chungf4ac0632017-03-17 12:34:12 -0700570 OPSTR_PICTURE_IN_PICTURE,
Chad Brubaker97b383f2017-02-02 15:04:35 -0800571 OPSTR_INSTANT_APP_START_FOREGROUND,
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800572 OPSTR_ANSWER_PHONE_CALLS,
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -0700573 };
574
575 /**
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800576 * This provides a simple name for each operation to be used
577 * in debug output.
578 */
Dianne Hackborn5e45ee62013-01-24 19:13:44 -0800579 private static String[] sOpNames = new String[] {
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800580 "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",
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800594 "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",
Dianne Hackborn961321f2013-02-05 17:22:41 -0800603 "WRITE_SETTINGS",
Dianne Hackbornc2293022013-02-06 23:14:49 -0800604 "SYSTEM_ALERT_WINDOW",
Daniel Sandlerfde19b12013-01-17 00:21:05 -0500605 "ACCESS_NOTIFICATIONS",
Dianne Hackbornd7d28e62013-02-12 14:59:53 -0800606 "CAMERA",
607 "RECORD_AUDIO",
608 "PLAY_AUDIO",
Dianne Hackbornefcc1a22013-02-25 18:02:35 -0800609 "READ_CLIPBOARD",
610 "WRITE_CLIPBOARD",
Dianne Hackbornba50b97c2013-04-30 15:04:46 -0700611 "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",
Dianne Hackborn713df152013-05-17 11:27:57 -0700620 "WAKE_LOCK",
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700621 "MONITOR_LOCATION",
David Christie0b837452013-07-29 16:02:13 -0700622 "MONITOR_HIGH_POWER_LOCATION",
Emily Bernier22c921a2014-05-28 11:01:32 -0400623 "GET_USAGE_STATS",
Michael Wrightc39d47a2014-07-08 18:07:36 -0700624 "MUTE_MICROPHONE",
Jason Monk1c7c3192014-06-26 12:52:18 -0400625 "TOAST_WINDOW",
Michael Wrightc39d47a2014-07-08 18:07:36 -0700626 "PROJECT_MEDIA",
Jeff Davidson05542602014-08-11 14:07:27 -0700627 "ACTIVATE_VPN",
Benjamin Franzf3ece362015-02-11 10:51:10 +0000628 "WRITE_WALLPAPER",
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700629 "ASSIST_STRUCTURE",
Svet Ganov16a16892015-04-16 10:32:04 -0700630 "ASSIST_SCREENSHOT",
Svet Ganovc3300092015-04-17 09:07:22 -0700631 "OP_READ_PHONE_STATE",
Svetoslav5335b672015-04-29 12:00:51 -0700632 "ADD_VOICEMAIL",
Svetoslavc656e6f2015-04-29 14:08:16 -0700633 "USE_SIP",
Svetoslav4af76a52015-04-29 15:29:46 -0700634 "PROCESS_OUTGOING_CALLS",
Svet Ganovb9d71a62015-04-30 10:38:13 -0700635 "USE_FINGERPRINT",
Svet Ganovede43162015-05-02 17:42:44 -0700636 "BODY_SENSORS",
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700637 "READ_CELL_BROADCASTS",
Svet Ganov921c7df2015-06-29 21:51:41 -0700638 "MOCK_LOCATION",
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700639 "READ_EXTERNAL_STORAGE",
640 "WRITE_EXTERNAL_STORAGE",
641 "TURN_ON_SCREEN",
Svetoslavf3f02ac2015-09-08 14:36:35 -0700642 "GET_ACCOUNTS",
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700643 "RUN_IN_BACKGROUND",
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800644 "AUDIO_ACCESSIBILITY_VOLUME",
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700645 "READ_PHONE_NUMBERS",
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800646 "REQUEST_INSTALL_PACKAGES",
Winson Chungf4ac0632017-03-17 12:34:12 -0700647 "PICTURE_IN_PICTURE",
Chad Brubaker97b383f2017-02-02 15:04:35 -0800648 "INSTANT_APP_START_FOREGROUND",
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800649 "ANSWER_PHONE_CALLS",
Dianne Hackborn5e45ee62013-01-24 19:13:44 -0800650 };
651
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800652 /**
653 * This optionally maps a permission to an operation. If there
654 * is no permission associated with an operation, it is null.
655 */
Dianne Hackborn5e45ee62013-01-24 19:13:44 -0800656 private static String[] sOpPerms = new String[] {
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800657 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,
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800667 android.Manifest.permission.ACCESS_WIFI_STATE,
Robert Craigf97616c2013-10-07 12:32:02 -0400668 null, // no permission required for notifications
Dianne Hackbornf265ea92013-01-31 15:00:51 -0800669 null, // neighboring cells shares the coarse location perm
670 android.Manifest.permission.CALL_PHONE,
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800671 android.Manifest.permission.READ_SMS,
Svetoslav6c589572015-04-16 16:19:24 -0700672 null, // no permission required for writing sms
Dianne Hackbornf51f6122013-02-04 18:23:34 -0800673 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,
Svetoslav6c589572015-04-16 16:19:24 -0700679 null, // no permission required for writing icc sms
Dianne Hackborn961321f2013-02-05 17:22:41 -0800680 android.Manifest.permission.WRITE_SETTINGS,
Dianne Hackbornc2293022013-02-06 23:14:49 -0800681 android.Manifest.permission.SYSTEM_ALERT_WINDOW,
Daniel Sandlerfde19b12013-01-17 00:21:05 -0500682 android.Manifest.permission.ACCESS_NOTIFICATIONS,
Dianne Hackbornd7d28e62013-02-12 14:59:53 -0800683 android.Manifest.permission.CAMERA,
684 android.Manifest.permission.RECORD_AUDIO,
685 null, // no permission for playing audio
Dianne Hackbornefcc1a22013-02-25 18:02:35 -0800686 null, // no permission for reading clipboard
687 null, // no permission for writing clipboard
Dianne Hackbornba50b97c2013-04-30 15:04:46 -0700688 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
Dianne Hackborn713df152013-05-17 11:27:57 -0700697 android.Manifest.permission.WAKE_LOCK,
Dianne Hackborn1304f4a2013-07-09 18:17:27 -0700698 null, // no permission for generic location monitoring
David Christie0b837452013-07-29 16:02:13 -0700699 null, // no permission for high power location monitoring
Dianne Hackborne22b3b12014-05-07 18:06:44 -0700700 android.Manifest.permission.PACKAGE_USAGE_STATS,
Emily Bernier22c921a2014-05-28 11:01:32 -0400701 null, // no permission for muting/unmuting microphone
Jason Monk1c7c3192014-06-26 12:52:18 -0400702 null, // no permission for displaying toasts
Michael Wrightc39d47a2014-07-08 18:07:36 -0700703 null, // no permission for projecting media
Jeff Davidson05542602014-08-11 14:07:27 -0700704 null, // no permission for activating vpn
Benjamin Franzf3ece362015-02-11 10:51:10 +0000705 null, // no permission for supporting wallpaper
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700706 null, // no permission for receiving assist structure
707 null, // no permission for receiving assist screenshot
Svet Ganovc3300092015-04-17 09:07:22 -0700708 Manifest.permission.READ_PHONE_STATE,
Svetoslav5335b672015-04-29 12:00:51 -0700709 Manifest.permission.ADD_VOICEMAIL,
Svetoslavc656e6f2015-04-29 14:08:16 -0700710 Manifest.permission.USE_SIP,
Svetoslav4af76a52015-04-29 15:29:46 -0700711 Manifest.permission.PROCESS_OUTGOING_CALLS,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700712 Manifest.permission.USE_FINGERPRINT,
Svet Ganovede43162015-05-02 17:42:44 -0700713 Manifest.permission.BODY_SENSORS,
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700714 Manifest.permission.READ_CELL_BROADCASTS,
Svet Ganov921c7df2015-06-29 21:51:41 -0700715 null,
716 Manifest.permission.READ_EXTERNAL_STORAGE,
717 Manifest.permission.WRITE_EXTERNAL_STORAGE,
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700718 null, // no permission for turning the screen on
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700719 Manifest.permission.GET_ACCOUNTS,
720 null, // no permission for running in background
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800721 null, // no permission for changing accessibility volume
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700722 Manifest.permission.READ_PHONE_NUMBERS,
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800723 Manifest.permission.REQUEST_INSTALL_PACKAGES,
Winson Chung59fda9e2017-01-20 16:14:51 -0800724 null, // no permission for entering picture-in-picture on hide
Chad Brubaker97b383f2017-02-02 15:04:35 -0800725 Manifest.permission.INSTANT_APP_FOREGROUND_SERVICE,
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800726 Manifest.permission.ANSWER_PHONE_CALLS,
Dianne Hackborn5e45ee62013-01-24 19:13:44 -0800727 };
728
Dianne Hackbornd7d28e62013-02-12 14:59:53 -0800729 /**
Jason Monk62062992014-05-06 09:55:28 -0400730 * 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[] {
Julia Reynolds9854d572014-07-02 14:46:02 -0400735 UserManager.DISALLOW_SHARE_LOCATION, //COARSE_LOCATION
736 UserManager.DISALLOW_SHARE_LOCATION, //FINE_LOCATION
737 UserManager.DISALLOW_SHARE_LOCATION, //GPS
Jason Monk62062992014-05-06 09:55:28 -0400738 null, //VIBRATE
739 null, //READ_CONTACTS
740 null, //WRITE_CONTACTS
Yorke Lee15f83c62014-08-13 14:14:29 -0700741 UserManager.DISALLOW_OUTGOING_CALLS, //READ_CALL_LOG
742 UserManager.DISALLOW_OUTGOING_CALLS, //WRITE_CALL_LOG
Jason Monk62062992014-05-06 09:55:28 -0400743 null, //READ_CALENDAR
744 null, //WRITE_CALENDAR
Julia Reynolds9854d572014-07-02 14:46:02 -0400745 UserManager.DISALLOW_SHARE_LOCATION, //WIFI_SCAN
Jason Monk62062992014-05-06 09:55:28 -0400746 null, //POST_NOTIFICATION
747 null, //NEIGHBORING_CELLS
748 null, //CALL_PHONE
Amith Yamasani41c1ded2014-08-05 11:15:05 -0700749 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
Jason Monk62062992014-05-06 09:55:28 -0400754 null, //RECEIVE_WAP_PUSH
Amith Yamasani41c1ded2014-08-05 11:15:05 -0700755 UserManager.DISALLOW_SMS, //SEND_SMS
756 UserManager.DISALLOW_SMS, //READ_ICC_SMS
757 UserManager.DISALLOW_SMS, //WRITE_ICC_SMS
Jason Monk62062992014-05-06 09:55:28 -0400758 null, //WRITE_SETTINGS
Jason Monk1c7c3192014-06-26 12:52:18 -0400759 UserManager.DISALLOW_CREATE_WINDOWS, //SYSTEM_ALERT_WINDOW
Jason Monk62062992014-05-06 09:55:28 -0400760 null, //ACCESS_NOTIFICATIONS
Makoto Onuki759a7632015-10-28 16:43:10 -0700761 UserManager.DISALLOW_CAMERA, //CAMERA
Fyodor Kupolovb5013302015-04-17 17:59:14 -0700762 UserManager.DISALLOW_RECORD_AUDIO, //RECORD_AUDIO
Jason Monk62062992014-05-06 09:55:28 -0400763 null, //PLAY_AUDIO
764 null, //READ_CLIPBOARD
765 null, //WRITE_CLIPBOARD
766 null, //TAKE_MEDIA_BUTTONS
767 null, //TAKE_AUDIO_FOCUS
Emily Bernier45775c42014-05-16 15:12:04 -0400768 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
Jason Monk62062992014-05-06 09:55:28 -0400775 null, //WAKE_LOCK
Julia Reynolds9854d572014-07-02 14:46:02 -0400776 UserManager.DISALLOW_SHARE_LOCATION, //MONITOR_LOCATION
777 UserManager.DISALLOW_SHARE_LOCATION, //MONITOR_HIGH_POWER_LOCATION
Jason Monk62062992014-05-06 09:55:28 -0400778 null, //GET_USAGE_STATS
Emily Bernier22c921a2014-05-28 11:01:32 -0400779 UserManager.DISALLOW_UNMUTE_MICROPHONE, // MUTE_MICROPHONE
Jason Monk1c7c3192014-06-26 12:52:18 -0400780 UserManager.DISALLOW_CREATE_WINDOWS, // TOAST_WINDOW
Michael Wrightc39d47a2014-07-08 18:07:36 -0700781 null, //PROJECT_MEDIA
Tony Mak33d03a92016-06-02 15:01:16 +0100782 null, // ACTIVATE_VPN
Benjamin Franzf3ece362015-02-11 10:51:10 +0000783 UserManager.DISALLOW_WALLPAPER, // WRITE_WALLPAPER
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700784 null, // ASSIST_STRUCTURE
785 null, // ASSIST_SCREENSHOT
Svet Ganovc3300092015-04-17 09:07:22 -0700786 null, // READ_PHONE_STATE
Svetoslav5335b672015-04-29 12:00:51 -0700787 null, // ADD_VOICEMAIL
Svetoslavc656e6f2015-04-29 14:08:16 -0700788 null, // USE_SIP
Svetoslav4af76a52015-04-29 15:29:46 -0700789 null, // PROCESS_OUTGOING_CALLS
Svet Ganovb9d71a62015-04-30 10:38:13 -0700790 null, // USE_FINGERPRINT
Svet Ganovede43162015-05-02 17:42:44 -0700791 null, // BODY_SENSORS
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700792 null, // READ_CELL_BROADCASTS
Svet Ganov921c7df2015-06-29 21:51:41 -0700793 null, // MOCK_LOCATION
794 null, // READ_EXTERNAL_STORAGE
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700795 null, // WRITE_EXTERNAL_STORAGE
796 null, // TURN_ON_SCREEN
Svetoslavf3f02ac2015-09-08 14:36:35 -0700797 null, // GET_ACCOUNTS
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700798 null, // RUN_IN_BACKGROUND
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800799 UserManager.DISALLOW_ADJUST_VOLUME, //AUDIO_ACCESSIBILITY_VOLUME
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700800 null, // READ_PHONE_NUMBERS
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800801 null, // REQUEST_INSTALL_PACKAGES
Winson Chung59fda9e2017-01-20 16:14:51 -0800802 null, // ENTER_PICTURE_IN_PICTURE_ON_HIDE
Chad Brubaker97b383f2017-02-02 15:04:35 -0800803 null, // INSTANT_APP_START_FOREGROUND
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800804 null, // ANSWER_PHONE_CALLS
Jason Monk1c7c3192014-06-26 12:52:18 -0400805 };
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[] {
Fyodor Kupolov639e73d2016-02-25 11:58:21 -0800812 true, //COARSE_LOCATION
813 true, //FINE_LOCATION
Jason Monk1c7c3192014-06-26 12:52:18 -0400814 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
Julia Reynolds9854d572014-07-02 14:46:02 -0400822 true, //WIFI_SCAN
Jason Monk1c7c3192014-06-26 12:52:18 -0400823 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
Michael Wrightc39d47a2014-07-08 18:07:36 -0700856 false, //MUTE_MICROPHONE
857 true, //TOAST_WINDOW
858 false, //PROJECT_MEDIA
Jeff Davidson05542602014-08-11 14:07:27 -0700859 false, //ACTIVATE_VPN
Benjamin Franzf3ece362015-02-11 10:51:10 +0000860 false, //WALLPAPER
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700861 false, //ASSIST_STRUCTURE
862 false, //ASSIST_SCREENSHOT
Svet Ganov16a16892015-04-16 10:32:04 -0700863 false, //READ_PHONE_STATE
Svetoslav5335b672015-04-29 12:00:51 -0700864 false, //ADD_VOICEMAIL
Svetoslavc656e6f2015-04-29 14:08:16 -0700865 false, // USE_SIP
Svetoslav4af76a52015-04-29 15:29:46 -0700866 false, // PROCESS_OUTGOING_CALLS
Svet Ganovb9d71a62015-04-30 10:38:13 -0700867 false, // USE_FINGERPRINT
Svet Ganovede43162015-05-02 17:42:44 -0700868 false, // BODY_SENSORS
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700869 false, // READ_CELL_BROADCASTS
Svet Ganov921c7df2015-06-29 21:51:41 -0700870 false, // MOCK_LOCATION
871 false, // READ_EXTERNAL_STORAGE
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700872 false, // WRITE_EXTERNAL_STORAGE
873 false, // TURN_ON_SCREEN
Svetoslavf3f02ac2015-09-08 14:36:35 -0700874 false, // GET_ACCOUNTS
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700875 false, // RUN_IN_BACKGROUND
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800876 false, // AUDIO_ACCESSIBILITY_VOLUME
Chad Brubaker0c1651f2017-03-30 16:29:10 -0700877 false, // READ_PHONE_NUMBERS
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -0800878 false, // REQUEST_INSTALL_PACKAGES
Winson Chung59fda9e2017-01-20 16:14:51 -0800879 false, // ENTER_PICTURE_IN_PICTURE_ON_HIDE
Chad Brubaker97b383f2017-02-02 15:04:35 -0800880 false, // INSTANT_APP_START_FOREGROUND
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800881 false, // ANSWER_PHONE_CALLS
Jason Monk62062992014-05-06 09:55:28 -0400882 };
883
884 /**
David Braunf5d83192013-09-16 13:43:51 -0700885 * 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,
Billy Lau6ad2d662015-07-18 00:26:58 +0100911 AppOpsManager.MODE_DEFAULT, // OP_WRITE_SETTINGS
Billy Lau060275f2015-07-15 22:29:19 +0100912 AppOpsManager.MODE_DEFAULT, // OP_SYSTEM_ALERT_WINDOW
David Braunf5d83192013-09-16 13:43:51 -0700913 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,
Dianne Hackborn33f5ddd2014-07-21 15:35:45 -0700931 AppOpsManager.MODE_DEFAULT, // OP_GET_USAGE_STATS
Emily Bernier22c921a2014-05-28 11:01:32 -0400932 AppOpsManager.MODE_ALLOWED,
Jason Monk1c7c3192014-06-26 12:52:18 -0400933 AppOpsManager.MODE_ALLOWED,
Michael Wrightc39d47a2014-07-08 18:07:36 -0700934 AppOpsManager.MODE_IGNORED, // OP_PROJECT_MEDIA
Jeff Davidson05542602014-08-11 14:07:27 -0700935 AppOpsManager.MODE_IGNORED, // OP_ACTIVATE_VPN
Benjamin Franzf3ece362015-02-11 10:51:10 +0000936 AppOpsManager.MODE_ALLOWED,
Dianne Hackbornd59a5d52015-04-04 14:52:14 -0700937 AppOpsManager.MODE_ALLOWED,
938 AppOpsManager.MODE_ALLOWED,
Svet Ganovc3300092015-04-17 09:07:22 -0700939 AppOpsManager.MODE_ALLOWED,
Svetoslav5335b672015-04-29 12:00:51 -0700940 AppOpsManager.MODE_ALLOWED,
Svetoslavc656e6f2015-04-29 14:08:16 -0700941 AppOpsManager.MODE_ALLOWED,
Svetoslav4af76a52015-04-29 15:29:46 -0700942 AppOpsManager.MODE_ALLOWED,
Svet Ganovb9d71a62015-04-30 10:38:13 -0700943 AppOpsManager.MODE_ALLOWED,
Svet Ganovede43162015-05-02 17:42:44 -0700944 AppOpsManager.MODE_ALLOWED,
Svet Ganovf7e9cf42015-05-13 10:40:31 -0700945 AppOpsManager.MODE_ALLOWED,
Svet Ganov921c7df2015-06-29 21:51:41 -0700946 AppOpsManager.MODE_ERRORED, // OP_MOCK_LOCATION
947 AppOpsManager.MODE_ALLOWED,
Dianne Hackborn280a64e2015-07-13 14:48:08 -0700948 AppOpsManager.MODE_ALLOWED,
949 AppOpsManager.MODE_ALLOWED, // OP_TURN_ON_SCREEN
Svetoslavf3f02ac2015-09-08 14:36:35 -0700950 AppOpsManager.MODE_ALLOWED,
Dianne Hackbornbef28fe2015-10-29 17:57:11 -0700951 AppOpsManager.MODE_ALLOWED, // OP_RUN_IN_BACKGROUND
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -0800952 AppOpsManager.MODE_ALLOWED, // OP_AUDIO_ACCESSIBILITY_VOLUME
Chad Brubaker73ec8f92016-11-10 11:24:40 -0800953 AppOpsManager.MODE_ALLOWED,
Svet Ganovda0acdf2017-02-15 10:28:51 -0800954 AppOpsManager.MODE_DEFAULT, // OP_REQUEST_INSTALL_PACKAGES
Winson Chungf4ac0632017-03-17 12:34:12 -0700955 AppOpsManager.MODE_ALLOWED, // OP_PICTURE_IN_PICTURE
Svet Ganovda0acdf2017-02-15 10:28:51 -0800956 AppOpsManager.MODE_DEFAULT, // OP_INSTANT_APP_START_FOREGROUND
Eugene Suslacae3d3e2017-01-31 11:08:11 -0800957 AppOpsManager.MODE_ALLOWED, // ANSWER_PHONE_CALLS
David Braunf5d83192013-09-16 13:43:51 -0700958 };
959
Dianne Hackborn8828d3a2013-09-25 16:47:10 -0700960 /**
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,
Dianne Hackborne22b3b12014-05-07 18:06:44 -07001011 false,
Emily Bernier22c921a2014-05-28 11:01:32 -04001012 false,
Jason Monk1c7c3192014-06-26 12:52:18 -04001013 false,
Michael Wrightc39d47a2014-07-08 18:07:36 -07001014 false,
Jeff Davidson05542602014-08-11 14:07:27 -07001015 false,
Benjamin Franzf3ece362015-02-11 10:51:10 +00001016 false,
Dianne Hackbornd59a5d52015-04-04 14:52:14 -07001017 false,
1018 false,
Svet Ganovc3300092015-04-17 09:07:22 -07001019 false,
Svetoslav5335b672015-04-29 12:00:51 -07001020 false,
Svetoslavc656e6f2015-04-29 14:08:16 -07001021 false,
Svetoslav4af76a52015-04-29 15:29:46 -07001022 false,
Svet Ganovb9d71a62015-04-30 10:38:13 -07001023 false,
Svet Ganovede43162015-05-02 17:42:44 -07001024 false,
Svet Ganovf7e9cf42015-05-13 10:40:31 -07001025 false,
Svet Ganov921c7df2015-06-29 21:51:41 -07001026 false,
1027 false,
Dianne Hackborn280a64e2015-07-13 14:48:08 -07001028 false,
1029 false,
Dianne Hackbornbef28fe2015-10-29 17:57:11 -07001030 false,
1031 false,
Jean-Michel Trivi3f0945a2016-11-11 10:05:18 -08001032 false, // OP_AUDIO_ACCESSIBILITY_VOLUME
Chad Brubaker73ec8f92016-11-10 11:24:40 -08001033 false,
Suprabh Shukla2f34b1a2016-12-16 14:47:25 -08001034 false, // OP_REQUEST_INSTALL_PACKAGES
Winson Chungf4ac0632017-03-17 12:34:12 -07001035 false, // OP_PICTURE_IN_PICTURE
Chad Brubaker97b383f2017-02-02 15:04:35 -08001036 false,
Eugene Suslacae3d3e2017-01-31 11:08:11 -08001037 false, // ANSWER_PHONE_CALLS
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001038 };
1039
Svet Ganovfbf01f72015-04-28 18:39:06 -07001040 /**
Svet Ganovb9d71a62015-04-30 10:38:13 -07001041 * Mapping from an app op name to the app op code.
Svet Ganovfbf01f72015-04-28 18:39:06 -07001042 */
Svet Ganovb9d71a62015-04-30 10:38:13 -07001043 private static HashMap<String, Integer> sOpStrToOp = new HashMap<>();
Svet Ganovfbf01f72015-04-28 18:39:06 -07001044
Svet Ganovb9d71a62015-04-30 10:38:13 -07001045 /**
1046 * Mapping from a permission to the corresponding app op.
1047 */
Svet Ganovda0acdf2017-02-15 10:28:51 -08001048 private static HashMap<String, Integer> sPermToOp = new HashMap<>();
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001049
1050 static {
1051 if (sOpToSwitch.length != _NUM_OP) {
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001052 throw new IllegalStateException("sOpToSwitch length " + sOpToSwitch.length
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001053 + " should be " + _NUM_OP);
1054 }
1055 if (sOpToString.length != _NUM_OP) {
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001056 throw new IllegalStateException("sOpToString length " + sOpToString.length
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001057 + " should be " + _NUM_OP);
1058 }
1059 if (sOpNames.length != _NUM_OP) {
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001060 throw new IllegalStateException("sOpNames length " + sOpNames.length
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001061 + " should be " + _NUM_OP);
1062 }
1063 if (sOpPerms.length != _NUM_OP) {
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001064 throw new IllegalStateException("sOpPerms length " + sOpPerms.length
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001065 + " should be " + _NUM_OP);
1066 }
1067 if (sOpDefaultMode.length != _NUM_OP) {
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001068 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
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001073 + " should be " + _NUM_OP);
1074 }
Jason Monk62062992014-05-06 09:55:28 -04001075 if (sOpRestrictions.length != _NUM_OP) {
1076 throw new IllegalStateException("sOpRestrictions length " + sOpRestrictions.length
1077 + " should be " + _NUM_OP);
1078 }
Jason Monk1c7c3192014-06-26 12:52:18 -04001079 if (sOpAllowSystemRestrictionBypass.length != _NUM_OP) {
1080 throw new IllegalStateException("sOpAllowSYstemRestrictionsBypass length "
1081 + sOpRestrictions.length + " should be " + _NUM_OP);
1082 }
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001083 for (int i=0; i<_NUM_OP; i++) {
1084 if (sOpToString[i] != null) {
1085 sOpStrToOp.put(sOpToString[i], i);
1086 }
1087 }
Svet Ganovda0acdf2017-02-15 10:28:51 -08001088 for (int op : RUNTIME_AND_APPOP_PERMISSIONS_OPS) {
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -07001089 if (sOpPerms[op] != null) {
Svet Ganovda0acdf2017-02-15 10:28:51 -08001090 sPermToOp.put(sOpPerms[op], op);
Svet Ganovb9d71a62015-04-30 10:38:13 -07001091 }
1092 }
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001093 }
1094
David Braunf5d83192013-09-16 13:43:51 -07001095 /**
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001096 * Retrieve the op switch that controls the given operation.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001097 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001098 */
Dianne Hackbornf265ea92013-01-31 15:00:51 -08001099 public static int opToSwitch(int op) {
1100 return sOpToSwitch[op];
1101 }
1102
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001103 /**
1104 * Retrieve a non-localized name for the operation, for debugging output.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001105 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001106 */
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001107 public static String opToName(int op) {
Dianne Hackbornc2293022013-02-06 23:14:49 -08001108 if (op == OP_NONE) return "NONE";
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001109 return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")");
1110 }
1111
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001112 /**
Dianne Hackborn7b7c58b2014-12-02 18:32:20 -08001113 * @hide
1114 */
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 /**
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001125 * Retrieve the permission associated with an operation, or null if there is not one.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001126 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001127 */
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001128 public static String opToPermission(int op) {
1129 return sOpPerms[op];
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001130 }
1131
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001132 /**
Jason Monk62062992014-05-06 09:55:28 -04001133 * Retrieve the user restriction associated with an operation, or null if there is not one.
1134 * @hide
1135 */
1136 public static String opToRestriction(int op) {
1137 return sOpRestrictions[op];
1138 }
1139
1140 /**
Svet Ganovb9d71a62015-04-30 10:38:13 -07001141 * Retrieve the app op code for a permission, or null if there is not one.
Svet Ganovda0acdf2017-02-15 10:28:51 -08001142 * This API is intended to be used for mapping runtime or appop permissions
1143 * to the corresponding app op.
Svet Ganovb9d71a62015-04-30 10:38:13 -07001144 * @hide
1145 */
1146 public static int permissionToOpCode(String permission) {
Svet Ganovda0acdf2017-02-15 10:28:51 -08001147 Integer boxedOpCode = sPermToOp.get(permission);
Svet Ganov019d2302015-05-04 11:07:38 -07001148 return boxedOpCode != null ? boxedOpCode : OP_NONE;
Svet Ganovb9d71a62015-04-30 10:38:13 -07001149 }
1150
1151 /**
Jason Monk1c7c3192014-06-26 12:52:18 -04001152 * Retrieve whether the op allows the system (and system ui) to
1153 * bypass the user restriction.
1154 * @hide
1155 */
1156 public static boolean opAllowSystemBypassRestriction(int op) {
1157 return sOpAllowSystemRestrictionBypass[op];
1158 }
1159
1160 /**
David Braunf5d83192013-09-16 13:43:51 -07001161 * Retrieve the default mode for the operation.
1162 * @hide
1163 */
1164 public static int opToDefaultMode(int op) {
1165 return sOpDefaultMode[op];
1166 }
1167
1168 /**
Dianne Hackborn8828d3a2013-09-25 16:47:10 -07001169 * Retrieve whether the op allows itself to be reset.
1170 * @hide
1171 */
1172 public static boolean opAllowsReset(int op) {
1173 return !sOpDisableReset[op];
1174 }
1175
1176 /**
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001177 * Class holding all of the operation information associated with an app.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001178 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001179 */
Dianne Hackborn35654b62013-01-14 17:38:02 -08001180 public static class PackageOps implements Parcelable {
1181 private final String mPackageName;
1182 private final int mUid;
1183 private final List<OpEntry> mEntries;
1184
1185 public PackageOps(String packageName, int uid, List<OpEntry> entries) {
1186 mPackageName = packageName;
1187 mUid = uid;
1188 mEntries = entries;
1189 }
1190
1191 public String getPackageName() {
1192 return mPackageName;
1193 }
1194
1195 public int getUid() {
1196 return mUid;
1197 }
1198
1199 public List<OpEntry> getOps() {
1200 return mEntries;
1201 }
1202
1203 @Override
1204 public int describeContents() {
1205 return 0;
1206 }
1207
1208 @Override
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
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
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001239 /**
1240 * Class holding the information about one unique operation of an application.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001241 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001242 */
Dianne Hackborn35654b62013-01-14 17:38:02 -08001243 public static class OpEntry implements Parcelable {
1244 private final int mOp;
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001245 private final int mMode;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001246 private final long mTime;
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001247 private final long mRejectTime;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001248 private final int mDuration;
Svet Ganov99b60432015-06-27 13:15:22 -07001249 private final int mProxyUid;
1250 private final String mProxyPackageName;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001251
Svet Ganov99b60432015-06-27 13:15:22 -07001252 public OpEntry(int op, int mode, long time, long rejectTime, int duration,
1253 int proxyUid, String proxyPackage) {
Dianne Hackborn35654b62013-01-14 17:38:02 -08001254 mOp = op;
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001255 mMode = mode;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001256 mTime = time;
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001257 mRejectTime = rejectTime;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001258 mDuration = duration;
Svet Ganov99b60432015-06-27 13:15:22 -07001259 mProxyUid = proxyUid;
1260 mProxyPackageName = proxyPackage;
Dianne Hackborn35654b62013-01-14 17:38:02 -08001261 }
1262
1263 public int getOp() {
1264 return mOp;
1265 }
1266
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001267 public int getMode() {
1268 return mMode;
1269 }
1270
Dianne Hackborn35654b62013-01-14 17:38:02 -08001271 public long getTime() {
1272 return mTime;
1273 }
1274
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001275 public long getRejectTime() {
1276 return mRejectTime;
1277 }
1278
Dianne Hackborn35654b62013-01-14 17:38:02 -08001279 public boolean isRunning() {
1280 return mDuration == -1;
1281 }
1282
1283 public int getDuration() {
1284 return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration;
1285 }
1286
Svet Ganov99b60432015-06-27 13:15:22 -07001287 public int getProxyUid() {
1288 return mProxyUid;
1289 }
1290
1291 public String getProxyPackageName() {
1292 return mProxyPackageName;
1293 }
1294
Dianne Hackborn35654b62013-01-14 17:38:02 -08001295 @Override
1296 public int describeContents() {
1297 return 0;
1298 }
1299
1300 @Override
1301 public void writeToParcel(Parcel dest, int flags) {
1302 dest.writeInt(mOp);
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001303 dest.writeInt(mMode);
Dianne Hackborn35654b62013-01-14 17:38:02 -08001304 dest.writeLong(mTime);
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001305 dest.writeLong(mRejectTime);
Dianne Hackborn35654b62013-01-14 17:38:02 -08001306 dest.writeInt(mDuration);
Svet Ganov99b60432015-06-27 13:15:22 -07001307 dest.writeInt(mProxyUid);
1308 dest.writeString(mProxyPackageName);
Dianne Hackborn35654b62013-01-14 17:38:02 -08001309 }
1310
1311 OpEntry(Parcel source) {
1312 mOp = source.readInt();
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001313 mMode = source.readInt();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001314 mTime = source.readLong();
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001315 mRejectTime = source.readLong();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001316 mDuration = source.readInt();
Svet Ganov99b60432015-06-27 13:15:22 -07001317 mProxyUid = source.readInt();
1318 mProxyPackageName = source.readString();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001319 }
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
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001332 /**
1333 * Callback for notification of changes to operation state.
1334 */
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001335 public interface OnOpChangedListener {
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 {
1345 public void onOpChanged(String op, String packageName) { }
1346 public void onOpChanged(int op, String packageName) { }
Dianne Hackbornc2293022013-02-06 23:14:49 -08001347 }
1348
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001349 AppOpsManager(Context context, IAppOpsService service) {
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001350 mContext = context;
1351 mService = service;
1352 }
1353
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001354 /**
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.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001358 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001359 */
Dianne Hackborn35654b62013-01-14 17:38:02 -08001360 public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
1361 try {
1362 return mService.getPackagesForOps(ops);
1363 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001364 throw e.rethrowFromSystemServer();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001365 }
Dianne Hackborn35654b62013-01-14 17:38:02 -08001366 }
1367
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001368 /**
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.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001374 * @hide
Dianne Hackbornd7d28e62013-02-12 14:59:53 -08001375 */
Dianne Hackborn72e39832013-01-18 18:36:09 -08001376 public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
1377 try {
1378 return mService.getOpsForPackage(uid, packageName, ops);
1379 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001380 throw e.rethrowFromSystemServer();
Dianne Hackborn72e39832013-01-18 18:36:09 -08001381 }
Dianne Hackborn72e39832013-01-18 18:36:09 -08001382 }
1383
Svet Ganovae0e03a2016-02-25 18:22:10 -08001384 /**
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 */
Svet Ganov2af57082015-07-30 08:44:20 -07001394 public void setUidMode(int code, int uid, int mode) {
1395 try {
1396 mService.setUidMode(code, uid, mode);
1397 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001398 throw e.rethrowFromSystemServer();
Svet Ganov2af57082015-07-30 08:44:20 -07001399 }
1400 }
1401
Svet Ganovae0e03a2016-02-25 18:22:10 -08001402 /**
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
Jeff Sharkeyd86b8fe2017-06-02 17:36:26 -06001413 @RequiresPermission(android.Manifest.permission.UPDATE_APP_OPS_STATS)
Svet Ganovae0e03a2016-02-25 18:22:10 -08001414 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
Svet Ganov2af57082015-07-30 08:44:20 -07001422 /** @hide */
Svet Ganov9cea80cd2016-02-16 11:47:00 -08001423 public void setUserRestriction(int code, boolean restricted, IBinder token) {
Ruben Brunk29931bc2016-03-11 00:24:26 -08001424 setUserRestriction(code, restricted, token, /*exceptionPackages*/null);
1425 }
1426
1427 /** @hide */
1428 public void setUserRestriction(int code, boolean restricted, IBinder token,
1429 String[] exceptionPackages) {
Svetoslav Ganove33f6132016-06-01 16:25:31 -07001430 setUserRestrictionForUser(code, restricted, token, exceptionPackages, mContext.getUserId());
1431 }
1432
1433 /** @hide */
1434 public void setUserRestrictionForUser(int code, boolean restricted, IBinder token,
1435 String[] exceptionPackages, int userId) {
Svet Ganov9cea80cd2016-02-16 11:47:00 -08001436 try {
Svetoslav Ganove33f6132016-06-01 16:25:31 -07001437 mService.setUserRestriction(code, restricted, token, userId, exceptionPackages);
Svet Ganov9cea80cd2016-02-16 11:47:00 -08001438 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001439 throw e.rethrowFromSystemServer();
Svet Ganov9cea80cd2016-02-16 11:47:00 -08001440 }
1441 }
1442
1443 /** @hide */
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001444 public void setMode(int code, int uid, String packageName, int mode) {
1445 try {
1446 mService.setMode(code, uid, packageName, mode);
1447 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001448 throw e.rethrowFromSystemServer();
Dianne Hackborn5e45ee62013-01-24 19:13:44 -08001449 }
1450 }
1451
John Spurlock1af30c72014-03-10 08:33:35 -04001452 /**
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.
John Spurlock7b414672014-07-18 13:02:39 -04001458 * @param usage The {@link android.media.AudioAttributes} usage value.
John Spurlock1af30c72014-03-10 08:33:35 -04001459 * @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 */
John Spurlock7b414672014-07-18 13:02:39 -04001463 public void setRestriction(int code, @AttributeUsage int usage, int mode,
1464 String[] exceptionPackages) {
John Spurlock1af30c72014-03-10 08:33:35 -04001465 try {
1466 final int uid = Binder.getCallingUid();
John Spurlock7b414672014-07-18 13:02:39 -04001467 mService.setAudioRestriction(code, usage, uid, mode, exceptionPackages);
John Spurlock1af30c72014-03-10 08:33:35 -04001468 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001469 throw e.rethrowFromSystemServer();
John Spurlock1af30c72014-03-10 08:33:35 -04001470 }
1471 }
1472
Dianne Hackborn607b4142013-08-02 18:10:10 -07001473 /** @hide */
1474 public void resetAllModes() {
1475 try {
Dianne Hackborn7b7c58b2014-12-02 18:32:20 -08001476 mService.resetAllModes(UserHandle.myUserId(), null);
Dianne Hackborn607b4142013-08-02 18:10:10 -07001477 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001478 throw e.rethrowFromSystemServer();
Dianne Hackborn607b4142013-08-02 18:10:10 -07001479 }
1480 }
1481
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001482 /**
Svet Ganovfbf01f72015-04-28 18:39:06 -07001483 * 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}.
Svetoslav Ganoveaca4c52016-05-05 18:08:00 -07001486 * This API is intended to be used for mapping runtime
1487 * permissions to the corresponding app op.
Svet Ganovfbf01f72015-04-28 18:39:06 -07001488 *
1489 * @param permission The permission.
1490 * @return The app op associated with the permission or null.
Svet Ganovfbf01f72015-04-28 18:39:06 -07001491 */
Svet Ganovfbf01f72015-04-28 18:39:06 -07001492 public static String permissionToOp(String permission) {
Svet Ganovda0acdf2017-02-15 10:28:51 -08001493 final Integer opCode = sPermToOp.get(permission);
Svet Ganovb9d71a62015-04-30 10:38:13 -07001494 if (opCode == null) {
1495 return null;
1496 }
1497 return sOpToString[opCode];
Svet Ganovfbf01f72015-04-28 18:39:06 -07001498 }
1499
1500 /**
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001501 * Monitor for changes to the operating mode for the given op in the given app package.
Dianne Hackborne4cb66f2013-10-02 10:34:02 -07001502 * @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 */
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.
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001513 * @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.
Dianne Hackborne4cb66f2013-10-02 10:34:02 -07001516 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001517 */
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001518 public void startWatchingMode(int op, String packageName, final OnOpChangedListener callback) {
Dianne Hackbornc2293022013-02-06 23:14:49 -08001519 synchronized (mModeWatchers) {
1520 IAppOpsCallback cb = mModeWatchers.get(callback);
1521 if (cb == null) {
1522 cb = new IAppOpsCallback.Stub() {
Dianne Hackbornbef28fe2015-10-29 17:57:11 -07001523 public void opChanged(int op, int uid, String packageName) {
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001524 if (callback instanceof OnOpChangedInternalListener) {
1525 ((OnOpChangedInternalListener)callback).onOpChanged(op, packageName);
1526 }
1527 if (sOpToString[op] != null) {
1528 callback.onOpChanged(sOpToString[op], packageName);
1529 }
Dianne Hackbornc2293022013-02-06 23:14:49 -08001530 }
1531 };
1532 mModeWatchers.put(callback, cb);
1533 }
1534 try {
1535 mService.startWatchingMode(op, packageName, cb);
1536 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001537 throw e.rethrowFromSystemServer();
Dianne Hackbornc2293022013-02-06 23:14:49 -08001538 }
1539 }
1540 }
1541
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001542 /**
1543 * Stop monitoring that was previously started with {@link #startWatchingMode}. All
1544 * monitoring associated with this callback will be removed.
1545 */
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001546 public void stopWatchingMode(OnOpChangedListener callback) {
Dianne Hackbornc2293022013-02-06 23:14:49 -08001547 synchronized (mModeWatchers) {
1548 IAppOpsCallback cb = mModeWatchers.get(callback);
1549 if (cb != null) {
1550 try {
1551 mService.stopWatchingMode(cb);
1552 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001553 throw e.rethrowFromSystemServer();
Dianne Hackbornc2293022013-02-06 23:14:49 -08001554 }
1555 }
1556 }
1557 }
1558
Dianne Hackborn95d78532013-09-11 09:51:14 -07001559 private String buildSecurityExceptionMsg(int op, int uid, String packageName) {
1560 return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op];
1561 }
1562
Adam Lesinskib5cf61b2014-08-18 16:10:28 -07001563 /**
1564 * {@hide}
1565 */
1566 public static int strOpToOp(String op) {
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001567 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 */
1590 public int checkOp(String op, int uid, String packageName) {
1591 return checkOp(strOpToOp(op), uid, packageName);
1592 }
1593
1594 /**
John Spurlock925b85e2014-03-10 16:52:11 -04001595 * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001596 * returns {@link #MODE_ERRORED}.
1597 */
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 */
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 */
1624 public int noteOpNoThrow(String op, int uid, String packageName) {
1625 return noteOpNoThrow(strOpToOp(op), uid, packageName);
1626 }
1627
1628 /**
Svet Ganov99b60432015-06-27 13:15:22 -07001629 * 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 */
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 */
1651 public int noteProxyOpNoThrow(String op, String proxiedPackageName) {
1652 return noteProxyOpNoThrow(strOpToOp(op), proxiedPackageName);
1653 }
1654
1655 /**
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001656 * 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 */
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 */
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 */
1689 public void finishOp(String op, int uid, String packageName) {
1690 finishOp(strOpToOp(op), uid, packageName);
1691 }
1692
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001693 /**
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.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001708 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001709 */
Dianne Hackborn35654b62013-01-14 17:38:02 -08001710 public int checkOp(int op, int uid, String packageName) {
1711 try {
1712 int mode = mService.checkOperation(op, uid, packageName);
1713 if (mode == MODE_ERRORED) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001714 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
Dianne Hackborn35654b62013-01-14 17:38:02 -08001715 }
1716 return mode;
1717 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001718 throw e.rethrowFromSystemServer();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001719 }
Dianne Hackborn35654b62013-01-14 17:38:02 -08001720 }
1721
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001722 /**
1723 * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it
1724 * returns {@link #MODE_ERRORED}.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001725 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001726 */
Dianne Hackborn35654b62013-01-14 17:38:02 -08001727 public int checkOpNoThrow(int op, int uid, String packageName) {
1728 try {
1729 return mService.checkOperation(op, uid, packageName);
1730 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001731 throw e.rethrowFromSystemServer();
Dianne Hackborn35654b62013-01-14 17:38:02 -08001732 }
Dianne Hackborn35654b62013-01-14 17:38:02 -08001733 }
1734
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001735 /**
Jeff Sharkey911d7f42013-09-05 18:11:45 -07001736 * 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 */
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) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001748 throw e.rethrowFromSystemServer();
Jeff Sharkey911d7f42013-09-05 18:11:45 -07001749 }
1750 }
1751
1752 /**
John Spurlock1af30c72014-03-10 08:33:35 -04001753 * Like {@link #checkOp} but at a stream-level for audio operations.
1754 * @hide
1755 */
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) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001764 throw e.rethrowFromSystemServer();
John Spurlock1af30c72014-03-10 08:33:35 -04001765 }
John Spurlock1af30c72014-03-10 08:33:35 -04001766 }
1767
1768 /**
1769 * Like {@link #checkAudioOp} but instead of throwing a {@link SecurityException} it
1770 * returns {@link #MODE_ERRORED}.
1771 * @hide
1772 */
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) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001777 throw e.rethrowFromSystemServer();
John Spurlock1af30c72014-03-10 08:33:35 -04001778 }
John Spurlock1af30c72014-03-10 08:33:35 -04001779 }
1780
1781 /**
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001782 * 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.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001794 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001795 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001796 public int noteOp(int op, int uid, String packageName) {
1797 try {
1798 int mode = mService.noteOperation(op, uid, packageName);
1799 if (mode == MODE_ERRORED) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001800 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001801 }
1802 return mode;
1803 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001804 throw e.rethrowFromSystemServer();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001805 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001806 }
1807
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001808 /**
Svet Ganov99b60432015-06-27 13:15:22 -07001809 * 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 */
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 */
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) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001847 throw e.rethrowFromSystemServer();
Svet Ganov99b60432015-06-27 13:15:22 -07001848 }
Svet Ganov99b60432015-06-27 13:15:22 -07001849 }
1850
1851 /**
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001852 * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it
1853 * returns {@link #MODE_ERRORED}.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001854 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001855 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001856 public int noteOpNoThrow(int op, int uid, String packageName) {
1857 try {
1858 return mService.noteOperation(op, uid, packageName);
1859 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001860 throw e.rethrowFromSystemServer();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001861 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001862 }
1863
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001864 /** @hide */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001865 public int noteOp(int op) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001866 return noteOp(op, Process.myUid(), mContext.getOpPackageName());
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001867 }
1868
Dianne Hackborne98f5db2013-07-17 17:23:25 -07001869 /** @hide */
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) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001878 throw e.rethrowFromSystemServer();
Dianne Hackborne98f5db2013-07-17 17:23:25 -07001879 }
1880 return sToken;
1881 }
1882 }
1883
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001884 /**
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.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001899 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001900 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001901 public int startOp(int op, int uid, String packageName) {
1902 try {
Dianne Hackborne98f5db2013-07-17 17:23:25 -07001903 int mode = mService.startOperation(getToken(mService), op, uid, packageName);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001904 if (mode == MODE_ERRORED) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001905 throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001906 }
1907 return mode;
1908 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001909 throw e.rethrowFromSystemServer();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001910 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001911 }
1912
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001913 /**
1914 * Like {@link #startOp} but instead of throwing a {@link SecurityException} it
1915 * returns {@link #MODE_ERRORED}.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001916 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001917 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001918 public int startOpNoThrow(int op, int uid, String packageName) {
1919 try {
Dianne Hackborne98f5db2013-07-17 17:23:25 -07001920 return mService.startOperation(getToken(mService), op, uid, packageName);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001921 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001922 throw e.rethrowFromSystemServer();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001923 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001924 }
1925
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001926 /** @hide */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001927 public int startOp(int op) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001928 return startOp(op, Process.myUid(), mContext.getOpPackageName());
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001929 }
1930
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001931 /**
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.
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001936 * @hide
Dianne Hackborn1304f4a2013-07-09 18:17:27 -07001937 */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001938 public void finishOp(int op, int uid, String packageName) {
1939 try {
Dianne Hackborne98f5db2013-07-17 17:23:25 -07001940 mService.finishOperation(getToken(mService), op, uid, packageName);
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001941 } catch (RemoteException e) {
Jeff Sharkeyf8880562016-02-26 13:03:01 -07001942 throw e.rethrowFromSystemServer();
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001943 }
1944 }
1945
Dianne Hackborn9bb0ee92013-09-22 12:31:38 -07001946 /** @hide */
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001947 public void finishOp(int op) {
Dianne Hackborn95d78532013-09-11 09:51:14 -07001948 finishOp(op, Process.myUid(), mContext.getOpPackageName());
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001949 }
Jeff Sharkey35e46d22017-06-09 10:01:20 -06001950
1951 /** @hide */
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 }
Dianne Hackborna06de0f2012-12-11 16:34:47 -08001959}