blob: fb0d521caceb0cf84e284ebb355e58bcf1c923a6 [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
25#include <private/binder/Static.h>
26
27namespace 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
51 virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName) {
52 Parcel data, reply;
53 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
54 data.writeInt32(code);
55 data.writeInt32(uid);
56 data.writeString16(packageName);
57 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,
Svet Ganov616554c2018-02-26 13:27:26 -080064 const String16& packageName, bool startIfModeDefault) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080065 Parcel data, reply;
66 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070067 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080068 data.writeInt32(code);
69 data.writeInt32(uid);
70 data.writeString16(packageName);
Svet Ganov616554c2018-02-26 13:27:26 -080071 data.writeInt32(startIfModeDefault ? 1 : 0);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080072 remote()->transact(START_OPERATION_TRANSACTION, data, &reply);
73 // fail on exception
Eino-Ville Talvalae88a85e2013-02-19 12:54:57 -080074 if (reply.readExceptionCode() != 0) return MODE_ERRORED;
75 return reply.readInt32();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080076 }
77
Dianne Hackborn913b63d2013-07-17 17:26:15 -070078 virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
79 const String16& packageName) {
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080080 Parcel data, reply;
81 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Dianne Hackborn913b63d2013-07-17 17:26:15 -070082 data.writeStrongBinder(token);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080083 data.writeInt32(code);
84 data.writeInt32(uid);
85 data.writeString16(packageName);
86 remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply);
87 }
88
89 virtual void startWatchingMode(int32_t op, const String16& packageName,
90 const sp<IAppOpsCallback>& callback) {
91 Parcel data, reply;
92 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
93 data.writeInt32(op);
94 data.writeString16(packageName);
Marco Nelissen2ea926b2014-11-14 08:01:01 -080095 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -080096 remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply);
97 }
98
99 virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) {
100 Parcel data, reply;
101 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
Marco Nelissen2ea926b2014-11-14 08:01:01 -0800102 data.writeStrongBinder(IInterface::asBinder(callback));
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800103 remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
104 }
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700105
106 virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) {
107 Parcel data, reply;
108 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
109 data.writeStrongBinder(clientToken);
110 remote()->transact(GET_TOKEN_TRANSACTION, data, &reply);
111 // fail on exception
Yi Kongfdd8da92018-06-07 17:52:27 -0700112 if (reply.readExceptionCode() != 0) return nullptr;
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700113 return reply.readStrongBinder();
114 }
Svetoslavb412f6e2015-04-29 16:50:41 -0700115
116
117 virtual int32_t permissionToOpCode(const String16& permission) {
118 Parcel data, reply;
119 data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
120 data.writeString16(permission);
121 remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply);
122 // fail on exception
123 if (reply.readExceptionCode() != 0) return -1;
124 return reply.readInt32();
125 }
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800126};
127
128IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
129
130// ----------------------------------------------------------------------
131
Jiyong Parkb86c8662018-10-29 23:01:57 +0900132// NOLINTNEXTLINE(google-default-arguments)
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800133status_t BnAppOpsService::onTransact(
134 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
135{
136 //printf("AppOpsService received: "); data.print();
137 switch(code) {
138 case CHECK_OPERATION_TRANSACTION: {
139 CHECK_INTERFACE(IAppOpsService, data, reply);
140 int32_t code = data.readInt32();
141 int32_t uid = data.readInt32();
142 String16 packageName = data.readString16();
143 int32_t res = checkOperation(code, uid, packageName);
144 reply->writeNoException();
145 reply->writeInt32(res);
146 return NO_ERROR;
147 } break;
148 case NOTE_OPERATION_TRANSACTION: {
149 CHECK_INTERFACE(IAppOpsService, data, reply);
150 int32_t code = data.readInt32();
151 int32_t uid = data.readInt32();
152 String16 packageName = data.readString16();
153 int32_t res = noteOperation(code, uid, packageName);
154 reply->writeNoException();
155 reply->writeInt32(res);
156 return NO_ERROR;
157 } break;
158 case START_OPERATION_TRANSACTION: {
159 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700160 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800161 int32_t code = data.readInt32();
162 int32_t uid = data.readInt32();
163 String16 packageName = data.readString16();
Svet Ganov616554c2018-02-26 13:27:26 -0800164 bool startIfModeDefault = data.readInt32() == 1;
165 int32_t res = startOperation(token, code, uid, packageName, startIfModeDefault);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800166 reply->writeNoException();
167 reply->writeInt32(res);
168 return NO_ERROR;
169 } break;
170 case FINISH_OPERATION_TRANSACTION: {
171 CHECK_INTERFACE(IAppOpsService, data, reply);
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700172 sp<IBinder> token = data.readStrongBinder();
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800173 int32_t code = data.readInt32();
174 int32_t uid = data.readInt32();
175 String16 packageName = data.readString16();
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700176 finishOperation(token, code, uid, packageName);
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800177 reply->writeNoException();
178 return NO_ERROR;
179 } break;
180 case START_WATCHING_MODE_TRANSACTION: {
181 CHECK_INTERFACE(IAppOpsService, data, reply);
182 int32_t op = data.readInt32();
183 String16 packageName = data.readString16();
184 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
185 startWatchingMode(op, packageName, callback);
186 reply->writeNoException();
187 return NO_ERROR;
188 } break;
189 case STOP_WATCHING_MODE_TRANSACTION: {
190 CHECK_INTERFACE(IAppOpsService, data, reply);
191 sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder());
192 stopWatchingMode(callback);
193 reply->writeNoException();
194 return NO_ERROR;
195 } break;
Dianne Hackborn913b63d2013-07-17 17:26:15 -0700196 case GET_TOKEN_TRANSACTION: {
197 CHECK_INTERFACE(IAppOpsService, data, reply);
198 sp<IBinder> clientToken = data.readStrongBinder();
199 sp<IBinder> token = getToken(clientToken);
200 reply->writeNoException();
201 reply->writeStrongBinder(token);
202 return NO_ERROR;
203 } break;
Svetoslavb412f6e2015-04-29 16:50:41 -0700204 case PERMISSION_TO_OP_CODE_TRANSACTION: {
205 CHECK_INTERFACE(IAppOpsService, data, reply);
206 String16 permission = data.readString16();
207 const int32_t opCode = permissionToOpCode(permission);
208 reply->writeNoException();
209 reply->writeInt32(opCode);
210 return NO_ERROR;
211 } break;
Dianne Hackborn5da5ca52013-02-12 15:12:21 -0800212 default:
213 return BBinder::onTransact(code, data, reply, flags);
214 }
215}
216
217}; // namespace android