xref: /aosp_15_r20/frameworks/native/libs/permission/IAppOpsService.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2013 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "AppOpsService"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <binder/IAppOpsService.h>
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <utils/Log.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <utils/String8.h>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include <optional>
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker namespace android {
28*38e8c45fSAndroid Build Coastguard Worker 
29*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker class BpAppOpsService : public BpInterface<IAppOpsService>
32*38e8c45fSAndroid Build Coastguard Worker {
33*38e8c45fSAndroid Build Coastguard Worker public:
BpAppOpsService(const sp<IBinder> & impl)34*38e8c45fSAndroid Build Coastguard Worker     explicit BpAppOpsService(const sp<IBinder>& impl)
35*38e8c45fSAndroid Build Coastguard Worker         : BpInterface<IAppOpsService>(impl)
36*38e8c45fSAndroid Build Coastguard Worker     {
37*38e8c45fSAndroid Build Coastguard Worker     }
38*38e8c45fSAndroid Build Coastguard Worker 
checkOperation(int32_t code,int32_t uid,const String16 & packageName)39*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) {
40*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
41*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
42*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(code);
43*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
44*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
45*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(CHECK_OPERATION_TRANSACTION, data, &reply);
46*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
47*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) return MODE_ERRORED;
48*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
49*38e8c45fSAndroid Build Coastguard Worker     }
50*38e8c45fSAndroid Build Coastguard Worker 
noteOperation(int32_t code,int32_t uid,const String16 & packageName,const std::optional<String16> & attributionTag,bool shouldCollectAsyncNotedOp,const String16 & message,bool shouldCollectMessage)51*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName,
52*38e8c45fSAndroid Build Coastguard Worker                 const std::optional<String16>& attributionTag, bool shouldCollectAsyncNotedOp,
53*38e8c45fSAndroid Build Coastguard Worker                 const String16& message, bool shouldCollectMessage) {
54*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
55*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
56*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(code);
57*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
58*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
59*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(attributionTag);
60*38e8c45fSAndroid Build Coastguard Worker         data.writeBool(shouldCollectAsyncNotedOp);
61*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(message);
62*38e8c45fSAndroid Build Coastguard Worker         data.writeBool(shouldCollectMessage);
63*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(NOTE_OPERATION_TRANSACTION, data, &reply);
64*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
65*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) return MODE_ERRORED;
66*38e8c45fSAndroid Build Coastguard Worker         // TODO b/184855056: extract to class
67*38e8c45fSAndroid Build Coastguard Worker         reply.readInt32();
68*38e8c45fSAndroid Build Coastguard Worker         reply.readByte();
69*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
70*38e8c45fSAndroid Build Coastguard Worker     }
71*38e8c45fSAndroid Build Coastguard Worker 
startOperation(const sp<IBinder> & token,int32_t code,int32_t uid,const String16 & packageName,const std::optional<String16> & attributionTag,bool startIfModeDefault,bool shouldCollectAsyncNotedOp,const String16 & message,bool shouldCollectMessage)72*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
73*38e8c45fSAndroid Build Coastguard Worker                 const String16& packageName, const std::optional<String16>& attributionTag,
74*38e8c45fSAndroid Build Coastguard Worker                 bool startIfModeDefault, bool shouldCollectAsyncNotedOp, const String16& message,
75*38e8c45fSAndroid Build Coastguard Worker                 bool shouldCollectMessage) {
76*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
77*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
78*38e8c45fSAndroid Build Coastguard Worker         data.writeStrongBinder(token);
79*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(code);
80*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
81*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
82*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(attributionTag);
83*38e8c45fSAndroid Build Coastguard Worker         data.writeBool(startIfModeDefault);
84*38e8c45fSAndroid Build Coastguard Worker         data.writeBool(shouldCollectAsyncNotedOp);
85*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(message);
86*38e8c45fSAndroid Build Coastguard Worker         data.writeBool(shouldCollectMessage);
87*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(START_OPERATION_TRANSACTION, data, &reply);
88*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
89*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) return MODE_ERRORED;
90*38e8c45fSAndroid Build Coastguard Worker         // TODO b/184855056: extract to class
91*38e8c45fSAndroid Build Coastguard Worker         reply.readInt32();
92*38e8c45fSAndroid Build Coastguard Worker         reply.readByte();
93*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
94*38e8c45fSAndroid Build Coastguard Worker     }
95*38e8c45fSAndroid Build Coastguard Worker 
finishOperation(const sp<IBinder> & token,int32_t code,int32_t uid,const String16 & packageName,const std::optional<String16> & attributionTag)96*38e8c45fSAndroid Build Coastguard Worker     virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
97*38e8c45fSAndroid Build Coastguard Worker             const String16& packageName, const std::optional<String16>& attributionTag) {
98*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
99*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
100*38e8c45fSAndroid Build Coastguard Worker         data.writeStrongBinder(token);
101*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(code);
102*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
103*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
104*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(attributionTag);
105*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply);
106*38e8c45fSAndroid Build Coastguard Worker     }
107*38e8c45fSAndroid Build Coastguard Worker 
startWatchingMode(int32_t op,const String16 & packageName,const sp<IAppOpsCallback> & callback)108*38e8c45fSAndroid Build Coastguard Worker     virtual void startWatchingMode(int32_t op, const String16& packageName,
109*38e8c45fSAndroid Build Coastguard Worker             const sp<IAppOpsCallback>& callback) {
110*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
111*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
112*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(op);
113*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
114*38e8c45fSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(callback));
115*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply);
116*38e8c45fSAndroid Build Coastguard Worker     }
117*38e8c45fSAndroid Build Coastguard Worker 
stopWatchingMode(const sp<IAppOpsCallback> & callback)118*38e8c45fSAndroid Build Coastguard Worker     virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) {
119*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
120*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
121*38e8c45fSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(callback));
122*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
123*38e8c45fSAndroid Build Coastguard Worker     }
124*38e8c45fSAndroid Build Coastguard Worker 
permissionToOpCode(const String16 & permission)125*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t permissionToOpCode(const String16& permission) {
126*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
127*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
128*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(permission);
129*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply);
130*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
131*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) return -1;
132*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
133*38e8c45fSAndroid Build Coastguard Worker     }
134*38e8c45fSAndroid Build Coastguard Worker 
checkAudioOperation(int32_t code,int32_t usage,int32_t uid,const String16 & packageName)135*38e8c45fSAndroid Build Coastguard Worker     virtual int32_t checkAudioOperation(int32_t code, int32_t usage,
136*38e8c45fSAndroid Build Coastguard Worker             int32_t uid, const String16& packageName) {
137*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
138*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
139*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(code);
140*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(usage);
141*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(uid);
142*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
143*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(CHECK_AUDIO_OPERATION_TRANSACTION, data, &reply);
144*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
145*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) {
146*38e8c45fSAndroid Build Coastguard Worker             return MODE_ERRORED;
147*38e8c45fSAndroid Build Coastguard Worker         }
148*38e8c45fSAndroid Build Coastguard Worker         return reply.readInt32();
149*38e8c45fSAndroid Build Coastguard Worker     }
150*38e8c45fSAndroid Build Coastguard Worker 
setCameraAudioRestriction(int32_t mode)151*38e8c45fSAndroid Build Coastguard Worker     virtual void setCameraAudioRestriction(int32_t mode) {
152*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
153*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
154*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(mode);
155*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION, data, &reply);
156*38e8c45fSAndroid Build Coastguard Worker     }
157*38e8c45fSAndroid Build Coastguard Worker 
shouldCollectNotes(int32_t opCode)158*38e8c45fSAndroid Build Coastguard Worker     virtual bool shouldCollectNotes(int32_t opCode) {
159*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
160*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
161*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(opCode);
162*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(SHOULD_COLLECT_NOTES_TRANSACTION, data, &reply);
163*38e8c45fSAndroid Build Coastguard Worker         // fail on exception
164*38e8c45fSAndroid Build Coastguard Worker         if (reply.readExceptionCode() != 0) {
165*38e8c45fSAndroid Build Coastguard Worker             return false;
166*38e8c45fSAndroid Build Coastguard Worker         }
167*38e8c45fSAndroid Build Coastguard Worker         return reply.readBool();
168*38e8c45fSAndroid Build Coastguard Worker     }
169*38e8c45fSAndroid Build Coastguard Worker 
startWatchingModeWithFlags(int32_t op,const String16 & packageName,int32_t flags,const sp<IAppOpsCallback> & callback)170*38e8c45fSAndroid Build Coastguard Worker     virtual void startWatchingModeWithFlags(int32_t op, const String16& packageName,
171*38e8c45fSAndroid Build Coastguard Worker         int32_t flags, const sp<IAppOpsCallback>& callback) {
172*38e8c45fSAndroid Build Coastguard Worker         Parcel data, reply;
173*38e8c45fSAndroid Build Coastguard Worker         data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
174*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(op);
175*38e8c45fSAndroid Build Coastguard Worker         data.writeString16(packageName);
176*38e8c45fSAndroid Build Coastguard Worker         data.writeInt32(flags);
177*38e8c45fSAndroid Build Coastguard Worker         data.writeStrongBinder(IInterface::asBinder(callback));
178*38e8c45fSAndroid Build Coastguard Worker         remote()->transact(START_WATCHING_MODE_WITH_FLAGS_TRANSACTION, data, &reply);
179*38e8c45fSAndroid Build Coastguard Worker     }
180*38e8c45fSAndroid Build Coastguard Worker };
181*38e8c45fSAndroid Build Coastguard Worker 
182*38e8c45fSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService")
183*38e8c45fSAndroid Build Coastguard Worker 
184*38e8c45fSAndroid Build Coastguard Worker // ----------------------------------------------------------------------
185*38e8c45fSAndroid Build Coastguard Worker 
186*38e8c45fSAndroid Build Coastguard Worker // NOLINTNEXTLINE(google-default-arguments)
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)187*38e8c45fSAndroid Build Coastguard Worker status_t BnAppOpsService::onTransact(
188*38e8c45fSAndroid Build Coastguard Worker     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
189*38e8c45fSAndroid Build Coastguard Worker {
190*38e8c45fSAndroid Build Coastguard Worker     //printf("AppOpsService received: "); data.print();
191*38e8c45fSAndroid Build Coastguard Worker     switch(code) {
192*38e8c45fSAndroid Build Coastguard Worker         case CHECK_OPERATION_TRANSACTION: {
193*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
194*38e8c45fSAndroid Build Coastguard Worker             int32_t code = data.readInt32();
195*38e8c45fSAndroid Build Coastguard Worker             int32_t uid = data.readInt32();
196*38e8c45fSAndroid Build Coastguard Worker             String16 packageName = data.readString16();
197*38e8c45fSAndroid Build Coastguard Worker             int32_t res = checkOperation(code, uid, packageName);
198*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
199*38e8c45fSAndroid Build Coastguard Worker             reply->writeInt32(res);
200*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
201*38e8c45fSAndroid Build Coastguard Worker         } break;
202*38e8c45fSAndroid Build Coastguard Worker         case NOTE_OPERATION_TRANSACTION: {
203*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
204*38e8c45fSAndroid Build Coastguard Worker             int32_t code = data.readInt32();
205*38e8c45fSAndroid Build Coastguard Worker             int32_t uid = data.readInt32();
206*38e8c45fSAndroid Build Coastguard Worker             String16 packageName = data.readString16();
207*38e8c45fSAndroid Build Coastguard Worker             std::optional<String16> attributionTag;
208*38e8c45fSAndroid Build Coastguard Worker             data.readString16(&attributionTag);
209*38e8c45fSAndroid Build Coastguard Worker             bool shouldCollectAsyncNotedOp = data.readBool();
210*38e8c45fSAndroid Build Coastguard Worker             String16 message = data.readString16();
211*38e8c45fSAndroid Build Coastguard Worker             bool shouldCollectMessage = data.readBool();
212*38e8c45fSAndroid Build Coastguard Worker             int32_t res = noteOperation(code, uid, packageName, attributionTag,
213*38e8c45fSAndroid Build Coastguard Worker                     shouldCollectAsyncNotedOp, message, shouldCollectMessage);
214*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
215*38e8c45fSAndroid Build Coastguard Worker             reply->writeInt32(res);
216*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
217*38e8c45fSAndroid Build Coastguard Worker         } break;
218*38e8c45fSAndroid Build Coastguard Worker         case START_OPERATION_TRANSACTION: {
219*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
220*38e8c45fSAndroid Build Coastguard Worker             sp<IBinder> token = data.readStrongBinder();
221*38e8c45fSAndroid Build Coastguard Worker             int32_t code = data.readInt32();
222*38e8c45fSAndroid Build Coastguard Worker             int32_t uid = data.readInt32();
223*38e8c45fSAndroid Build Coastguard Worker             String16 packageName = data.readString16();
224*38e8c45fSAndroid Build Coastguard Worker             std::optional<String16> attributionTag;
225*38e8c45fSAndroid Build Coastguard Worker             data.readString16(&attributionTag);
226*38e8c45fSAndroid Build Coastguard Worker             bool startIfModeDefault = data.readBool();
227*38e8c45fSAndroid Build Coastguard Worker             bool shouldCollectAsyncNotedOp = data.readBool();
228*38e8c45fSAndroid Build Coastguard Worker             String16 message = data.readString16();
229*38e8c45fSAndroid Build Coastguard Worker             bool shouldCollectMessage = data.readBool();
230*38e8c45fSAndroid Build Coastguard Worker             int32_t res = startOperation(token, code, uid, packageName, attributionTag,
231*38e8c45fSAndroid Build Coastguard Worker                     startIfModeDefault, shouldCollectAsyncNotedOp, message, shouldCollectMessage);
232*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
233*38e8c45fSAndroid Build Coastguard Worker             reply->writeInt32(res);
234*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
235*38e8c45fSAndroid Build Coastguard Worker         } break;
236*38e8c45fSAndroid Build Coastguard Worker         case FINISH_OPERATION_TRANSACTION: {
237*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
238*38e8c45fSAndroid Build Coastguard Worker             sp<IBinder> token = data.readStrongBinder();
239*38e8c45fSAndroid Build Coastguard Worker             int32_t code = data.readInt32();
240*38e8c45fSAndroid Build Coastguard Worker             int32_t uid = data.readInt32();
241*38e8c45fSAndroid Build Coastguard Worker             String16 packageName = data.readString16();
242*38e8c45fSAndroid Build Coastguard Worker             std::optional<String16> attributionTag;
243*38e8c45fSAndroid Build Coastguard Worker             data.readString16(&attributionTag);
244*38e8c45fSAndroid Build Coastguard Worker             finishOperation(token, code, uid, packageName, attributionTag);
245*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
246*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
247*38e8c45fSAndroid Build Coastguard Worker         } break;
248*38e8c45fSAndroid Build Coastguard Worker         case START_WATCHING_MODE_TRANSACTION: {
249*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
250*38e8c45fSAndroid Build Coastguard Worker             int32_t op = data.readInt32();
251*38e8c45fSAndroid Build Coastguard Worker             String16 packageName = data.readString16();
252*38e8c45fSAndroid Build Coastguard Worker             sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
253*38e8c45fSAndroid Build Coastguard Worker             startWatchingMode(op, packageName, callback);
254*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
255*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
256*38e8c45fSAndroid Build Coastguard Worker         } break;
257*38e8c45fSAndroid Build Coastguard Worker         case STOP_WATCHING_MODE_TRANSACTION: {
258*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
259*38e8c45fSAndroid Build Coastguard Worker             sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
260*38e8c45fSAndroid Build Coastguard Worker             stopWatchingMode(callback);
261*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
262*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
263*38e8c45fSAndroid Build Coastguard Worker         } break;
264*38e8c45fSAndroid Build Coastguard Worker         case PERMISSION_TO_OP_CODE_TRANSACTION: {
265*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
266*38e8c45fSAndroid Build Coastguard Worker             String16 permission = data.readString16();
267*38e8c45fSAndroid Build Coastguard Worker             const int32_t opCode = permissionToOpCode(permission);
268*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
269*38e8c45fSAndroid Build Coastguard Worker             reply->writeInt32(opCode);
270*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
271*38e8c45fSAndroid Build Coastguard Worker         } break;
272*38e8c45fSAndroid Build Coastguard Worker         case CHECK_AUDIO_OPERATION_TRANSACTION: {
273*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
274*38e8c45fSAndroid Build Coastguard Worker             const int32_t code = data.readInt32();
275*38e8c45fSAndroid Build Coastguard Worker             const int32_t usage = data.readInt32();
276*38e8c45fSAndroid Build Coastguard Worker             const int32_t uid = data.readInt32();
277*38e8c45fSAndroid Build Coastguard Worker             const String16 packageName = data.readString16();
278*38e8c45fSAndroid Build Coastguard Worker             const int32_t res = checkAudioOperation(code, usage, uid, packageName);
279*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
280*38e8c45fSAndroid Build Coastguard Worker             reply->writeInt32(res);
281*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
282*38e8c45fSAndroid Build Coastguard Worker         } break;
283*38e8c45fSAndroid Build Coastguard Worker         case SET_CAMERA_AUDIO_RESTRICTION_TRANSACTION: {
284*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
285*38e8c45fSAndroid Build Coastguard Worker             const int32_t mode = data.readInt32();
286*38e8c45fSAndroid Build Coastguard Worker             setCameraAudioRestriction(mode);
287*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
288*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
289*38e8c45fSAndroid Build Coastguard Worker         } break;
290*38e8c45fSAndroid Build Coastguard Worker         case SHOULD_COLLECT_NOTES_TRANSACTION: {
291*38e8c45fSAndroid Build Coastguard Worker             CHECK_INTERFACE(IAppOpsService, data, reply);
292*38e8c45fSAndroid Build Coastguard Worker             int32_t opCode = data.readInt32();
293*38e8c45fSAndroid Build Coastguard Worker             bool shouldCollect = shouldCollectNotes(opCode);
294*38e8c45fSAndroid Build Coastguard Worker             reply->writeNoException();
295*38e8c45fSAndroid Build Coastguard Worker             reply->writeBool(shouldCollect);
296*38e8c45fSAndroid Build Coastguard Worker             return NO_ERROR;
297*38e8c45fSAndroid Build Coastguard Worker         } break;
298*38e8c45fSAndroid Build Coastguard Worker         default:
299*38e8c45fSAndroid Build Coastguard Worker             return BBinder::onTransact(code, data, reply, flags);
300*38e8c45fSAndroid Build Coastguard Worker     }
301*38e8c45fSAndroid Build Coastguard Worker }
302*38e8c45fSAndroid Build Coastguard Worker 
303*38e8c45fSAndroid Build Coastguard Worker } // namespace android
304