blob: f2b4a6ef373b546d383a195239b9f141f56816d8 [file] [log] [blame]
Sudheer Shanka6ef26f12016-11-23 15:52:26 -08001/*
2 * Copyright (C) 2016 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
Nick Kralevichec9ec7d2016-12-17 19:47:27 -080017#include <unistd.h>
18#include <fcntl.h>
19
Chong Zhangb632bd52020-11-02 11:01:48 -080020#include <android/permission_manager.h>
Eric Laurent05595892018-10-18 14:56:24 -070021#include <binder/ActivityManager.h>
Sudheer Shanka6ef26f12016-11-23 15:52:26 -080022#include <binder/IActivityManager.h>
Sudheer Shanka6ef26f12016-11-23 15:52:26 -080023#include <binder/Parcel.h>
Chong Zhangb632bd52020-11-02 11:01:48 -080024#include <utils/Errors.h>
Sudheer Shanka6ef26f12016-11-23 15:52:26 -080025
26namespace android {
27
28// ------------------------------------------------------------------------------------
29
30class BpActivityManager : public BpInterface<IActivityManager>
31{
32public:
33 explicit BpActivityManager(const sp<IBinder>& impl)
34 : BpInterface<IActivityManager>(impl)
35 {
36 }
37
38 virtual int openContentUri(const String16& stringUri)
39 {
40 Parcel data, reply;
Sudheer Shankaff81a092017-03-02 12:27:58 -080041 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
Sudheer Shanka6ef26f12016-11-23 15:52:26 -080042 data.writeString16(stringUri);
43 status_t ret = remote()->transact(OPEN_CONTENT_URI_TRANSACTION, data, & reply);
44 int fd = -1;
45 if (ret == NO_ERROR) {
46 int32_t exceptionCode = reply.readExceptionCode();
47 if (!exceptionCode) {
48 // Success is indicated here by a nonzero int followed by the fd;
49 // failure by a zero int with no data following.
50 if (reply.readInt32() != 0) {
Nick Kralevichec9ec7d2016-12-17 19:47:27 -080051 fd = fcntl(reply.readParcelFileDescriptor(), F_DUPFD_CLOEXEC, 0);
Sudheer Shanka6ef26f12016-11-23 15:52:26 -080052 }
53 } else {
54 // An exception was thrown back; fall through to return failure
55 ALOGD("openContentUri(%s) caught exception %d\n",
56 String8(stringUri).string(), exceptionCode);
57 }
58 }
59 return fd;
60 }
Ganesh Mahendran4d85b8c2017-11-02 14:43:38 +000061
Chong Zhang15765342020-11-17 14:44:20 -080062 virtual status_t registerUidObserver(const sp<IUidObserver>& observer,
Ganesh Mahendran4d85b8c2017-11-02 14:43:38 +000063 const int32_t event,
64 const int32_t cutpoint,
65 const String16& callingPackage)
66 {
67 Parcel data, reply;
68 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
69 data.writeStrongBinder(IInterface::asBinder(observer));
70 data.writeInt32(event);
71 data.writeInt32(cutpoint);
72 data.writeString16(callingPackage);
Chong Zhang15765342020-11-17 14:44:20 -080073 status_t err = remote()->transact(REGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
74 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
75 return err;
76 }
77 return OK;
Ganesh Mahendran4d85b8c2017-11-02 14:43:38 +000078 }
79
Austin Borger805d8042023-04-21 20:07:49 -070080 virtual status_t registerUidObserverForUids(const sp<IUidObserver>& observer,
81 const int32_t event, const int32_t cutpoint,
82 const String16& callingPackage,
83 const int32_t uids[], size_t nUids,
84 /*out*/ sp<IBinder>& observerToken) {
85 Parcel data, reply;
86 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
87 data.writeStrongBinder(IInterface::asBinder(observer));
88 data.writeInt32(event);
89 data.writeInt32(cutpoint);
90 data.writeString16(callingPackage);
91 data.writeInt32Array(nUids, uids);
92 status_t err =
93 remote()->transact(REGISTER_UID_OBSERVER_FOR_UIDS_TRANSACTION, data, &reply);
94 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
95 return err;
96 }
97 err = reply.readStrongBinder(&observerToken);
98 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
99 return err;
100 }
101 return OK;
102 }
103
Chong Zhang15765342020-11-17 14:44:20 -0800104 virtual status_t unregisterUidObserver(const sp<IUidObserver>& observer)
Ganesh Mahendran4d85b8c2017-11-02 14:43:38 +0000105 {
106 Parcel data, reply;
107 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
108 data.writeStrongBinder(IInterface::asBinder(observer));
Chong Zhang15765342020-11-17 14:44:20 -0800109 status_t err = remote()->transact(UNREGISTER_UID_OBSERVER_TRANSACTION, data, &reply);
110 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
111 return err;
112 }
113 return OK;
Ganesh Mahendran4d85b8c2017-11-02 14:43:38 +0000114 }
Svet Ganovfa851802018-03-27 17:17:46 -0700115
Austin Borger805d8042023-04-21 20:07:49 -0700116 virtual status_t addUidToObserver(const sp<IBinder>& observerToken,
117 const String16& callingPackage, int32_t uid) {
118 Parcel data, reply;
119 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
120 data.writeStrongBinder(observerToken);
121 data.writeString16(callingPackage);
122 data.writeInt32(uid);
123 status_t err = remote()->transact(ADD_UID_TO_OBSERVER_TRANSACTION, data, &reply);
124 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
125 return err;
126 }
127 return OK;
128 }
129
130 virtual status_t removeUidFromObserver(const sp<IBinder>& observerToken,
131 const String16& callingPackage, int32_t uid) {
132 Parcel data, reply;
133 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
134 data.writeStrongBinder(observerToken);
135 data.writeString16(callingPackage);
136 data.writeInt32(uid);
137 status_t err = remote()->transact(REMOVE_UID_FROM_OBSERVER_TRANSACTION, data, &reply);
138 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
139 return err;
140 }
141 return OK;
142 }
143
Svet Ganovfa851802018-03-27 17:17:46 -0700144 virtual bool isUidActive(const uid_t uid, const String16& callingPackage)
145 {
146 Parcel data, reply;
147 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
148 data.writeInt32(uid);
149 data.writeString16(callingPackage);
150 remote()->transact(IS_UID_ACTIVE_TRANSACTION, data, &reply);
151 // fail on exception
152 if (reply.readExceptionCode() != 0) return false;
153 return reply.readInt32() == 1;
154 }
Eric Laurent05595892018-10-18 14:56:24 -0700155
156 virtual int32_t getUidProcessState(const uid_t uid, const String16& callingPackage)
157 {
158 Parcel data, reply;
159 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
160 data.writeInt32(uid);
161 data.writeString16(callingPackage);
162 remote()->transact(GET_UID_PROCESS_STATE_TRANSACTION, data, &reply);
163 // fail on exception
164 if (reply.readExceptionCode() != 0) {
165 return ActivityManager::PROCESS_STATE_UNKNOWN;
166 }
167 return reply.readInt32();
168 }
Chong Zhangb632bd52020-11-02 11:01:48 -0800169
170 virtual status_t checkPermission(const String16& permission,
171 const pid_t pid,
172 const uid_t uid,
173 int32_t* outResult) {
174 Parcel data, reply;
175 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
176 data.writeString16(permission);
177 data.writeInt32(pid);
178 data.writeInt32(uid);
179 status_t err = remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply);
180 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
181 return err;
182 }
183 *outResult = reply.readInt32();
184 return NO_ERROR;
185 }
Kunal Malhotra76004e02023-02-28 22:00:21 +0000186
187 virtual status_t logFgsApiBegin(int32_t apiType, int32_t appUid, int32_t appPid) {
188 Parcel data, reply;
189 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
190 data.writeInt32(apiType);
191 data.writeInt32(appUid);
192 data.writeInt32(appPid);
Kunal Malhotra3fea8b52023-05-05 22:42:05 +0000193 status_t err = remote()->transact(LOG_FGS_API_BEGIN_TRANSACTION, data, &reply,
194 IBinder::FLAG_ONEWAY);
Kunal Malhotra76004e02023-02-28 22:00:21 +0000195 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
196 ALOGD("FGS Logger Transaction failed");
197 ALOGD("%d", err);
198 return err;
199 }
200 return NO_ERROR;
201 }
202
203 virtual status_t logFgsApiEnd(int32_t apiType, int32_t appUid, int32_t appPid) {
204 Parcel data, reply;
205 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
206 data.writeInt32(apiType);
207 data.writeInt32(appUid);
208 data.writeInt32(appPid);
Kunal Malhotra3fea8b52023-05-05 22:42:05 +0000209 status_t err =
210 remote()->transact(LOG_FGS_API_END_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
Kunal Malhotra76004e02023-02-28 22:00:21 +0000211 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
212 ALOGD("FGS Logger Transaction failed");
213 ALOGD("%d", err);
214 return err;
215 }
216 return NO_ERROR;
217 }
218
219 virtual status_t logFgsApiStateChanged(int32_t apiType, int32_t state, int32_t appUid,
220 int32_t appPid) {
221 Parcel data, reply;
222 data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor());
223 data.writeInt32(apiType);
224 data.writeInt32(state);
225 data.writeInt32(appUid);
226 data.writeInt32(appPid);
Kunal Malhotra3fea8b52023-05-05 22:42:05 +0000227 status_t err = remote()->transact(LOG_FGS_API_BEGIN_TRANSACTION, data, &reply,
228 IBinder::FLAG_ONEWAY);
Kunal Malhotra76004e02023-02-28 22:00:21 +0000229 if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) {
230 ALOGD("FGS Logger Transaction failed");
231 ALOGD("%d", err);
232 return err;
233 }
234 return NO_ERROR;
235 }
Sudheer Shanka6ef26f12016-11-23 15:52:26 -0800236};
237
238// ------------------------------------------------------------------------------------
239
Jooyung Hanc91e3cb2020-11-25 06:38:17 +0900240IMPLEMENT_META_INTERFACE(ActivityManager, "android.app.IActivityManager")
Sudheer Shanka6ef26f12016-11-23 15:52:26 -0800241
Steven Moreland6511af52019-09-26 16:05:45 -0700242} // namespace android