blob: 50e23b50a7e45b161aab437a4021990dac4b2113 [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
Jooyung Han149be4a2020-01-23 12:45:10 +090025#include <optional>
26
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080027namespace android {
28
29// ----------------------------------------------------------------------
30
31class BpAppOpsService : public BpInterface<IAppOpsService>
32{
33public:
Chih-Hung Hsiehe2347b72016-04-25 15:41:05 -070034 explicit BpAppOpsService(const sp<IBinder>& impl)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080035 : BpInterface<IAppOpsService>(impl)
36 {
37 }
38
39 virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) {
40 Parcel data, reply;
41 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
42 data.writeInt32(code);
43 data.writeInt32(uid);
44 data.writeString16(packageName);
45 remote()->transact(CHECK_OPERATION_TRANSACTION, data, &reply);
46 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080047 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
48 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080049 }
50
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080051 virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName,
Jooyung Han149be4a2020-01-23 12:45:10 +090052 const std::optional<String16>& featureId, bool shouldCollectAsyncNotedOp,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080053 const String16& message) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080054 Parcel data, reply;
55 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
56 data.writeInt32(code);
57 data.writeInt32(uid);
58 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080059 data.writeString16(featureId);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080060 data.writeInt32(shouldCollectAsyncNotedOp ? 1 : 0);
61 data.writeString16(message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080062 remote()->transact(NOTE_OPERATION_TRANSACTION, data, &reply);
63 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080064 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
65 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080066 }
67
Dianne Hackborn913b63d2013-07-17 17:26:15 -070068 virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Jooyung Han149be4a2020-01-23 12:45:10 +090069 const String16& packageName, const std::optional<String16>& featureId,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080070 bool startIfModeDefault, bool shouldCollectAsyncNotedOp, const String16& message) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080071 Parcel data, reply;
72 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070073 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080074 data.writeInt32(code);
75 data.writeInt32(uid);
76 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080077 data.writeString16(featureId);
Svet Ganov616554c2018-02-26 13:27:26 -080078 data.writeInt32(startIfModeDefault ? 1 : 0);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -080079 data.writeInt32(shouldCollectAsyncNotedOp ? 1 : 0);
80 data.writeString16(message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080081 remote()->transact(START_OPERATION_TRANSACTION, data, &reply);
82 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080083 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
84 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080085 }
86
Dianne Hackborn913b63d2013-07-17 17:26:15 -070087 virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
Jooyung Han149be4a2020-01-23 12:45:10 +090088 const String16& packageName, const std::optional<String16>& featureId) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080089 Parcel data, reply;
90 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070091 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080092 data.writeInt32(code);
93 data.writeInt32(uid);
94 data.writeString16(packageName);
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -080095 data.writeString16(featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080096 remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply);
97 }
98
99 virtual void startWatchingMode(int32_t op, const String16& packageName,
100 const sp<IAppOpsCallback>& callback) {
101 Parcel data, reply;
102 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
103 data.writeInt32(op);
104 data.writeString16(packageName);
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800105 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800106 remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply);
107 }
108
109 virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) {
110 Parcel data, reply;
111 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800112 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800113 remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
114 }
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700115
Svetoslavb412f6e2015-04-29 16:50:41 -0700116 virtual int32_t permissionToOpCode(const String16& permission) {
117 Parcel data, reply;
118 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
119 data.writeString16(permission);
120 remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply);
121 // fail on exception
122 if (reply.readExceptionCode() != 0) return -1;
123 return reply.readInt32();
124 }
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800125
126 virtual int32_t checkAudioOperation(int32_t code, int32_t usage,
127 int32_t uid, const String16& packageName) {
128 Parcel data, reply;
129 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
130 data.writeInt32(code);
131 data.writeInt32(usage);
132 data.writeInt32(uid);
133 data.writeString16(packageName);
134 remote()->transact(CHECK_AUDIO_OPERATION_TRANSACTION, data, &reply);
135 // fail on exception
136 if (reply.readExceptionCode() != 0) {
137 return MODE_ERRORED;
138 }
139 return reply.readInt32();
140 }
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700141
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700142 virtual void setCameraAudioRestriction(int32_t mode) {
143 Parcel data, reply;
144 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
145 data.writeInt32(mode);
146 remote()->transact(SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION, data, &reply);
147 }
148
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700149 virtual bool shouldCollectNotes(int32_t opCode) {
150 Parcel data, reply;
151 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
152 data.writeInt32(opCode);
153 remote()->transact(SHOULD_COLLECT_NOTES_TRANSACTION, data, &reply);
154 // fail on exception
155 if (reply.readExceptionCode() != 0) {
156 return false;
157 }
158 return reply.readBool();
159 }
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800160};
161
162IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
163
164// ----------------------------------------------------------------------
165
Jiyong Parkb86c8662018-10-29 23:01:57 +0900166// NOLINTNEXTLINE(google-default-arguments)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800167status_t BnAppOpsService::onTransact(
168 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
169{
170 //printf("AppOpsService received: "); data.print();
171 switch(code) {
172 case CHECK_OPERATION_TRANSACTION: {
173 CHECK_INTERFACE(IAppOpsService, data, reply);
174 int32_t code = data.readInt32();
175 int32_t uid = data.readInt32();
176 String16 packageName = data.readString16();
177 int32_t res = checkOperation(code, uid, packageName);
178 reply->writeNoException();
179 reply->writeInt32(res);
180 return NO_ERROR;
181 } break;
182 case NOTE_OPERATION_TRANSACTION: {
183 CHECK_INTERFACE(IAppOpsService, data, reply);
184 int32_t code = data.readInt32();
185 int32_t uid = data.readInt32();
186 String16 packageName = data.readString16();
Jooyung Han149be4a2020-01-23 12:45:10 +0900187 std::optional<String16> featureId;
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800188 data.readString16(&featureId);
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800189 bool shouldCollectAsyncNotedOp = data.readInt32() == 1;
190 String16 message = data.readString16();
191 int32_t res = noteOperation(code, uid, packageName, featureId,
192 shouldCollectAsyncNotedOp, message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800193 reply->writeNoException();
194 reply->writeInt32(res);
195 return NO_ERROR;
196 } break;
197 case START_OPERATION_TRANSACTION: {
198 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700199 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800200 int32_t code = data.readInt32();
201 int32_t uid = data.readInt32();
202 String16 packageName = data.readString16();
Jooyung Han149be4a2020-01-23 12:45:10 +0900203 std::optional<String16> featureId;
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800204 data.readString16(&featureId);
Svet Ganov616554c2018-02-26 13:27:26 -0800205 bool startIfModeDefault = data.readInt32() == 1;
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800206 bool shouldCollectAsyncNotedOp = data.readInt32() == 1;
207 String16 message = data.readString16();
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800208 int32_t res = startOperation(token, code, uid, packageName, featureId,
Philip P. Moltmann3879cf62019-12-20 11:22:37 -0800209 startIfModeDefault, shouldCollectAsyncNotedOp, message);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800210 reply->writeNoException();
211 reply->writeInt32(res);
212 return NO_ERROR;
213 } break;
214 case FINISH_OPERATION_TRANSACTION: {
215 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700216 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800217 int32_t code = data.readInt32();
218 int32_t uid = data.readInt32();
219 String16 packageName = data.readString16();
Jooyung Han149be4a2020-01-23 12:45:10 +0900220 std::optional<String16> featureId;
Philip P. Moltmannaeaaf1c2019-11-05 12:34:36 -0800221 data.readString16(&featureId);
222 finishOperation(token, code, uid, packageName, featureId);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800223 reply->writeNoException();
224 return NO_ERROR;
225 } break;
226 case START_WATCHING_MODE_TRANSACTION: {
227 CHECK_INTERFACE(IAppOpsService, data, reply);
228 int32_t op = data.readInt32();
229 String16 packageName = data.readString16();
230 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
231 startWatchingMode(op, packageName, callback);
232 reply->writeNoException();
233 return NO_ERROR;
234 } break;
235 case STOP_WATCHING_MODE_TRANSACTION: {
236 CHECK_INTERFACE(IAppOpsService, data, reply);
237 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
238 stopWatchingMode(callback);
239 reply->writeNoException();
240 return NO_ERROR;
241 } break;
Svetoslavb412f6e2015-04-29 16:50:41 -0700242 case PERMISSION_TO_OP_CODE_TRANSACTION: {
243 CHECK_INTERFACE(IAppOpsService, data, reply);
244 String16 permission = data.readString16();
245 const int32_t opCode = permissionToOpCode(permission);
246 reply->writeNoException();
247 reply->writeInt32(opCode);
248 return NO_ERROR;
249 } break;
Jean-Michel Trivi94a566d2019-02-25 12:16:02 -0800250 case CHECK_AUDIO_OPERATION_TRANSACTION: {
251 CHECK_INTERFACE(IAppOpsService, data, reply);
252 const int32_t code = data.readInt32();
253 const int32_t usage = data.readInt32();
254 const int32_t uid = data.readInt32();
255 const String16 packageName = data.readString16();
256 const int32_t res = checkAudioOperation(code, usage, uid, packageName);
257 reply->writeNoException();
258 reply->writeInt32(res);
259 return NO_ERROR;
260 } break;
Yin-Chia Yeh8e95ee82019-08-13 12:24:25 -0700261 case SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION: {
262 CHECK_INTERFACE(IAppOpsService, data, reply);
263 const int32_t mode = data.readInt32();
264 setCameraAudioRestriction(mode);
265 reply->writeNoException();
266 return NO_ERROR;
267 } break;
Philip P. Moltmann66a87772019-06-24 16:30:00 -0700268 case SHOULD_COLLECT_NOTES_TRANSACTION: {
269 CHECK_INTERFACE(IAppOpsService, data, reply);
270 int32_t opCode = data.readInt32();
271 bool shouldCollect = shouldCollectNotes(opCode);
272 reply->writeNoException();
273 reply->writeBool(shouldCollect);
274 return NO_ERROR;
275 } break;
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800276 default:
277 return BBinder::onTransact(code, data, reply, flags);
278 }
279}
280
Steven Moreland6511af52019-09-26 16:05:45 -0700281} // namespace android