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