1 /* 2 * Copyright (C) 2017 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 #include <binder/IUidObserver.h> 18 19 #include <binder/Parcel.h> 20 21 namespace android { 22 23 // ------------------------------------------------------------------------------------ 24 25 class BpUidObserver : public BpInterface<IUidObserver> 26 { 27 public: BpUidObserver(const sp<IBinder> & impl)28 explicit BpUidObserver(const sp<IBinder>& impl) 29 : BpInterface<IUidObserver>(impl) 30 { 31 } 32 onUidGone(uid_t uid,bool disabled)33 virtual void onUidGone(uid_t uid, bool disabled) 34 { 35 Parcel data, reply; 36 data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor()); 37 data.writeInt32((int32_t) uid); 38 data.writeInt32(disabled ? 1 : 0); 39 remote()->transact(ON_UID_GONE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); 40 } 41 onUidActive(uid_t uid)42 virtual void onUidActive(uid_t uid) 43 { 44 Parcel data, reply; 45 data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor()); 46 data.writeInt32((int32_t) uid); 47 remote()->transact(ON_UID_ACTIVE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); 48 } 49 onUidIdle(uid_t uid,bool disabled)50 virtual void onUidIdle(uid_t uid, bool disabled) 51 { 52 Parcel data, reply; 53 data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor()); 54 data.writeInt32((int32_t) uid); 55 data.writeInt32(disabled ? 1 : 0); 56 remote()->transact(ON_UID_IDLE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); 57 } 58 onUidStateChanged(uid_t uid,int32_t procState,int64_t procStateSeq,int32_t capability)59 virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq, 60 int32_t capability) 61 { 62 Parcel data, reply; 63 data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor()); 64 data.writeInt32((int32_t) uid); 65 data.writeInt32(procState); 66 data.writeInt64(procStateSeq); 67 data.writeInt32(capability); 68 remote()->transact(ON_UID_STATE_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY); 69 } 70 }; 71 72 // ---------------------------------------------------------------------- 73 74 IMPLEMENT_META_INTERFACE(UidObserver, "android.app.IUidObserver") 75 76 // ---------------------------------------------------------------------- 77 78 // NOLINTNEXTLINE(google-default-arguments) 79 status_t BnUidObserver::onTransact( 80 uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 81 { 82 switch(code) { 83 case ON_UID_GONE_TRANSACTION: { 84 CHECK_INTERFACE(IUidObserver, data, reply); 85 uid_t uid = data.readInt32(); 86 bool disabled = data.readInt32() == 1; 87 onUidGone(uid, disabled); 88 return NO_ERROR; 89 } break; 90 91 case ON_UID_ACTIVE_TRANSACTION: { 92 CHECK_INTERFACE(IUidObserver, data, reply); 93 uid_t uid = data.readInt32(); 94 onUidActive(uid); 95 return NO_ERROR; 96 } break; 97 98 case ON_UID_IDLE_TRANSACTION: { 99 CHECK_INTERFACE(IUidObserver, data, reply); 100 uid_t uid = data.readInt32(); 101 bool disabled = data.readInt32() == 1; 102 onUidIdle(uid, disabled); 103 return NO_ERROR; 104 } break; 105 case ON_UID_STATE_CHANGED_TRANSACTION: { 106 CHECK_INTERFACE(IUidObserver, data, reply); 107 uid_t uid = data.readInt32(); 108 int32_t procState = data.readInt32(); 109 int64_t procStateSeq = data.readInt64(); 110 int32_t capability = data.readInt32(); 111 onUidStateChanged(uid, procState, procStateSeq, capability); 112 return NO_ERROR; 113 } break; 114 default: 115 return BBinder::onTransact(code, data, reply, flags); 116 } 117 } 118 119 } // namespace android 120