Home | History | Annotate | Download | only in binder
      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:
     28     explicit BpUidObserver(const sp<IBinder>& impl)
     29         : BpInterface<IUidObserver>(impl)
     30     {
     31     }
     32 
     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 
     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 
     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 
     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 
     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