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)59     virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq)
60     {
61         Parcel data, reply;
62         data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor());
63         data.writeInt32((int32_t) uid);
64         data.writeInt32(procState);
65         data.writeInt64(procStateSeq);
66         remote()->transact(ON_UID_STATE_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
67     }
68 };
69 
70 // ----------------------------------------------------------------------
71 
72 IMPLEMENT_META_INTERFACE(UidObserver, "android.app.IUidObserver");
73 
74 // ----------------------------------------------------------------------
75 
onTransact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags)76 status_t BnUidObserver::onTransact(
77     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
78 {
79     switch(code) {
80         case ON_UID_GONE_TRANSACTION: {
81             CHECK_INTERFACE(IUidObserver, data, reply);
82             uid_t uid = data.readInt32();
83             bool disabled = data.readInt32() == 1;
84             onUidGone(uid, disabled);
85             return NO_ERROR;
86         } break;
87 
88         case ON_UID_ACTIVE_TRANSACTION: {
89             CHECK_INTERFACE(IUidObserver, data, reply);
90             uid_t uid = data.readInt32();
91             onUidActive(uid);
92             return NO_ERROR;
93         } break;
94 
95         case ON_UID_IDLE_TRANSACTION: {
96             CHECK_INTERFACE(IUidObserver, data, reply);
97             uid_t uid = data.readInt32();
98             bool disabled = data.readInt32() == 1;
99             onUidIdle(uid, disabled);
100             return NO_ERROR;
101         } break;
102         case ON_UID_STATE_CHANGED_TRANSACTION: {
103             CHECK_INTERFACE(IUidObserver, data, reply);
104             uid_t uid = data.readInt32();
105             int32_t procState = data.readInt32();
106             int64_t procStateSeq = data.readInt64();
107             onUidStateChanged(uid, procState, procStateSeq);
108             return NO_ERROR;
109         } break;
110         default:
111             return BBinder::onTransact(code, data, reply, flags);
112     }
113 }
114 
115 }; // namespace android
116