1*38e8c45fSAndroid Build Coastguard Worker /* 2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2016 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 #include <unistd.h> 18*38e8c45fSAndroid Build Coastguard Worker #include <fcntl.h> 19*38e8c45fSAndroid Build Coastguard Worker 20*38e8c45fSAndroid Build Coastguard Worker #include <android/permission_manager.h> 21*38e8c45fSAndroid Build Coastguard Worker #include <binder/ActivityManager.h> 22*38e8c45fSAndroid Build Coastguard Worker #include <binder/IActivityManager.h> 23*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h> 24*38e8c45fSAndroid Build Coastguard Worker #include <utils/Errors.h> 25*38e8c45fSAndroid Build Coastguard Worker 26*38e8c45fSAndroid Build Coastguard Worker namespace android { 27*38e8c45fSAndroid Build Coastguard Worker 28*38e8c45fSAndroid Build Coastguard Worker // ------------------------------------------------------------------------------------ 29*38e8c45fSAndroid Build Coastguard Worker 30*38e8c45fSAndroid Build Coastguard Worker class BpActivityManager : public BpInterface<IActivityManager> 31*38e8c45fSAndroid Build Coastguard Worker { 32*38e8c45fSAndroid Build Coastguard Worker public: BpActivityManager(const sp<IBinder> & impl)33*38e8c45fSAndroid Build Coastguard Worker explicit BpActivityManager(const sp<IBinder>& impl) 34*38e8c45fSAndroid Build Coastguard Worker : BpInterface<IActivityManager>(impl) 35*38e8c45fSAndroid Build Coastguard Worker { 36*38e8c45fSAndroid Build Coastguard Worker } 37*38e8c45fSAndroid Build Coastguard Worker openContentUri(const String16 & stringUri)38*38e8c45fSAndroid Build Coastguard Worker virtual int openContentUri(const String16& stringUri) 39*38e8c45fSAndroid Build Coastguard Worker { 40*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 41*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 42*38e8c45fSAndroid Build Coastguard Worker data.writeString16(stringUri); 43*38e8c45fSAndroid Build Coastguard Worker status_t ret = remote()->transact(OPEN_CONTENT_URI_TRANSACTION, data, & reply); 44*38e8c45fSAndroid Build Coastguard Worker int fd = -1; 45*38e8c45fSAndroid Build Coastguard Worker if (ret == NO_ERROR) { 46*38e8c45fSAndroid Build Coastguard Worker int32_t exceptionCode = reply.readExceptionCode(); 47*38e8c45fSAndroid Build Coastguard Worker if (!exceptionCode) { 48*38e8c45fSAndroid Build Coastguard Worker // Success is indicated here by a nonzero int followed by the fd; 49*38e8c45fSAndroid Build Coastguard Worker // failure by a zero int with no data following. 50*38e8c45fSAndroid Build Coastguard Worker if (reply.readInt32() != 0) { 51*38e8c45fSAndroid Build Coastguard Worker fd = fcntl(reply.readParcelFileDescriptor(), F_DUPFD_CLOEXEC, 0); 52*38e8c45fSAndroid Build Coastguard Worker } 53*38e8c45fSAndroid Build Coastguard Worker } else { 54*38e8c45fSAndroid Build Coastguard Worker // An exception was thrown back; fall through to return failure 55*38e8c45fSAndroid Build Coastguard Worker ALOGD("openContentUri(%s) caught exception %d\n", String8(stringUri).c_str(), 56*38e8c45fSAndroid Build Coastguard Worker exceptionCode); 57*38e8c45fSAndroid Build Coastguard Worker } 58*38e8c45fSAndroid Build Coastguard Worker } 59*38e8c45fSAndroid Build Coastguard Worker return fd; 60*38e8c45fSAndroid Build Coastguard Worker } 61*38e8c45fSAndroid Build Coastguard Worker registerUidObserver(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage)62*38e8c45fSAndroid Build Coastguard Worker virtual status_t registerUidObserver(const sp<IUidObserver>& observer, 63*38e8c45fSAndroid Build Coastguard Worker const int32_t event, 64*38e8c45fSAndroid Build Coastguard Worker const int32_t cutpoint, 65*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage) 66*38e8c45fSAndroid Build Coastguard Worker { 67*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 68*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 69*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(observer)); 70*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(event); 71*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(cutpoint); 72*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 73*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(REGISTER_UID_OBSERVER_TRANSACTION, data, &reply); 74*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 75*38e8c45fSAndroid Build Coastguard Worker return err; 76*38e8c45fSAndroid Build Coastguard Worker } 77*38e8c45fSAndroid Build Coastguard Worker return OK; 78*38e8c45fSAndroid Build Coastguard Worker } 79*38e8c45fSAndroid Build Coastguard Worker registerUidObserverForUids(const sp<IUidObserver> & observer,const int32_t event,const int32_t cutpoint,const String16 & callingPackage,const int32_t uids[],size_t nUids,sp<IBinder> & observerToken)80*38e8c45fSAndroid Build Coastguard Worker virtual status_t registerUidObserverForUids(const sp<IUidObserver>& observer, 81*38e8c45fSAndroid Build Coastguard Worker const int32_t event, const int32_t cutpoint, 82*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage, 83*38e8c45fSAndroid Build Coastguard Worker const int32_t uids[], size_t nUids, 84*38e8c45fSAndroid Build Coastguard Worker /*out*/ sp<IBinder>& observerToken) { 85*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 86*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 87*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(observer)); 88*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(event); 89*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(cutpoint); 90*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 91*38e8c45fSAndroid Build Coastguard Worker data.writeInt32Array(nUids, uids); 92*38e8c45fSAndroid Build Coastguard Worker status_t err = 93*38e8c45fSAndroid Build Coastguard Worker remote()->transact(REGISTER_UID_OBSERVER_FOR_UIDS_TRANSACTION, data, &reply); 94*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 95*38e8c45fSAndroid Build Coastguard Worker return err; 96*38e8c45fSAndroid Build Coastguard Worker } 97*38e8c45fSAndroid Build Coastguard Worker err = reply.readStrongBinder(&observerToken); 98*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 99*38e8c45fSAndroid Build Coastguard Worker return err; 100*38e8c45fSAndroid Build Coastguard Worker } 101*38e8c45fSAndroid Build Coastguard Worker return OK; 102*38e8c45fSAndroid Build Coastguard Worker } 103*38e8c45fSAndroid Build Coastguard Worker unregisterUidObserver(const sp<IUidObserver> & observer)104*38e8c45fSAndroid Build Coastguard Worker virtual status_t unregisterUidObserver(const sp<IUidObserver>& observer) 105*38e8c45fSAndroid Build Coastguard Worker { 106*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 107*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 108*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(IInterface::asBinder(observer)); 109*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(UNREGISTER_UID_OBSERVER_TRANSACTION, data, &reply); 110*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 111*38e8c45fSAndroid Build Coastguard Worker return err; 112*38e8c45fSAndroid Build Coastguard Worker } 113*38e8c45fSAndroid Build Coastguard Worker return OK; 114*38e8c45fSAndroid Build Coastguard Worker } 115*38e8c45fSAndroid Build Coastguard Worker addUidToObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)116*38e8c45fSAndroid Build Coastguard Worker virtual status_t addUidToObserver(const sp<IBinder>& observerToken, 117*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage, int32_t uid) { 118*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 119*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 120*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(observerToken); 121*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 122*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(uid); 123*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(ADD_UID_TO_OBSERVER_TRANSACTION, data, &reply); 124*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 125*38e8c45fSAndroid Build Coastguard Worker return err; 126*38e8c45fSAndroid Build Coastguard Worker } 127*38e8c45fSAndroid Build Coastguard Worker return OK; 128*38e8c45fSAndroid Build Coastguard Worker } 129*38e8c45fSAndroid Build Coastguard Worker removeUidFromObserver(const sp<IBinder> & observerToken,const String16 & callingPackage,int32_t uid)130*38e8c45fSAndroid Build Coastguard Worker virtual status_t removeUidFromObserver(const sp<IBinder>& observerToken, 131*38e8c45fSAndroid Build Coastguard Worker const String16& callingPackage, int32_t uid) { 132*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 133*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 134*38e8c45fSAndroid Build Coastguard Worker data.writeStrongBinder(observerToken); 135*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 136*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(uid); 137*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(REMOVE_UID_FROM_OBSERVER_TRANSACTION, data, &reply); 138*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 139*38e8c45fSAndroid Build Coastguard Worker return err; 140*38e8c45fSAndroid Build Coastguard Worker } 141*38e8c45fSAndroid Build Coastguard Worker return OK; 142*38e8c45fSAndroid Build Coastguard Worker } 143*38e8c45fSAndroid Build Coastguard Worker isUidActive(const uid_t uid,const String16 & callingPackage)144*38e8c45fSAndroid Build Coastguard Worker virtual bool isUidActive(const uid_t uid, const String16& callingPackage) 145*38e8c45fSAndroid Build Coastguard Worker { 146*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 147*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 148*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(uid); 149*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 150*38e8c45fSAndroid Build Coastguard Worker remote()->transact(IS_UID_ACTIVE_TRANSACTION, data, &reply); 151*38e8c45fSAndroid Build Coastguard Worker // fail on exception 152*38e8c45fSAndroid Build Coastguard Worker if (reply.readExceptionCode() != 0) return false; 153*38e8c45fSAndroid Build Coastguard Worker return reply.readInt32() == 1; 154*38e8c45fSAndroid Build Coastguard Worker } 155*38e8c45fSAndroid Build Coastguard Worker getUidProcessState(const uid_t uid,const String16 & callingPackage)156*38e8c45fSAndroid Build Coastguard Worker virtual int32_t getUidProcessState(const uid_t uid, const String16& callingPackage) 157*38e8c45fSAndroid Build Coastguard Worker { 158*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 159*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 160*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(uid); 161*38e8c45fSAndroid Build Coastguard Worker data.writeString16(callingPackage); 162*38e8c45fSAndroid Build Coastguard Worker remote()->transact(GET_UID_PROCESS_STATE_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 ActivityManager::PROCESS_STATE_UNKNOWN; 166*38e8c45fSAndroid Build Coastguard Worker } 167*38e8c45fSAndroid Build Coastguard Worker return reply.readInt32(); 168*38e8c45fSAndroid Build Coastguard Worker } 169*38e8c45fSAndroid Build Coastguard Worker checkPermission(const String16 & permission,const pid_t pid,const uid_t uid,int32_t * outResult)170*38e8c45fSAndroid Build Coastguard Worker virtual status_t checkPermission(const String16& permission, 171*38e8c45fSAndroid Build Coastguard Worker const pid_t pid, 172*38e8c45fSAndroid Build Coastguard Worker const uid_t uid, 173*38e8c45fSAndroid Build Coastguard Worker int32_t* outResult) { 174*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 175*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 176*38e8c45fSAndroid Build Coastguard Worker data.writeString16(permission); 177*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(pid); 178*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(uid); 179*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(CHECK_PERMISSION_TRANSACTION, data, &reply); 180*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 181*38e8c45fSAndroid Build Coastguard Worker return err; 182*38e8c45fSAndroid Build Coastguard Worker } 183*38e8c45fSAndroid Build Coastguard Worker *outResult = reply.readInt32(); 184*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR; 185*38e8c45fSAndroid Build Coastguard Worker } 186*38e8c45fSAndroid Build Coastguard Worker logFgsApiBegin(int32_t apiType,int32_t appUid,int32_t appPid)187*38e8c45fSAndroid Build Coastguard Worker virtual status_t logFgsApiBegin(int32_t apiType, int32_t appUid, int32_t appPid) { 188*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 189*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 190*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(apiType); 191*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appUid); 192*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appPid); 193*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(LOG_FGS_API_BEGIN_TRANSACTION, data, &reply, 194*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY); 195*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 196*38e8c45fSAndroid Build Coastguard Worker ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err); 197*38e8c45fSAndroid Build Coastguard Worker return err; 198*38e8c45fSAndroid Build Coastguard Worker } 199*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR; 200*38e8c45fSAndroid Build Coastguard Worker } 201*38e8c45fSAndroid Build Coastguard Worker logFgsApiEnd(int32_t apiType,int32_t appUid,int32_t appPid)202*38e8c45fSAndroid Build Coastguard Worker virtual status_t logFgsApiEnd(int32_t apiType, int32_t appUid, int32_t appPid) { 203*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 204*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 205*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(apiType); 206*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appUid); 207*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appPid); 208*38e8c45fSAndroid Build Coastguard Worker status_t err = 209*38e8c45fSAndroid Build Coastguard Worker remote()->transact(LOG_FGS_API_END_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); 210*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 211*38e8c45fSAndroid Build Coastguard Worker ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err); 212*38e8c45fSAndroid Build Coastguard Worker return err; 213*38e8c45fSAndroid Build Coastguard Worker } 214*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR; 215*38e8c45fSAndroid Build Coastguard Worker } 216*38e8c45fSAndroid Build Coastguard Worker logFgsApiStateChanged(int32_t apiType,int32_t state,int32_t appUid,int32_t appPid)217*38e8c45fSAndroid Build Coastguard Worker virtual status_t logFgsApiStateChanged(int32_t apiType, int32_t state, int32_t appUid, 218*38e8c45fSAndroid Build Coastguard Worker int32_t appPid) { 219*38e8c45fSAndroid Build Coastguard Worker Parcel data, reply; 220*38e8c45fSAndroid Build Coastguard Worker data.writeInterfaceToken(IActivityManager::getInterfaceDescriptor()); 221*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(apiType); 222*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(state); 223*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appUid); 224*38e8c45fSAndroid Build Coastguard Worker data.writeInt32(appPid); 225*38e8c45fSAndroid Build Coastguard Worker status_t err = remote()->transact(LOG_FGS_API_STATE_CHANGED_TRANSACTION, data, &reply, 226*38e8c45fSAndroid Build Coastguard Worker IBinder::FLAG_ONEWAY); 227*38e8c45fSAndroid Build Coastguard Worker if (err != NO_ERROR || ((err = reply.readExceptionCode()) != NO_ERROR)) { 228*38e8c45fSAndroid Build Coastguard Worker ALOGD("%s: FGS Logger Transaction failed, %d", __func__, err); 229*38e8c45fSAndroid Build Coastguard Worker return err; 230*38e8c45fSAndroid Build Coastguard Worker } 231*38e8c45fSAndroid Build Coastguard Worker return NO_ERROR; 232*38e8c45fSAndroid Build Coastguard Worker } 233*38e8c45fSAndroid Build Coastguard Worker }; 234*38e8c45fSAndroid Build Coastguard Worker 235*38e8c45fSAndroid Build Coastguard Worker // ------------------------------------------------------------------------------------ 236*38e8c45fSAndroid Build Coastguard Worker 237*38e8c45fSAndroid Build Coastguard Worker IMPLEMENT_META_INTERFACE(ActivityManager, "android.app.IActivityManager") 238*38e8c45fSAndroid Build Coastguard Worker 239*38e8c45fSAndroid Build Coastguard Worker } // namespace android 240