14d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran/*
24d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * Copyright (C) 2017 The Android Open Source Project
34d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran *
44d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * Licensed under the Apache License, Version 2.0 (the "License");
54d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * you may not use this file except in compliance with the License.
64d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * You may obtain a copy of the License at
74d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran *
84d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran *      http://www.apache.org/licenses/LICENSE-2.0
94d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran *
104d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * Unless required by applicable law or agreed to in writing, software
114d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * distributed under the License is distributed on an "AS IS" BASIS,
124d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * See the License for the specific language governing permissions and
144d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran * limitations under the License.
154d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran */
164d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
174d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran#include <binder/IUidObserver.h>
184d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
194d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran#include <binder/Parcel.h>
204d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
214d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendrannamespace android {
224d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
234d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran// ------------------------------------------------------------------------------------
244d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
254d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendranclass BpUidObserver : public BpInterface<IUidObserver>
264d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran{
274d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendranpublic:
284d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    explicit BpUidObserver(const sp<IBinder>& impl)
294d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        : BpInterface<IUidObserver>(impl)
304d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
314d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
324d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
334d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    virtual void onUidGone(uid_t uid, bool disabled)
344d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
354d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        Parcel data, reply;
364d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor());
374d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInt32((int32_t) uid);
384d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInt32(disabled ? 1 : 0);
394d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        remote()->transact(ON_UID_GONE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
404d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
414d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
424d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    virtual void onUidActive(uid_t uid)
434d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
444d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        Parcel data, reply;
454d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor());
464d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInt32((int32_t) uid);
474d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        remote()->transact(ON_UID_ACTIVE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
484d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
494d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
504d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    virtual void onUidIdle(uid_t uid, bool disabled)
514d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    {
524d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        Parcel data, reply;
534d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor());
544d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInt32((int32_t) uid);
554d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        data.writeInt32(disabled ? 1 : 0);
564d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        remote()->transact(ON_UID_IDLE_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
574d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
584d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran};
594d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
604d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran// ----------------------------------------------------------------------
614d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
624d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh MahendranIMPLEMENT_META_INTERFACE(UidObserver, "android.app.IUidObserver");
634d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
644d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran// ----------------------------------------------------------------------
654d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
664d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendranstatus_t BnUidObserver::onTransact(
674d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
684d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran{
694d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    switch(code) {
704d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        case ON_UID_GONE_TRANSACTION: {
714d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            CHECK_INTERFACE(IUidObserver, data, reply);
724d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            uid_t uid = data.readInt32();
734d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            bool disabled = data.readInt32() == 1;
744d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            onUidGone(uid, disabled);
754d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            return NO_ERROR;
764d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        } break;
774d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
784d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        case ON_UID_ACTIVE_TRANSACTION: {
794d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            CHECK_INTERFACE(IUidObserver, data, reply);
804d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            uid_t uid = data.readInt32();
814d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            onUidActive(uid);
824d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            return NO_ERROR;
834d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        } break;
844d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
854d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        case ON_UID_IDLE_TRANSACTION: {
864d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            CHECK_INTERFACE(IUidObserver, data, reply);
874d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            uid_t uid = data.readInt32();
884d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            bool disabled = data.readInt32() == 1;
894d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            onUidIdle(uid, disabled);
904d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            return NO_ERROR;
914d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        } break;
924d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran        default:
934d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran            return BBinder::onTransact(code, data, reply, flags);
944d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran    }
954d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran}
964d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran
974d85b8c0a38c14f854af8ff85391b7a8d1170d5bGanesh Mahendran}; // namespace android
98