AppOpsManager.java revision f5d831915dd11e77cdcf5669228c55fe17a21c5e
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;
2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List;
2735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
28a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context;
2935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel;
3035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable;
31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process;
32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException;
33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
34d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn/**
35d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * API for interacting with "application operation" tracking.  Allows you to:
36d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
371304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <ul>
381304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Note when operations are happening, and find out if they are allowed for the current
391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * caller.</li>
401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Disallow specific apps from doing specific operations.</li>
411304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Collect all of the current information about operations that have been executed or are not
421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * being allowed.</li>
431304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <li> Monitor for changes in whether an operation is allowed.</li>
441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * </ul>
45d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <p>Each operation is identified by a single integer; these integers are a fixed set of
47d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * operations, enumerated by the OP_* constants.
48d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn * <p></p>When checking operations, the result is a "mode" integer indicating the current setting
50d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute the operation but
51d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * fake its behavior enough so that the caller doesn't crash), MODE_ERRORED (through a
52d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * SecurityException back to the caller; the normal operation calls will do this for you).
53d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */
54a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager {
55a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final Context mContext;
56a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final IAppOpsService mService;
573e82ba1a67b0c756ab6a289985f4cfc53725b311Dianne Hackborn    final ArrayMap<Callback, IAppOpsCallback> mModeWatchers
583e82ba1a67b0c756ab6a289985f4cfc53725b311Dianne Hackborn            = new ArrayMap<Callback, IAppOpsCallback>();
59a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
60e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn    static IBinder sToken;
61e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn
62a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ALLOWED = 0;
63a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_IGNORED = 1;
64a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ERRORED = 2;
65a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
66fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    // when adding one of these:
67fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    //  - increment _NUM_OP
68f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    //  - add rows to sOpToSwitch, sOpNames, sOpPerms, sOpDefaultMode
69fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    //  - add descriptive strings to Settings/res/values/arrays.xml
700b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie    //  - add the op to the appropriate template in AppOpsState.OpsTemplate (settings app)
711304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn
721304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** No operation specified. */
73f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_NONE = -1;
741304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** Access to coarse location information. */
7535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_COARSE_LOCATION = 0;
761304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** Access to fine location information. */
7735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_FINE_LOCATION = 1;
781304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** Causing GPS to run. */
7935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_GPS = 2;
801304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
8135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_VIBRATE = 3;
821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
8335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CONTACTS = 4;
841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
8535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CONTACTS = 5;
861304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
8735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CALL_LOG = 6;
881304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
8935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CALL_LOG = 7;
901304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_READ_CALENDAR = 8;
921304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WRITE_CALENDAR = 9;
941304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
955e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WIFI_SCAN = 10;
961304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
974a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler    public static final int OP_POST_NOTIFICATION = 11;
981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
99f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_NEIGHBORING_CELLS = 12;
1001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
101f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_CALL_PHONE = 13;
1021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
103f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_SMS = 14;
1041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
105f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_SMS = 15;
1061304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
107f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_SMS = 16;
1081304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
109f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_EMERGECY_SMS = 17;
1101304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
111f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_MMS = 18;
1121304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
113f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_WAP_PUSH = 19;
1141304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
115f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_SEND_SMS = 20;
1161304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
117f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_ICC_SMS = 21;
1181304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
119f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_ICC_SMS = 22;
1201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
121961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn    public static final int OP_WRITE_SETTINGS = 23;
1221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
123c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public static final int OP_SYSTEM_ALERT_WINDOW = 24;
1241304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
125fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    public static final int OP_ACCESS_NOTIFICATIONS = 25;
1261304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
127d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_CAMERA = 26;
1281304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
129d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_RECORD_AUDIO = 27;
1301304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
131d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_PLAY_AUDIO = 28;
1321304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
133efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn    public static final int OP_READ_CLIPBOARD = 29;
1341304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
135efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn    public static final int OP_WRITE_CLIPBOARD = 30;
1361304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
137ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_TAKE_MEDIA_BUTTONS = 31;
1381304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
139ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_TAKE_AUDIO_FOCUS = 32;
1401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
141ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_MASTER_VOLUME = 33;
1421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
143ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_VOICE_VOLUME = 34;
1441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
145ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_RING_VOLUME = 35;
1461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
147ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_MEDIA_VOLUME = 36;
1481304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
149ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_ALARM_VOLUME = 37;
1501304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
151ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38;
1521304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
153ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39;
1541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
155713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn    public static final int OP_WAKE_LOCK = 40;
1561304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** Continually monitoring location data. */
1571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    public static final int OP_MONITOR_LOCATION = 41;
1580b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie    /** Continually monitoring location data with a relatively high power request. */
1590b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie    public static final int OP_MONITOR_HIGH_POWER_LOCATION = 42;
160f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /** @hide */
1610b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie    public static final int _NUM_OP = 43;
162f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
163f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
164f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This maps each operation to the operation that serves as the
165f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * switch to determine whether it is allowed.  Generally this is
166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * a 1:1 mapping, but for some things (like location) that have
167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * multiple low-level operations being tracked that should be
1680b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie     * presented to the user as one switch then this can be used to
169f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * make them all controlled by the same single operation.
170f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
171f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    private static int[] sOpToSwitch = new int[] {
172f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
173f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
174f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
175f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_VIBRATE,
176f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CONTACTS,
177f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CONTACTS,
178f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALL_LOG,
179f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALL_LOG,
180f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALENDAR,
181f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALENDAR,
182f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
183f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_POST_NOTIFICATION,
184f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
185f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_CALL_PHONE,
186f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
187f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
18818966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun            OP_RECEIVE_SMS,
18918966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun            OP_RECEIVE_SMS,
19018966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun            OP_RECEIVE_SMS,
19118966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun            OP_RECEIVE_SMS,
19218966a8dd8dfae553eaaafa87a656af3b7518fc6David Braun            OP_SEND_SMS,
193f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
194f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
195961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            OP_WRITE_SETTINGS,
196c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            OP_SYSTEM_ALERT_WINDOW,
197fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            OP_ACCESS_NOTIFICATIONS,
198d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_CAMERA,
199d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_RECORD_AUDIO,
200d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_PLAY_AUDIO,
201efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            OP_READ_CLIPBOARD,
202efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            OP_WRITE_CLIPBOARD,
203ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_TAKE_MEDIA_BUTTONS,
204ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_TAKE_AUDIO_FOCUS,
205ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_MASTER_VOLUME,
206ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_VOICE_VOLUME,
207ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_RING_VOLUME,
208ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_MEDIA_VOLUME,
209ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_ALARM_VOLUME,
210ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_NOTIFICATION_VOLUME,
211ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_BLUETOOTH_VOLUME,
212713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn            OP_WAKE_LOCK,
2131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn            OP_COARSE_LOCATION,
2140b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie            OP_COARSE_LOCATION,
215f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    };
2165e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
217f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
218f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This provides a simple name for each operation to be used
219f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * in debug output.
220f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
2215e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpNames = new String[] {
222f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "COARSE_LOCATION",
223f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "FINE_LOCATION",
224f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "GPS",
225f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "VIBRATE",
226f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CONTACTS",
227f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CONTACTS",
228f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALL_LOG",
229f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALL_LOG",
230f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALENDAR",
231f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALENDAR",
232f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WIFI_SCAN",
233f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "POST_NOTIFICATION",
234f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "NEIGHBORING_CELLS",
235f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "CALL_PHONE",
236f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_SMS",
237f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_SMS",
238f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_SMS",
239f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_EMERGECY_SMS",
240f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_MMS",
241f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_WAP_PUSH",
242f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "SEND_SMS",
243f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_ICC_SMS",
244f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_ICC_SMS",
245961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            "WRITE_SETTINGS",
246c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            "SYSTEM_ALERT_WINDOW",
247fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            "ACCESS_NOTIFICATIONS",
248d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "CAMERA",
249d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "RECORD_AUDIO",
250d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "PLAY_AUDIO",
251efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            "READ_CLIPBOARD",
252efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            "WRITE_CLIPBOARD",
253ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "TAKE_MEDIA_BUTTONS",
254ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "TAKE_AUDIO_FOCUS",
255ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_MASTER_VOLUME",
256ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_VOICE_VOLUME",
257ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_RING_VOLUME",
258ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_MEDIA_VOLUME",
259ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_ALARM_VOLUME",
260ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_NOTIFICATION_VOLUME",
261ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_BLUETOOTH_VOLUME",
262713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn            "WAKE_LOCK",
2631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn            "MONITOR_LOCATION",
2640b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie            "MONITOR_HIGH_POWER_LOCATION",
2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
2665e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
267f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
268f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This optionally maps a permission to an operation.  If there
269f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * is no permission associated with an operation, it is null.
270f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
2715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpPerms = new String[] {
272f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_COARSE_LOCATION,
273f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_FINE_LOCATION,
274f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null,
275f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.VIBRATE,
276f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CONTACTS,
277f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CONTACTS,
278f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALL_LOG,
279f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALL_LOG,
280f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALENDAR,
281f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALENDAR,
282f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // no permission required for notifications
283f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_WIFI_STATE,
284f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // neighboring cells shares the coarse location perm
285f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.CALL_PHONE,
286f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
287f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
288f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_SMS,
289f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST,
290f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_MMS,
291f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_WAP_PUSH,
292f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.SEND_SMS,
293f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
294f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
295961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            android.Manifest.permission.WRITE_SETTINGS,
296c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            android.Manifest.permission.SYSTEM_ALERT_WINDOW,
297fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            android.Manifest.permission.ACCESS_NOTIFICATIONS,
298d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            android.Manifest.permission.CAMERA,
299d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            android.Manifest.permission.RECORD_AUDIO,
300d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            null, // no permission for playing audio
301efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            null, // no permission for reading clipboard
302efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            null, // no permission for writing clipboard
303ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for taking media buttons
304ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for taking audio focus
305ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing master volume
306ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing voice volume
307ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing ring volume
308ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing media volume
309ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing alarm volume
310ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing notification volume
311ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing bluetooth volume
312713df150b92a0a5eea877f99405e31eefbf93a09Dianne Hackborn            android.Manifest.permission.WAKE_LOCK,
3131304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn            null, // no permission for generic location monitoring
3140b8374501975aecd7a628336e2f7e53c272ebeeaDavid Christie            null, // no permission for high power location monitoring
3155e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
3165e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
317d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
318f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun     * This specifies the default mode for each operation.
319f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun     */
320f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    private static int[] sOpDefaultMode = new int[] {
321f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
322f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
323f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
324f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
325f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
326f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
327f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
328f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
329f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
330f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
331f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
332f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
333f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
334f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
335f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
336f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_IGNORED, // OP_WRITE_SMS
337f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
338f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
339f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
340f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
341f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
342f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
343f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
344f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
345f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
346f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
347f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
348f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
349f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
350f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
351f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
352f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
353f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
354f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
355f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
356f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
357f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
358f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
359f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
360f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
361f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
362f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
363f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun            AppOpsManager.MODE_ALLOWED,
364f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    };
365f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun
366f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    /**
367d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve the op switch that controls the given operation.
3681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
369d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
370f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static int opToSwitch(int op) {
371f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn        return sOpToSwitch[op];
372f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    }
373f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
374d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
375d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve a non-localized name for the operation, for debugging output.
376d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
3775e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToName(int op) {
378c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        if (op == OP_NONE) return "NONE";
3795e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")");
3805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
381a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
382d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
383d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve the permission associated with an operation, or null if there is not one.
3841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
385d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
3865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToPermission(int op) {
3875e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return sOpPerms[op];
388a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
389a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
390d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
391f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun     * Retrieve the default mode for the operation.
392f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun     * @hide
393f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun     */
394f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    public static int opToDefaultMode(int op) {
395f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun        return sOpDefaultMode[op];
396f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    }
397f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun
398f5d831915dd11e77cdcf5669228c55fe17a21c5eDavid Braun    /**
399d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Class holding all of the operation information associated with an app.
4001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
401d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
40235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class PackageOps implements Parcelable {
40335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final String mPackageName;
40435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mUid;
40535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final List<OpEntry> mEntries;
40635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
40735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public PackageOps(String packageName, int uid, List<OpEntry> entries) {
40835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = packageName;
40935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = uid;
41035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = entries;
41135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
41235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
41335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public String getPackageName() {
41435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mPackageName;
41535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
41635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
41735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getUid() {
41835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mUid;
41935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
42035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
42135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public List<OpEntry> getOps() {
42235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mEntries;
42335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
42435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
42535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
42635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
42735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
42835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
42935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
43035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
43135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
43235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeString(mPackageName);
43335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mUid);
43435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mEntries.size());
43535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<mEntries.size(); i++) {
43635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.get(i).writeToParcel(dest, flags);
43735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
43835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
43935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
44035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        PackageOps(Parcel source) {
44135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = source.readString();
44235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = source.readInt();
44335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = new ArrayList<OpEntry>();
44435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            final int N = source.readInt();
44535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<N; i++) {
44635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.add(OpEntry.CREATOR.createFromParcel(source));
44735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
44835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
44935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
45035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() {
45135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps createFromParcel(Parcel source) {
45235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps(source);
45335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
45435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
45535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps[] newArray(int size) {
45635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps[size];
45735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
45835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
45935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
46035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
461d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
462d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Class holding the information about one unique operation of an application.
4631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
464d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
46535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class OpEntry implements Parcelable {
46635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mOp;
4675e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final int mMode;
46835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final long mTime;
4695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final long mRejectTime;
47035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mDuration;
47135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
4725e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public OpEntry(int op, int mode, long time, long rejectTime, int duration) {
47335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = op;
4745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = mode;
47535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = time;
4765e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = rejectTime;
47735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = duration;
47835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
47935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
48035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getOp() {
48135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mOp;
48235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
48335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
4845e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public int getMode() {
4855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mMode;
4865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
4875e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
48835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public long getTime() {
48935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mTime;
49035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
49135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
4925e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public long getRejectTime() {
4935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mRejectTime;
4945e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
4955e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
49635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public boolean isRunning() {
49735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1;
49835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
49935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
50035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getDuration() {
50135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration;
50235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
50335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
50435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
50535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
50635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
50735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
50835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
50935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
51035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
51135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mOp);
5125e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeInt(mMode);
51335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeLong(mTime);
5145e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeLong(mRejectTime);
51535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mDuration);
51635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
51735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
51835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        OpEntry(Parcel source) {
51935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = source.readInt();
5205e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = source.readInt();
52135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = source.readLong();
5225e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = source.readLong();
52335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = source.readInt();
52435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
52535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
52635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() {
52735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry createFromParcel(Parcel source) {
52835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry(source);
52935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
53035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
53135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry[] newArray(int size) {
53235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry[size];
53335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
53435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
53535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
53635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
537d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
538d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Callback for notification of changes to operation state.
539d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
540c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public interface Callback {
541c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        public void opChanged(int op, String packageName);
542c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
543c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
5441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    AppOpsManager(Context context, IAppOpsService service) {
545a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mContext = context;
546a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mService = service;
547a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
548a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
549d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
550d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve current operation state for all applications.
551d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     *
552d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param ops The set of operations you are interested in, or null if you want all of them.
5531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
554d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
55535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
55635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
55735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.getPackagesForOps(ops);
55835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
55935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
56035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return null;
56135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
56235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
563d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
564d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve current operation state for one application.
565d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     *
566d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param uid The uid of the application of interest.
567d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param packageName The name of the application of interest.
568d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param ops The set of operations you are interested in, or null if you want all of them.
5691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @hide
570d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
57172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
57272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        try {
57372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn            return mService.getOpsForPackage(uid, packageName, ops);
57472e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        } catch (RemoteException e) {
57572e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        }
57672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        return null;
57772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    }
57872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn
5791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
5805e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public void setMode(int code, int uid, String packageName, int mode) {
5815e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        try {
5825e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mService.setMode(code, uid, packageName, mode);
5835e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        } catch (RemoteException e) {
5845e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
5855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
5865e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
587607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn    /** @hide */
588607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn    public void resetAllModes() {
589607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn        try {
590607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn            mService.resetAllModes();
591607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn        } catch (RemoteException e) {
592607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn        }
593607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn    }
594607b414d0444067e166fa54d8ea37563f2715ea3Dianne Hackborn
5951304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
5961304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Monitor for changes to the operating mode for the given op in the given app package.
5971304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param op The operation to monitor, one of OP_*.
5981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param packageName The name of the application to monitor.
5991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param callback Where to report changes.
6001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
601c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public void startWatchingMode(int op, String packageName, final Callback callback) {
602c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        synchronized (mModeWatchers) {
603c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            IAppOpsCallback cb = mModeWatchers.get(callback);
604c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            if (cb == null) {
605c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                cb = new IAppOpsCallback.Stub() {
606c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    public void opChanged(int op, String packageName) {
607c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                        callback.opChanged(op, packageName);
608c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    }
609c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                };
610c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                mModeWatchers.put(callback, cb);
611c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
612c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            try {
613c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                mService.startWatchingMode(op, packageName, cb);
614c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            } catch (RemoteException e) {
615c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
616c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        }
617c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
618c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
6191304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
6201304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Stop monitoring that was previously started with {@link #startWatchingMode}.  All
6211304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * monitoring associated with this callback will be removed.
6221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
623c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public void stopWatchingMode(Callback callback) {
624c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        synchronized (mModeWatchers) {
625c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            IAppOpsCallback cb = mModeWatchers.get(callback);
626c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            if (cb != null) {
627c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                try {
628c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    mService.stopWatchingMode(cb);
629c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                } catch (RemoteException e) {
630c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                }
631c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
632c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        }
633c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
634c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
63595d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    private String buildSecurityExceptionMsg(int op, int uid, String packageName) {
63695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op];
63795d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn    }
63895d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn
6391304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
6401304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Do a quick check for whether an application might be able to perform an operation.
6411304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * This is <em>not</em> a security check; you must use {@link #noteOp(int, int, String)}
6421304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * or {@link #startOp(int, int, String)} for your actual security checks, which also
6431304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * ensure that the given uid and package name are consistent.  This function can just be
6441304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * used for a quick check to see if an operation has been disabled for the application,
6451304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * as an early reject of some work.  This does not modify the time stamp or other data
6461304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * about the operation.
6471304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param op The operation to check.  One of the OP_* constants.
6481304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param uid The user id of the application attempting to perform the operation.
6491304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param packageName The name of the application attempting to perform the operation.
6501304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or
6511304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without
6521304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * causing the app to crash).
6531304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @throws SecurityException If the app has been configured to crash on this op.
6541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
65535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOp(int op, int uid, String packageName) {
65635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
65735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            int mode = mService.checkOperation(op, uid, packageName);
65835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            if (mode == MODE_ERRORED) {
65995d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
66035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
66135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mode;
66235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
66335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
66435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
66535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
66635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
6671304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
6681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Like {@link #checkOp} but instead of throwing a {@link SecurityException} it
6691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * returns {@link #MODE_ERRORED}.
6701304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
67135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOpNoThrow(int op, int uid, String packageName) {
67235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
67335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.checkOperation(op, uid, packageName);
67435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
67535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
67635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
67735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
67835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
6791304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
680911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey     * Do a quick check to validate if a package name belongs to a UID.
681911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey     *
682911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey     * @throws SecurityException if the package name doesn't belong to the given
683911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey     *             UID, or if ownership cannot be verified.
684911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey     */
685911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey    public void checkPackage(int uid, String packageName) {
686911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey        try {
687911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey            if (mService.checkPackage(uid, packageName) != MODE_ALLOWED) {
688911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey                throw new SecurityException(
689911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey                        "Package " + packageName + " does not belong to " + uid);
690911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey            }
691911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey        } catch (RemoteException e) {
692911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey            throw new SecurityException("Unable to verify package ownership", e);
693911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey        }
694911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey    }
695911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey
696911d7f411f36f2279aae44c89ff1d33a29140046Jeff Sharkey    /**
6971304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Make note of an application performing an operation.  Note that you must pass
6981304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * in both the uid and name of the application to be checked; this function will verify
6991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * that these two match, and if not, return {@link #MODE_IGNORED}.  If this call
7001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * succeeds, the last execution time of the operation for this app will be updated to
7011304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * the current time.
7021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param op The operation to note.  One of the OP_* constants.
7031304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param uid The user id of the application attempting to perform the operation.
7041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param packageName The name of the application attempting to perform the operation.
7051304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or
7061304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without
7071304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * causing the app to crash).
7081304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @throws SecurityException If the app has been configured to crash on this op.
7091304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
710a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op, int uid, String packageName) {
711a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
712a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.noteOperation(op, uid, packageName);
713a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
71495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
715a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
716a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
717a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
718a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
719a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
720a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
721a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
7221304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
7231304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Like {@link #noteOp} but instead of throwing a {@link SecurityException} it
7241304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * returns {@link #MODE_ERRORED}.
7251304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
726a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOpNoThrow(int op, int uid, String packageName) {
727a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
728a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.noteOperation(op, uid, packageName);
729a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
730a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
731a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
732a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
733a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
7341304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
735a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op) {
73695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        return noteOp(op, Process.myUid(), mContext.getOpPackageName());
737a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
738a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
739e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn    /** @hide */
740e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn    public static IBinder getToken(IAppOpsService service) {
741e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn        synchronized (AppOpsManager.class) {
742e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            if (sToken != null) {
743e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn                return sToken;
744e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            }
745e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            try {
746e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn                sToken = service.getToken(new Binder());
747e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            } catch (RemoteException e) {
748e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn                // System is dead, whatevs.
749e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            }
750e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            return sToken;
751e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn        }
752e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn    }
753e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn
7541304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
7551304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Report that an application has started executing a long-running operation.  Note that you
7561304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * must pass in both the uid and name of the application to be checked; this function will
7571304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * verify that these two match, and if not, return {@link #MODE_IGNORED}.  If this call
7581304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * succeeds, the last execution time of the operation for this app will be updated to
7591304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * the current time and the operation will be marked as "running".  In this case you must
7601304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * later call {@link #finishOp(int, int, String)} to report when the application is no
7611304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * longer performing the operation.
7621304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param op The operation to start.  One of the OP_* constants.
7631304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param uid The user id of the application attempting to perform the operation.
7641304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @param packageName The name of the application attempting to perform the operation.
7651304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @return Returns {@link #MODE_ALLOWED} if the operation is allowed, or
7661304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * {@link #MODE_IGNORED} if it is not allowed and should be silently ignored (without
7671304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * causing the app to crash).
7681304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * @throws SecurityException If the app has been configured to crash on this op.
7691304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
770a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op, int uid, String packageName) {
771a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
772e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            int mode = mService.startOperation(getToken(mService), op, uid, packageName);
773a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
77495d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn                throw new SecurityException(buildSecurityExceptionMsg(op, uid, packageName));
775a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
776a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
777a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
778a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
779a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
780a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
781a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
7821304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
7831304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Like {@link #startOp} but instead of throwing a {@link SecurityException} it
7841304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * returns {@link #MODE_ERRORED}.
7851304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
786a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOpNoThrow(int op, int uid, String packageName) {
787a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
788e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            return mService.startOperation(getToken(mService), op, uid, packageName);
789a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
790a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
791a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
792a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
793a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
7941304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /** @hide */
795a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op) {
79695d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        return startOp(op, Process.myUid(), mContext.getOpPackageName());
797a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
798a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
7991304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn    /**
8001304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * Report that an application is no longer performing an operation that had previously
8011304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * been started with {@link #startOp(int, int, String)}.  There is no validation of input
8021304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * or result; the parameters supplied here must be the exact same ones previously passed
8031304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     * in when starting the operation.
8041304f4ae32cf7121fe11e95f2a7151ea208b6ccaDianne Hackborn     */
805a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op, int uid, String packageName) {
806a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
807e98f5dbe6b6f9f2cb6a73ee750faacda2596b34fDianne Hackborn            mService.finishOperation(getToken(mService), op, uid, packageName);
808a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
809a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
810a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
811a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
812a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op) {
81395d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn        finishOp(op, Process.myUid(), mContext.getOpPackageName());
814a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
815a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn}
816