AppOpsManager.java revision a06de0f29b58df9246779cc4bfd8f06f7205ddb6
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
19a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport com.android.internal.app.IAppOpsService;
20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
21a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context;
22a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.Process;
23a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.os.RemoteException;
24a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
25a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn/** @hide */
26a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornpublic class AppOpsManager {
27a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final Context mContext;
28a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    final IAppOpsService mService;
29a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
30a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ALLOWED = 0;
31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_IGNORED = 1;
32a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int MODE_ERRORED = 2;
33a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
34a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int OP_LOCATION = 0;
35a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int OP_GPS = 1;
36a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static final int OP_VIBRATE = 2;
37a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
38a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public static String opToString(int op) {
39a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        switch (op) {
40a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            case OP_LOCATION: return "LOCATION";
41a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            case OP_GPS: return "GPS";
42a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            case OP_VIBRATE: return "VIBRATE";
43a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            default: return "Unknown(" + op + ")";
44a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
45a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
46a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
47a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public AppOpsManager(Context context, IAppOpsService service) {
48a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mContext = context;
49a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        mService = service;
50a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
51a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
52a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op, int uid, String packageName) {
53a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
54a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.noteOperation(op, uid, packageName);
55a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
56a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
57a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
58a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
59a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
60a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
61a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
62a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
63a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
64a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOpNoThrow(int op, int uid, String packageName) {
65a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
66a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.noteOperation(op, uid, packageName);
67a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
68a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
69a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
70a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
71a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
72a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int noteOp(int op) {
73a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return noteOp(op, Process.myUid(), mContext.getPackageName());
74a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
75a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
76a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op, int uid, String packageName) {
77a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
78a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            int mode = mService.startOperation(op, uid, packageName);
79a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            if (mode == MODE_ERRORED) {
80a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn                throw new SecurityException("Operation not allowed");
81a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            }
82a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mode;
83a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
84a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
85a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
86a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
87a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
88a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOpNoThrow(int op, int uid, String packageName) {
89a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
90a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            return mService.startOperation(op, uid, packageName);
91a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
92a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
93a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return MODE_IGNORED;
94a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
95a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
96a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public int startOp(int op) {
97a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        return startOp(op, Process.myUid(), mContext.getPackageName());
98a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
99a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
100a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op, int uid, String packageName) {
101a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        try {
102a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn            mService.finishOperation(op, uid, packageName);
103a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        } catch (RemoteException e) {
104a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        }
105a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
106a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn
107a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    public void finishOp(int op) {
108a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn        finishOp(op, Process.myUid(), mContext.getPackageName());
109a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn    }
110a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn}
111