blob: 0714723e025911fb807b57f9531f35f1cd60e067 [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,
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080050 const std::unique_ptr<String16>& attributionTag, bool shouldCollectAsyncNotedOp,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080051 const String16& message) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080052 Parcel data, reply;
53 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
54 data.writeInt32(code);
55 data.writeInt32(uid);
56 data.writeString16(packageName);
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080057 data.writeString16(attributionTag);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080058 data.writeInt32(shouldCollectAsyncNotedOp ? 1 : 0);
59 data.writeString16(message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080060 remote()->transact(NOTE_OPERATION_TRANSACTION, data, &reply);
61 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080062 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
63 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080064 }
65
Dianne Hackborn913b63d2013-07-17 17:26:15 -070066 virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080067 const String16& packageName, const std::unique_ptr<String16>& attributionTag,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080068 bool startIfModeDefault, bool shouldCollectAsyncNotedOp, const String16& message) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080069 Parcel data, reply;
70 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070071 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080072 data.writeInt32(code);
73 data.writeInt32(uid);
74 data.writeString16(packageName);
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080075 data.writeString16(attributionTag);
Svet Ganov616554c2018-02-26 13:27:26 -080076 data.writeInt32(startIfModeDefault ? 1 : 0);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080077 data.writeInt32(shouldCollectAsyncNotedOp ? 1 : 0);
78 data.writeString16(message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080079 remote()->transact(START_OPERATION_TRANSACTION, data, &reply);
80 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080081 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
82 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080083 }
84
Dianne Hackborn913b63d2013-07-17 17:26:15 -070085 virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080086 const String16& packageName, const std::unique_ptr<String16>& attributionTag) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080087 Parcel data, reply;
88 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070089 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080090 data.writeInt32(code);
91 data.writeInt32(uid);
92 data.writeString16(packageName);
Philip P. Moltmann73d9f782020-03-05 15:06:19 -080093 data.writeString16(attributionTag);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080094 remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply);
95 }
96
97 virtual void startWatchingMode(int32_t op, const String16& packageName,
98 const sp<IAppOpsCallback>& callback) {
99 Parcel data, reply;
100 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
101 data.writeInt32(op);
102 data.writeString16(packageName);
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800103 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800104 remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply);
105 }
106
107 virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) {
108 Parcel data, reply;
109 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800110 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800111 remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
112 }
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700113
Svetoslavb412f6e2015-04-29 16:50:41 -0700114 virtual int32_t permissionToOpCode(const String16& permission) {
115 Parcel data, reply;
116 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
117 data.writeString16(permission);
118 remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply);
119 // fail on exception
120 if (reply.readExceptionCode() != 0) return -1;
121 return reply.readInt32();
122 }
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800123
124 virtual int32_t checkAudioOperation(int32_t code, int32_t usage,
125 int32_t uid, const String16& packageName) {
126 Parcel data, reply;
127 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
128 data.writeInt32(code);
129 data.writeInt32(usage);
130 data.writeInt32(uid);
131 data.writeString16(packageName);
132 remote()->transact(CHECK_AUDIO_OPERATION_TRANSACTION, data, &reply);
133 // fail on exception
134 if (reply.readExceptionCode() != 0) {
135 return MODE_ERRORED;
136 }
137 return reply.readInt32();
138 }
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700139
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700140 virtual void setCameraAudioRestriction(int32_t mode) {
141 Parcel data, reply;
142 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
143 data.writeInt32(mode);
144 remote()->transact(SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION, data, &reply);
145 }
146
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700147 virtual bool shouldCollectNotes(int32_t opCode) {
148 Parcel data, reply;
149 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
150 data.writeInt32(opCode);
151 remote()->transact(SHOULD_COLLECT_NOTES_TRANSACTION, data, &reply);
152 // fail on exception
153 if (reply.readExceptionCode() != 0) {
154 return false;
155 }
156 return reply.readBool();
157 }
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800158};
159
160IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
161
162// ----------------------------------------------------------------------
163
Jiyong Parkb86c8662018-10-29 23:01:57 +0900164// NOLINTNEXTLINE(google-default-arguments)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800165status_t BnAppOpsService::onTransact(
166 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
167{
168 //printf("AppOpsService received: "); data.print();
169 switch(code) {
170 case CHECK_OPERATION_TRANSACTION: {
171 CHECK_INTERFACE(IAppOpsService, data, reply);
172 int32_t code = data.readInt32();
173 int32_t uid = data.readInt32();
174 String16 packageName = data.readString16();
175 int32_t res = checkOperation(code, uid, packageName);
176 reply->writeNoException();
177 reply->writeInt32(res);
178 return NO_ERROR;
179 } break;
180 case NOTE_OPERATION_TRANSACTION: {
181 CHECK_INTERFACE(IAppOpsService, data, reply);
182 int32_t code = data.readInt32();
183 int32_t uid = data.readInt32();
184 String16 packageName = data.readString16();
Philip P. Moltmann73d9f782020-03-05 15:06:19 -0800185 std::unique_ptr<String16> attributionTag;
186 data.readString16(&attributionTag);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800187 bool shouldCollectAsyncNotedOp = data.readInt32() == 1;
188 String16 message = data.readString16();
Philip P. Moltmann73d9f782020-03-05 15:06:19 -0800189 int32_t res = noteOperation(code, uid, packageName, attributionTag,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800190 shouldCollectAsyncNotedOp, message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800191 reply->writeNoException();
192 reply->writeInt32(res);
193 return NO_ERROR;
194 } break;
195 case START_OPERATION_TRANSACTION: {
196 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700197 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800198 int32_t code = data.readInt32();
199 int32_t uid = data.readInt32();
200 String16 packageName = data.readString16();
Philip P. Moltmann73d9f782020-03-05 15:06:19 -0800201 std::unique_ptr<String16> attributionTag;
202 data.readString16(&attributionTag);
Svet Ganov616554c2018-02-26 13:27:26 -0800203 bool startIfModeDefault = data.readInt32() == 1;
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800204 bool shouldCollectAsyncNotedOp = data.readInt32() == 1;
205 String16 message = data.readString16();
Philip P. Moltmann73d9f782020-03-05 15:06:19 -0800206 int32_t res = startOperation(token, code, uid, packageName, attributionTag,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800207 startIfModeDefault, shouldCollectAsyncNotedOp, message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800208 reply->writeNoException();
209 reply->writeInt32(res);
210 return NO_ERROR;
211 } break;
212 case FINISH_OPERATION_TRANSACTION: {
213 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700214 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800215 int32_t code = data.readInt32();
216 int32_t uid = data.readInt32();
217 String16 packageName = data.readString16();
Philip P. Moltmann73d9f782020-03-05 15:06:19 -0800218 std::unique_ptr<String16> attributionTag;
219 data.readString16(&attributionTag);
220 finishOperation(token, code, uid, packageName, attributionTag);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800221 reply->writeNoException();
222 return NO_ERROR;
223 } break;
224 case START_WATCHING_MODE_TRANSACTION: {
225 CHECK_INTERFACE(IAppOpsService, data, reply);
226 int32_t op = data.readInt32();
227 String16 packageName = data.readString16();
228 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
229 startWatchingMode(op, packageName, callback);
230 reply->writeNoException();
231 return NO_ERROR;
232 } break;
233 case STOP_WATCHING_MODE_TRANSACTION: {
234 CHECK_INTERFACE(IAppOpsService, data, reply);
235 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
236 stopWatchingMode(callback);
237 reply->writeNoException();
238 return NO_ERROR;
239 } break;
Svetoslavb412f6e2015-04-29 16:50:41 -0700240 case PERMISSION_TO_OP_CODE_TRANSACTION: {
241 CHECK_INTERFACE(IAppOpsService, data, reply);
242 String16 permission = data.readString16();
243 const int32_t opCode = permissionToOpCode(permission);
244 reply->writeNoException();
245 reply->writeInt32(opCode);
246 return NO_ERROR;
247 } break;
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800248 case CHECK_AUDIO_OPERATION_TRANSACTION: {
249 CHECK_INTERFACE(IAppOpsService, data, reply);
250 const int32_t code = data.readInt32();
251 const int32_t usage = data.readInt32();
252 const int32_t uid = data.readInt32();
253 const String16 packageName = data.readString16();
254 const int32_t res = checkAudioOperation(code, usage, uid, packageName);
255 reply->writeNoException();
256 reply->writeInt32(res);
257 return NO_ERROR;
258 } break;
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700259 case SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION: {
260 CHECK_INTERFACE(IAppOpsService, data, reply);
261 const int32_t mode = data.readInt32();
262 setCameraAudioRestriction(mode);
263 reply->writeNoException();
264 return NO_ERROR;
265 } break;
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700266 case SHOULD_COLLECT_NOTES_TRANSACTION: {
267 CHECK_INTERFACE(IAppOpsService, data, reply);
268 int32_t opCode = data.readInt32();
269 bool shouldCollect = shouldCollectNotes(opCode);
270 reply->writeNoException();
271 reply->writeBool(shouldCollect);
272 return NO_ERROR;
273 } break;
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800274 default:
275 return BBinder::onTransact(code, data, reply, flags);
276 }
277}
278
Steven Moreland6511af52019-09-26 16:05:45 -0700279} // namespace android