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