AppOpsManager.java revision 961321fe4ed4431a6362d729d9e4ea26bdecde61
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
19f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackbornimport android.Manifest;
20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService;
21a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
2235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.ArrayList;
2335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport java.util.List;
2435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
25a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context;
2635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcel;
2735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackbornimport android.os.Parcelable;
28a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process;
29a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException;
30a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn/** @hide */
32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager {
33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final Context mContext;
34a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final IAppOpsService mService;
35a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
36a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ALLOWED = 0;
37a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_IGNORED = 1;
38a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ERRORED = 2;
39a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
40f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_NONE = -1;
4135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_COARSE_LOCATION = 0;
4235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_FINE_LOCATION = 1;
4335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_GPS = 2;
4435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_VIBRATE = 3;
4535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CONTACTS = 4;
4635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CONTACTS = 5;
4735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_READ_CALL_LOG = 6;
4835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static final int OP_WRITE_CALL_LOG = 7;
495e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_READ_CALENDAR = 8;
505e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WRITE_CALENDAR = 9;
515e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static final int OP_WIFI_SCAN = 10;
524a900acdef4559f9f84ca7e2bce45485215fc130Daniel Sandler    public static final int OP_POST_NOTIFICATION = 11;
53f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_NEIGHBORING_CELLS = 12;
54f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static final int OP_CALL_PHONE = 13;
55f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_SMS = 14;
56f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_SMS = 15;
57f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_SMS = 16;
58f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_EMERGECY_SMS = 17;
59f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_MMS = 18;
60f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_RECEIVE_WAP_PUSH = 19;
61f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_SEND_SMS = 20;
62f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_READ_ICC_SMS = 21;
63f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn    public static final int OP_WRITE_ICC_SMS = 22;
64961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn    public static final int OP_WRITE_SETTINGS = 23;
65f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /** @hide */
66961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn    public static final int _NUM_OP = 24;
67f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
68f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
69f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This maps each operation to the operation that serves as the
70f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * switch to determine whether it is allowed.  Generally this is
71f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * a 1:1 mapping, but for some things (like location) that have
72f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * multiple low-level operations being tracked that should be
73f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * presented to hte user as one switch then this can be used to
74f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * make them all controlled by the same single operation.
75f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
76f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    private static int[] sOpToSwitch = new int[] {
77f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
78f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
79f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
80f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_VIBRATE,
81f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CONTACTS,
82f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CONTACTS,
83f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALL_LOG,
84f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALL_LOG,
85f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_READ_CALENDAR,
86f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_WRITE_CALENDAR,
87f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
88f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_POST_NOTIFICATION,
89f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_COARSE_LOCATION,
90f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            OP_CALL_PHONE,
91f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
92f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
93f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
94f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
95f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
96f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
97f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
98f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_READ_SMS,
99f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            OP_WRITE_SMS,
100961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            OP_WRITE_SETTINGS,
101f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    };
1025e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
103f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
104f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This provides a simple name for each operation to be used
105f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * in debug output.
106f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
1075e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpNames = new String[] {
108f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "COARSE_LOCATION",
109f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "FINE_LOCATION",
110f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "GPS",
111f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "VIBRATE",
112f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CONTACTS",
113f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CONTACTS",
114f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALL_LOG",
115f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALL_LOG",
116f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "READ_CALENDAR",
117f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WRITE_CALENDAR",
118f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "WIFI_SCAN",
119f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "POST_NOTIFICATION",
120f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "NEIGHBORING_CELLS",
121f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            "CALL_PHONE",
122f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_SMS",
123f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_SMS",
124f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_SMS",
125f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_EMERGECY_SMS",
126f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_MMS",
127f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "RECEIVE_WAP_PUSH",
128f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "SEND_SMS",
129f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "READ_ICC_SMS",
130f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            "WRITE_ICC_SMS",
131961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            "WRITE_SETTINGS",
1325e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
1335e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
134f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    /**
135f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * This optionally maps a permission to an operation.  If there
136f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     * is no permission associated with an operation, it is null.
137f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn     */
1385e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    private static String[] sOpPerms = new String[] {
139f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_COARSE_LOCATION,
140f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_FINE_LOCATION,
141f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null,
142f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.VIBRATE,
143f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CONTACTS,
144f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CONTACTS,
145f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALL_LOG,
146f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALL_LOG,
147f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.READ_CALENDAR,
148f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.WRITE_CALENDAR,
149f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // no permission required for notifications
150f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.ACCESS_WIFI_STATE,
151f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            null, // neighboring cells shares the coarse location perm
152f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn            android.Manifest.permission.CALL_PHONE,
153f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
154f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
155f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_SMS,
156f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_EMERGENCY_BROADCAST,
157f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_MMS,
158f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.RECEIVE_WAP_PUSH,
159f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.SEND_SMS,
160f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.READ_SMS,
161f51f61269aacdfcf737b2c32b6b216c48ab61e65Dianne Hackborn            android.Manifest.permission.WRITE_SMS,
162961321fe4ed4431a6362d729d9e4ea26bdecde61Dianne Hackborn            android.Manifest.permission.WRITE_SETTINGS,
1635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    };
1645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
165f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    public static int opToSwitch(int op) {
166f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn        return sOpToSwitch[op];
167f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn    }
168f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn
1695e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToName(int op) {
1705e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return op < sOpNames.length ? sOpNames[op] : ("Unknown(" + op + ")");
1715e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
172a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
1735e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public static String opToPermission(int op) {
1745e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        return sOpPerms[op];
175a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
176a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
17735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class PackageOps implements Parcelable {
17835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final String mPackageName;
17935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mUid;
18035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final List<OpEntry> mEntries;
18135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
18235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public PackageOps(String packageName, int uid, List<OpEntry> entries) {
18335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = packageName;
18435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = uid;
18535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = entries;
18635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
18735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
18835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public String getPackageName() {
18935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mPackageName;
19035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
19135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
19235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getUid() {
19335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mUid;
19435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
19535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
19635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public List<OpEntry> getOps() {
19735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mEntries;
19835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
19935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
20035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
20135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
20235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
20335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
20435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
20535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
20635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
20735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeString(mPackageName);
20835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mUid);
20935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mEntries.size());
21035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<mEntries.size(); i++) {
21135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.get(i).writeToParcel(dest, flags);
21235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
21335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
21435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
21535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        PackageOps(Parcel source) {
21635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mPackageName = source.readString();
21735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mUid = source.readInt();
21835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mEntries = new ArrayList<OpEntry>();
21935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            final int N = source.readInt();
22035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            for (int i=0; i<N; i++) {
22135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                mEntries.add(OpEntry.CREATOR.createFromParcel(source));
22235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
22335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
22435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
22535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<PackageOps> CREATOR = new Creator<PackageOps>() {
22635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps createFromParcel(Parcel source) {
22735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps(source);
22835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
22935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
23035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public PackageOps[] newArray(int size) {
23135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new PackageOps[size];
23235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
23335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
23435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
23535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
23635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public static class OpEntry implements Parcelable {
23735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mOp;
2385e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final int mMode;
23935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final long mTime;
2405e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        private final long mRejectTime;
24135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        private final int mDuration;
24235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
2435e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public OpEntry(int op, int mode, long time, long rejectTime, int duration) {
24435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = op;
2455e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = mode;
24635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = time;
2475e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = rejectTime;
24835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = duration;
24935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
25035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
25135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getOp() {
25235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mOp;
25335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
25435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
2555e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public int getMode() {
2565e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mMode;
2575e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
2585e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
25935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public long getTime() {
26035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mTime;
26135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
26235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
2635e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        public long getRejectTime() {
2645e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            return mRejectTime;
2655e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
2665e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
26735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public boolean isRunning() {
26835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1;
26935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
27035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
27135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int getDuration() {
27235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mDuration == -1 ? (int)(System.currentTimeMillis()-mTime) : mDuration;
27335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
27435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
27535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
27635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public int describeContents() {
27735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return 0;
27835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
27935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
28035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        @Override
28135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public void writeToParcel(Parcel dest, int flags) {
28235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mOp);
2835e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeInt(mMode);
28435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeLong(mTime);
2855e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            dest.writeLong(mRejectTime);
28635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            dest.writeInt(mDuration);
28735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
28835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
28935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        OpEntry(Parcel source) {
29035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mOp = source.readInt();
2915e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mMode = source.readInt();
29235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mTime = source.readLong();
2935e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mRejectTime = source.readLong();
29435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            mDuration = source.readInt();
29535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
29635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
29735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        public static final Creator<OpEntry> CREATOR = new Creator<OpEntry>() {
29835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry createFromParcel(Parcel source) {
29935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry(source);
30035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
30135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
30235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            @Override public OpEntry[] newArray(int size) {
30335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                return new OpEntry[size];
30435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
30535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        };
30635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
30735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
308a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public AppOpsManager(Context context, IAppOpsService service) {
309a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mContext = context;
310a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mService = service;
311a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
312a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
31335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public List<AppOpsManager.PackageOps> getPackagesForOps(int[] ops) {
31435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
31535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.getPackagesForOps(ops);
31635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
31735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
31835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return null;
31935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
32035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
32172e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    public List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, int[] ops) {
32272e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        try {
32372e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn            return mService.getOpsForPackage(uid, packageName, ops);
32472e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        } catch (RemoteException e) {
32572e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        }
32672e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn        return null;
32772e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn    }
32872e3983d38f656cfa8c7a038eb80bdd9ea06768eDianne Hackborn
3295e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    public void setMode(int code, int uid, String packageName, int mode) {
3305e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        try {
3315e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn            mService.setMode(code, uid, packageName, mode);
3325e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        } catch (RemoteException e) {
3335e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn        }
3345e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn    }
3355e45ee6752528791deb66b83d76250685de15d47Dianne Hackborn
33635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOp(int op, int uid, String packageName) {
33735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
33835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            int mode = mService.checkOperation(op, uid, packageName);
33935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            if (mode == MODE_ERRORED) {
34035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn                throw new SecurityException("Operation not allowed");
34135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            }
34235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mode;
34335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
34435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
34535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
34635654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
34735654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
34835654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    public int checkOpNoThrow(int op, int uid, String packageName) {
34935654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        try {
35035654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn            return mService.checkOperation(op, uid, packageName);
35135654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        } catch (RemoteException e) {
35235654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        }
35335654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn        return MODE_IGNORED;
35435654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn    }
35535654b61e8fe7bc85afcb076ddbb590d51c5865fDianne Hackborn
356a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op, int uid, String packageName) {
357a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
358a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.noteOperation(op, uid, packageName);
359a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
360a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
361a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
362a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
363a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
364a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
365a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
366a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
367a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
368a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOpNoThrow(int op, int uid, String packageName) {
369a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
370a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.noteOperation(op, uid, packageName);
371a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
372a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
373a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
374a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
375a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
376a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op) {
377d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return noteOp(op, Process.myUid(), mContext.getBasePackageName());
378a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
379a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
380a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op, int uid, String packageName) {
381a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
382a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.startOperation(op, uid, packageName);
383a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
384a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
385a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
386a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
387a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
388a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
389a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
390a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
391a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
392a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOpNoThrow(int op, int uid, String packageName) {
393a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
394a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.startOperation(op, uid, packageName);
395a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
396a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
397a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
398a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
399a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
400a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op) {
401d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        return startOp(op, Process.myUid(), mContext.getBasePackageName());
402a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
403a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
404a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op, int uid, String packageName) {
405a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
406a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mService.finishOperation(op, uid, packageName);
407a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
408a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
409a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
410a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
411a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op) {
412d8e1dbb6bc1fbaf4f2e38c3ba92ced94270deaacDianne Hackborn        finishOp(op, Process.myUid(), mContext.getBasePackageName());
413a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
414a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn}
415