AppOpsManager.java revision ba50b97cff80e73620a0e3d13cae169e095974a7
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
19d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackbornimport android.Manifest;
20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService;
21c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackbornimport com.android.internal.app.IAppOpsCallback;
22a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
2335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.ArrayList;
24c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackbornimport java.util.HashMap;
2535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List;
2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
27a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context;
2835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel;
2935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable;
30a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process;
31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException;
32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
33d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn/**
34d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * API for interacting with "application operation" tracking.  Allows you to:
35d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
36d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Note when operations are happening, and find out if they are allowed for the current caller.
37d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Disallow specific apps from doing specific operations.
38d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Collect all of the current information about operations that have been executed or are not
39d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * being allowed.
40d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * - Monitor for changes in whether an operation is allowed.
41d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
42d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * Each operation is identified by a single integer; these integers are a fixed set of
43d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * operations, enumerated by the OP_* constants.
44d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
45d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * When checking operations, the result is a "mode" integer indicating the current setting
46d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * for the operation under that caller: MODE_ALLOWED, MODE_IGNORED (don't execute the operation but
47d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * fake its behavior enough so that the caller doesn't crash), MODE_ERRORED (through a
48d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * SecurityException back to the caller; the normal operation calls will do this for you).
49d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn *
50d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn * @hide
51d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn */
52a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager {
53a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final Context mContext;
54a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final IAppOpsService mService;
55c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    final HashMap<Callback, IAppOpsCallback> mModeWatchers
56c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            = new HashMap<Callback, IAppOpsCallback>();
57a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
58a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ALLOWED = 0;
59a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_IGNORED = 1;
60a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ERRORED = 2;
61a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
62fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    // when adding one of these:
63fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    //  - increment _NUM_OP
64fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    //  - add rows to sOpToSwitch, sOpNames, sOpPerms
65fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    //  - add descriptive strings to Settings/res/values/arrays.xml
66f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_NONE = -1;
6735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_COARSE_LOCATION = 0;
6835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_FINE_LOCATION = 1;
6935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_GPS = 2;
7035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_VIBRATE = 3;
7135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CONTACTS = 4;
7235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CONTACTS = 5;
7335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CALL_LOG = 6;
7435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CALL_LOG = 7;
755e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_READ_CALENDAR = 8;
765e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WRITE_CALENDAR = 9;
775e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WIFI_SCAN = 10;
784a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler    public static final int OP_POST_NOTIFICATION = 11;
79f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_NEIGHBORING_CELLS = 12;
80f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_CALL_PHONE = 13;
81f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_SMS = 14;
82f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_SMS = 15;
83f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_SMS = 16;
84f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_EMERGECY_SMS = 17;
85f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_MMS = 18;
86f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_WAP_PUSH = 19;
87f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_SEND_SMS = 20;
88f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_ICC_SMS = 21;
89f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_ICC_SMS = 22;
90961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn    public static final int OP_WRITE_SETTINGS = 23;
91c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public static final int OP_SYSTEM_ALERT_WINDOW = 24;
92fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler    public static final int OP_ACCESS_NOTIFICATIONS = 25;
93d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_CAMERA = 26;
94d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_RECORD_AUDIO = 27;
95d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    public static final int OP_PLAY_AUDIO = 28;
96efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn    public static final int OP_READ_CLIPBOARD = 29;
97efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn    public static final int OP_WRITE_CLIPBOARD = 30;
98ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_TAKE_MEDIA_BUTTONS = 31;
99ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_TAKE_AUDIO_FOCUS = 32;
100ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_MASTER_VOLUME = 33;
101ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_VOICE_VOLUME = 34;
102ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_RING_VOLUME = 35;
103ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_MEDIA_VOLUME = 36;
104ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_ALARM_VOLUME = 37;
105ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_NOTIFICATION_VOLUME = 38;
106ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int OP_AUDIO_BLUETOOTH_VOLUME = 39;
107f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /** @hide */
108ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn    public static final int _NUM_OP = 40;
109f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
110f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
111f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This maps each operation to the operation that serves as the
112f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * switch to determine whether it is allowed.  Generally this is
113f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * a 1:1 mapping, but for some things (like location) that have
114f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * multiple low-level operations being tracked that should be
115f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * presented to hte user as one switch then this can be used to
116f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * make them all controlled by the same single operation.
117f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
118f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    private static int[] sOpToSwitch = new int[] {
119f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
120f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
121f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
122f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_VIBRATE,
123f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CONTACTS,
124f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CONTACTS,
125f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALL_LOG,
126f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALL_LOG,
127f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALENDAR,
128f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALENDAR,
129f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
130f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_POST_NOTIFICATION,
131f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
132f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_CALL_PHONE,
133f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
134f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
135f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
136f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
137f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
138f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
139f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
140f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
141f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
142961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            OP_WRITE_SETTINGS,
143c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            OP_SYSTEM_ALERT_WINDOW,
144fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            OP_ACCESS_NOTIFICATIONS,
145d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_CAMERA,
146d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_RECORD_AUDIO,
147d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            OP_PLAY_AUDIO,
148efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            OP_READ_CLIPBOARD,
149efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            OP_WRITE_CLIPBOARD,
150ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_TAKE_MEDIA_BUTTONS,
151ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_TAKE_AUDIO_FOCUS,
152ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_MASTER_VOLUME,
153ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_VOICE_VOLUME,
154ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_RING_VOLUME,
155ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_MEDIA_VOLUME,
156ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_ALARM_VOLUME,
157ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_NOTIFICATION_VOLUME,
158ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            OP_AUDIO_BLUETOOTH_VOLUME,
159f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    };
1605e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
161f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
162f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This provides a simple name for each operation to be used
163f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * in debug output.
164f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
1655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpNames = new String[] {
166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "COARSE_LOCATION",
167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "FINE_LOCATION",
168f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "GPS",
169f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "VIBRATE",
170f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CONTACTS",
171f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CONTACTS",
172f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALL_LOG",
173f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALL_LOG",
174f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALENDAR",
175f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALENDAR",
176f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WIFI_SCAN",
177f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "POST_NOTIFICATION",
178f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "NEIGHBORING_CELLS",
179f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "CALL_PHONE",
180f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_SMS",
181f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_SMS",
182f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_SMS",
183f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_EMERGECY_SMS",
184f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_MMS",
185f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_WAP_PUSH",
186f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "SEND_SMS",
187f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_ICC_SMS",
188f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_ICC_SMS",
189961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            "WRITE_SETTINGS",
190c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            "SYSTEM_ALERT_WINDOW",
191fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            "ACCESS_NOTIFICATIONS",
192d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "CAMERA",
193d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "RECORD_AUDIO",
194d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            "PLAY_AUDIO",
195efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            "READ_CLIPBOARD",
196efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            "WRITE_CLIPBOARD",
197ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "TAKE_MEDIA_BUTTONS",
198ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "TAKE_AUDIO_FOCUS",
199ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_MASTER_VOLUME",
200ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_VOICE_VOLUME",
201ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_RING_VOLUME",
202ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_MEDIA_VOLUME",
203ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_ALARM_VOLUME",
204ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_NOTIFICATION_VOLUME",
205ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            "AUDIO_BLUETOOTH_VOLUME",
2065e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
2075e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
208f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
209f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This optionally maps a permission to an operation.  If there
210f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * is no permission associated with an operation, it is null.
211f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
2125e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpPerms = new String[] {
213f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_COARSE_LOCATION,
214f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_FINE_LOCATION,
215f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null,
216f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.VIBRATE,
217f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CONTACTS,
218f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CONTACTS,
219f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALL_LOG,
220f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALL_LOG,
221f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALENDAR,
222f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALENDAR,
223f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // no permission required for notifications
224f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_WIFI_STATE,
225f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // neighboring cells shares the coarse location perm
226f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.CALL_PHONE,
227f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
228f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
229f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_SMS,
230f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST,
231f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_MMS,
232f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_WAP_PUSH,
233f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.SEND_SMS,
234f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
235f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
236961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            android.Manifest.permission.WRITE_SETTINGS,
237c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            android.Manifest.permission.SYSTEM_ALERT_WINDOW,
238fde19b106b2b77bc3540b04445357870caf878b5Daniel Sandler            android.Manifest.permission.ACCESS_NOTIFICATIONS,
239d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            android.Manifest.permission.CAMERA,
240d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            android.Manifest.permission.RECORD_AUDIO,
241d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn            null, // no permission for playing audio
242efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            null, // no permission for reading clipboard
243efcc1a23a1f731390ef8506b3536b9562d18ed78Dianne Hackborn            null, // no permission for writing clipboard
244ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for taking media buttons
245ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for taking audio focus
246ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing master volume
247ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing voice volume
248ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing ring volume
249ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing media volume
250ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing alarm volume
251ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing notification volume
252ba50b97cff80e73620a0e3d13cae169e095974a7Dianne Hackborn            null, // no permission for changing bluetooth volume
2535e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
2545e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
255d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
256d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve the op switch that controls the given operation.
257d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
258f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static int opToSwitch(int op) {
259f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn        return sOpToSwitch[op];
260f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    }
261f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
262d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
263d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve a non-localized name for the operation, for debugging output.
264d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToName(int op) {
266c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        if (op == OP_NONE) return "NONE";
2675e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")");
2685e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
269a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
270d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
271d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve the permission associated with an operation, or null if there is not one.
272d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
2735e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToPermission(int op) {
2745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return sOpPerms[op];
275a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
276a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
277d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
278d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Class holding all of the operation information associated with an app.
279d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
28035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class PackageOps implements Parcelable {
28135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final String mPackageName;
28235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mUid;
28335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final List<OpEntry> mEntries;
28435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
28535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public PackageOps(String packageName, int uid, List<OpEntry> entries) {
28635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = packageName;
28735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = uid;
28835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = entries;
28935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
29035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
29135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public String getPackageName() {
29235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mPackageName;
29335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
29435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
29535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getUid() {
29635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mUid;
29735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
29835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
29935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public List<OpEntry> getOps() {
30035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mEntries;
30135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
30235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
30335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
30435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
30535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
30635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
30735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
30835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
30935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
31035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeString(mPackageName);
31135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mUid);
31235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mEntries.size());
31335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<mEntries.size(); i++) {
31435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.get(i).writeToParcel(dest, flags);
31535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
31635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
31735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
31835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        PackageOps(Parcel source) {
31935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = source.readString();
32035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = source.readInt();
32135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = new ArrayList<OpEntry>();
32235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            final int N = source.readInt();
32335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<N; i++) {
32435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.add(OpEntry.CREATOR.createFromParcel(source));
32535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
32635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
32735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
32835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() {
32935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps createFromParcel(Parcel source) {
33035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps(source);
33135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
33235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
33335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps[] newArray(int size) {
33435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps[size];
33535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
33635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
33735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
33835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
339d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
340d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Class holding the information about one unique operation of an application.
341d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
34235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class OpEntry implements Parcelable {
34335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mOp;
3445e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final int mMode;
34535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final long mTime;
3465e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final long mRejectTime;
34735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mDuration;
34835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
3495e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public OpEntry(int op, int mode, long time, long rejectTime, int duration) {
35035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = op;
3515e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = mode;
35235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = time;
3535e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = rejectTime;
35435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = duration;
35535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
35635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
35735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getOp() {
35835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mOp;
35935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
36035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
3615e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public int getMode() {
3625e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mMode;
3635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
3645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
36535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public long getTime() {
36635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mTime;
36735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
36835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
3695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public long getRejectTime() {
3705e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mRejectTime;
3715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
3725e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
37335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public boolean isRunning() {
37435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1;
37535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
37635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
37735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getDuration() {
37835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration;
37935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
38035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
38135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
38235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
38335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
38435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
38535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
38635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
38735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
38835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mOp);
3895e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeInt(mMode);
39035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeLong(mTime);
3915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeLong(mRejectTime);
39235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mDuration);
39335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
39435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
39535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        OpEntry(Parcel source) {
39635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = source.readInt();
3975e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = source.readInt();
39835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = source.readLong();
3995e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = source.readLong();
40035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = source.readInt();
40135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
40235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
40335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() {
40435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry createFromParcel(Parcel source) {
40535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry(source);
40635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
40735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
40835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry[] newArray(int size) {
40935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry[size];
41035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
41135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
41235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
41335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
414d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
415d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Callback for notification of changes to operation state.
416d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
417c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public interface Callback {
418c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        public void opChanged(int op, String packageName);
419c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
420c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
421a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public AppOpsManager(Context context, IAppOpsService service) {
422a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mContext = context;
423a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mService = service;
424a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
425a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
426d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
427d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve current operation state for all applications.
428d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     *
429d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param ops The set of operations you are interested in, or null if you want all of them.
430d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
43135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
43235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
43335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.getPackagesForOps(ops);
43435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
43535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
43635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return null;
43735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
43835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
439d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn    /**
440d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * Retrieve current operation state for one application.
441d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     *
442d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param uid The uid of the application of interest.
443d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param packageName The name of the application of interest.
444d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     * @param ops The set of operations you are interested in, or null if you want all of them.
445d7d28e675ea7aac151c0c302d233b476537af946Dianne Hackborn     */
44672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
44772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        try {
44872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn            return mService.getOpsForPackage(uid, packageName, ops);
44972e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        } catch (RemoteException e) {
45072e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        }
45172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        return null;
45272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    }
45372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn
4545e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public void setMode(int code, int uid, String packageName, int mode) {
4555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        try {
4565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mService.setMode(code, uid, packageName, mode);
4575e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        } catch (RemoteException e) {
4585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
4595e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
4605e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
461c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public void startWatchingMode(int op, String packageName, final Callback callback) {
462c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        synchronized (mModeWatchers) {
463c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            IAppOpsCallback cb = mModeWatchers.get(callback);
464c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            if (cb == null) {
465c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                cb = new IAppOpsCallback.Stub() {
466c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    public void opChanged(int op, String packageName) {
467c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                        callback.opChanged(op, packageName);
468c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    }
469c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                };
470c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                mModeWatchers.put(callback, cb);
471c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
472c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            try {
473c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                mService.startWatchingMode(op, packageName, cb);
474c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            } catch (RemoteException e) {
475c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
476c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        }
477c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
478c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
479c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    public void stopWatchingMode(Callback callback) {
480c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        synchronized (mModeWatchers) {
481c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            IAppOpsCallback cb = mModeWatchers.get(callback);
482c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            if (cb != null) {
483c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                try {
484c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                    mService.stopWatchingMode(cb);
485c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                } catch (RemoteException e) {
486c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn                }
487c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn            }
488c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn        }
489c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn    }
490c2293025a25e04b26bf53713d71f85fd9ca5e8e9Dianne Hackborn
49135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOp(int op, int uid, String packageName) {
49235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
49335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            int mode = mService.checkOperation(op, uid, packageName);
49435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            if (mode == MODE_ERRORED) {
49535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                throw new SecurityException("Operation not allowed");
49635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
49735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mode;
49835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
49935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
50035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
50135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
50235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
50335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOpNoThrow(int op, int uid, String packageName) {
50435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
50535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.checkOperation(op, uid, packageName);
50635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
50735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
50835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
50935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
51035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
511a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op, int uid, String packageName) {
512a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
513a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.noteOperation(op, uid, packageName);
514a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
515a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
516a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
517a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
518a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
519a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
520a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
521a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
522a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
523a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOpNoThrow(int op, int uid, String packageName) {
524a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
525a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.noteOperation(op, uid, packageName);
526a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
527a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
528a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
529a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
530a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
531a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op) {
532d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return noteOp(op, Process.myUid(), mContext.getBasePackageName());
533a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
534a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
535a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op, int uid, String packageName) {
536a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
537a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.startOperation(op, uid, packageName);
538a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
539a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
540a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
541a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
542a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
543a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
544a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
545a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
546a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
547a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOpNoThrow(int op, int uid, String packageName) {
548a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
549a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.startOperation(op, uid, packageName);
550a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
551a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
552a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
553a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
554a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
555a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op) {
556d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return startOp(op, Process.myUid(), mContext.getBasePackageName());
557a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
558a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
559a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op, int uid, String packageName) {
560a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
561a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mService.finishOperation(op, uid, packageName);
562a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
563a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
564a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
565a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
566a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op) {
567d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        finishOp(op, Process.myUid(), mContext.getBasePackageName());
568a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
569a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn}
570