blob: 7384466b55f3534c77ce1dc8013f4f7edbb8a356 [file] [log] [blame]
Dianne Hackborn5da5ca52013-02-12 15:12:21 -08001/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "AppOpsService"
18
19#include <binder/IAppOpsService.h>
20
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080021#include <utils/Log.h>
22#include <binder/Parcel.h>
23#include <utils/String8.h>
24
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080025namespace android {
26
27// ----------------------------------------------------------------------
28
29class BpAppOpsService : public BpInterface<IAppOpsService>
30{
31public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070032 explicit BpAppOpsService(const sp<IBinder>& impl)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080033 : BpInterface<IAppOpsService>(impl)
34 {
35 }
36
37 virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) {
38 Parcel data, reply;
39 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
40 data.writeInt32(code);
41 data.writeInt32(uid);
42 data.writeString16(packageName);
43 remote()->transact(CHECK_OPERATION_TRANSACTION, data, &reply);
44 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080045 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
46 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080047 }
48
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080049 virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName,
50 const std::unique_ptr<String16>& featureId) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080051 Parcel data, reply;
52 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
53 data.writeInt32(code);
54 data.writeInt32(uid);
55 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080056 data.writeString16(featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080057 remote()->transact(NOTE_OPERATION_TRANSACTION, data, &reply);
58 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080059 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
60 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080061 }
62
Dianne Hackborn913b63d2013-07-17 17:26:15 -070063 virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080064 const String16& packageName, const std::unique_ptr<String16>& featureId,
65 bool startIfModeDefault) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080066 Parcel data, reply;
67 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070068 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080069 data.writeInt32(code);
70 data.writeInt32(uid);
71 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080072 data.writeString16(featureId);
Svet Ganov616554c2018-02-26 13:27:26 -080073 data.writeInt32(startIfModeDefault ? 1 : 0);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080074 remote()->transact(START_OPERATION_TRANSACTION, data, &reply);
75 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080076 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
77 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080078 }
79
Dianne Hackborn913b63d2013-07-17 17:26:15 -070080 virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080081 const String16& packageName, const std::unique_ptr<String16>& featureId) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080082 Parcel data, reply;
83 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070084 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080085 data.writeInt32(code);
86 data.writeInt32(uid);
87 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080088 data.writeString16(featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080089 remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply);
90 }
91
92 virtual void startWatchingMode(int32_t op, const String16& packageName,
93 const sp<IAppOpsCallback>& callback) {
94 Parcel data, reply;
95 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
96 data.writeInt32(op);
97 data.writeString16(packageName);
Marco Nelissen2ea926b2014-11-14 08:01:01 -080098 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080099 remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply);
100 }
101
102 virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) {
103 Parcel data, reply;
104 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800105 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800106 remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
107 }
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700108
Svetoslavb412f6e2015-04-29 16:50:41 -0700109 virtual int32_t permissionToOpCode(const String16& permission) {
110 Parcel data, reply;
111 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
112 data.writeString16(permission);
113 remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply);
114 // fail on exception
115 if (reply.readExceptionCode() != 0) return -1;
116 return reply.readInt32();
117 }
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800118
119 virtual int32_t checkAudioOperation(int32_t code, int32_t usage,
120 int32_t uid, const String16& packageName) {
121 Parcel data, reply;
122 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
123 data.writeInt32(code);
124 data.writeInt32(usage);
125 data.writeInt32(uid);
126 data.writeString16(packageName);
127 remote()->transact(CHECK_AUDIO_OPERATION_TRANSACTION, data, &reply);
128 // fail on exception
129 if (reply.readExceptionCode() != 0) {
130 return MODE_ERRORED;
131 }
132 return reply.readInt32();
133 }
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700134
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700135 virtual void setCameraAudioRestriction(int32_t mode) {
136 Parcel data, reply;
137 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
138 data.writeInt32(mode);
139 remote()->transact(SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION, data, &reply);
140 }
141
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800142 virtual void noteAsyncOp(const std::unique_ptr<String16>& callingPackageName, int32_t uid,
143 const String16& packageName, int32_t opCode, const std::unique_ptr<String16>& featureId,
Philip P. Moltmannb1301882019-09-06 11:01:18 -0700144 const String16& message) {
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700145 Parcel data, reply;
146 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800147 data.writeString16(callingPackageName);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700148 data.writeInt32(uid);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800149 data.writeString16(packageName);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700150 data.writeInt32(opCode);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800151 data.writeString16(featureId);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700152 data.writeString16(message);
153 remote()->transact(NOTE_ASYNC_OP_TRANSACTION, data, &reply);
154 }
155
156 virtual bool shouldCollectNotes(int32_t opCode) {
157 Parcel data, reply;
158 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
159 data.writeInt32(opCode);
160 remote()->transact(SHOULD_COLLECT_NOTES_TRANSACTION, data, &reply);
161 // fail on exception
162 if (reply.readExceptionCode() != 0) {
163 return false;
164 }
165 return reply.readBool();
166 }
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800167};
168
169IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
170
171// ----------------------------------------------------------------------
172
Jiyong Parkb86c8662018-10-29 23:01:57 +0900173// NOLINTNEXTLINE(google-default-arguments)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800174status_t BnAppOpsService::onTransact(
175 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
176{
177 //printf("AppOpsService received: "); data.print();
178 switch(code) {
179 case CHECK_OPERATION_TRANSACTION: {
180 CHECK_INTERFACE(IAppOpsService, data, reply);
181 int32_t code = data.readInt32();
182 int32_t uid = data.readInt32();
183 String16 packageName = data.readString16();
184 int32_t res = checkOperation(code, uid, packageName);
185 reply->writeNoException();
186 reply->writeInt32(res);
187 return NO_ERROR;
188 } break;
189 case NOTE_OPERATION_TRANSACTION: {
190 CHECK_INTERFACE(IAppOpsService, data, reply);
191 int32_t code = data.readInt32();
192 int32_t uid = data.readInt32();
193 String16 packageName = data.readString16();
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800194 std::unique_ptr<String16> featureId;
195 data.readString16(&featureId);
196 int32_t res = noteOperation(code, uid, packageName, featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800197 reply->writeNoException();
198 reply->writeInt32(res);
199 return NO_ERROR;
200 } break;
201 case START_OPERATION_TRANSACTION: {
202 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700203 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800204 int32_t code = data.readInt32();
205 int32_t uid = data.readInt32();
206 String16 packageName = data.readString16();
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800207 std::unique_ptr<String16> featureId;
208 data.readString16(&featureId);
Svet Ganov616554c2018-02-26 13:27:26 -0800209 bool startIfModeDefault = data.readInt32() == 1;
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800210 int32_t res = startOperation(token, code, uid, packageName, featureId,
211 startIfModeDefault);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800212 reply->writeNoException();
213 reply->writeInt32(res);
214 return NO_ERROR;
215 } break;
216 case FINISH_OPERATION_TRANSACTION: {
217 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700218 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800219 int32_t code = data.readInt32();
220 int32_t uid = data.readInt32();
221 String16 packageName = data.readString16();
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800222 std::unique_ptr<String16> featureId;
223 data.readString16(&featureId);
224 finishOperation(token, code, uid, packageName, featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800225 reply->writeNoException();
226 return NO_ERROR;
227 } break;
228 case START_WATCHING_MODE_TRANSACTION: {
229 CHECK_INTERFACE(IAppOpsService, data, reply);
230 int32_t op = data.readInt32();
231 String16 packageName = data.readString16();
232 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
233 startWatchingMode(op, packageName, callback);
234 reply->writeNoException();
235 return NO_ERROR;
236 } break;
237 case STOP_WATCHING_MODE_TRANSACTION: {
238 CHECK_INTERFACE(IAppOpsService, data, reply);
239 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
240 stopWatchingMode(callback);
241 reply->writeNoException();
242 return NO_ERROR;
243 } break;
Svetoslavb412f6e2015-04-29 16:50:41 -0700244 case PERMISSION_TO_OP_CODE_TRANSACTION: {
245 CHECK_INTERFACE(IAppOpsService, data, reply);
246 String16 permission = data.readString16();
247 const int32_t opCode = permissionToOpCode(permission);
248 reply->writeNoException();
249 reply->writeInt32(opCode);
250 return NO_ERROR;
251 } break;
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800252 case CHECK_AUDIO_OPERATION_TRANSACTION: {
253 CHECK_INTERFACE(IAppOpsService, data, reply);
254 const int32_t code = data.readInt32();
255 const int32_t usage = data.readInt32();
256 const int32_t uid = data.readInt32();
257 const String16 packageName = data.readString16();
258 const int32_t res = checkAudioOperation(code, usage, uid, packageName);
259 reply->writeNoException();
260 reply->writeInt32(res);
261 return NO_ERROR;
262 } break;
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700263 case SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION: {
264 CHECK_INTERFACE(IAppOpsService, data, reply);
265 const int32_t mode = data.readInt32();
266 setCameraAudioRestriction(mode);
267 reply->writeNoException();
268 return NO_ERROR;
269 } break;
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700270 case NOTE_ASYNC_OP_TRANSACTION: {
271 CHECK_INTERFACE(IAppOpsService, data, reply);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800272 std::unique_ptr<String16> callingPackageName;
273 data.readString16(&callingPackageName);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700274 int32_t uid = data.readInt32();
275 String16 packageName = data.readString16();
276 int32_t opCode = data.readInt32();
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800277 std::unique_ptr<String16> featureId;
278 data.readString16(&featureId);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700279 String16 message = data.readString16();
Philip P. Moltmannb1301882019-09-06 11:01:18 -0700280 noteAsyncOp(callingPackageName, uid, packageName, opCode, featureId, message);
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700281 reply->writeNoException();
282 return NO_ERROR;
283 } break;
284 case SHOULD_COLLECT_NOTES_TRANSACTION: {
285 CHECK_INTERFACE(IAppOpsService, data, reply);
286 int32_t opCode = data.readInt32();
287 bool shouldCollect = shouldCollectNotes(opCode);
288 reply->writeNoException();
289 reply->writeBool(shouldCollect);
290 return NO_ERROR;
291 } break;
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800292 default:
293 return BBinder::onTransact(code, data, reply, flags);
294 }
295}
296
Steven Moreland6511af52019-09-26 16:05:45 -0700297} // namespace android