Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 63ff1c64 authored by Mike Lockwood's avatar Mike Lockwood
Browse files

Cleanup Binder interface between sensorservice and BatteryStats

Change-Id: Ia507160a2534059afe93849c8efc8407a046b50e
parent b5e47621
Loading
Loading
Loading
Loading
+55 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_IBATTERYSTATS_H
#define ANDROID_IBATTERYSTATS_H

#include <binder/IInterface.h>

namespace android {

// ----------------------------------------------------------------------

class IBatteryStats : public IInterface
{
public:
    DECLARE_META_INTERFACE(BatteryStats);

    virtual void noteStartSensor(int uid, int sensor) = 0;
    virtual void noteStopSensor(int uid, int sensor) = 0;

    enum {
        NOTE_START_SENSOR_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
        NOTE_STOP_SENSOR_TRANSACTION,
    };
};

// ----------------------------------------------------------------------

class BnBatteryStats : public BnInterface<IBatteryStats>
{
public:
    virtual status_t    onTransact( uint32_t code,
                                    const Parcel& data,
                                    Parcel* reply,
                                    uint32_t flags = 0);
};

// ----------------------------------------------------------------------

}; // namespace android

#endif // ANDROID_IBATTERYSTATS_H
+1 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ sources := \
    Debug.cpp \
    IAppOpsCallback.cpp \
    IAppOpsService.cpp \
    IBatteryStats.cpp \
    IInterface.cpp \
    IMemory.cpp \
    IPCThreadState.cpp \
+84 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <binder/IBatteryStats.h>

#include <utils/Debug.h>
#include <utils/Log.h>
#include <binder/Parcel.h>
#include <utils/String8.h>

#include <private/binder/Static.h>

namespace android {

// ----------------------------------------------------------------------

class BpBatteryStats : public BpInterface<IBatteryStats>
{
public:
    BpBatteryStats(const sp<IBinder>& impl)
        : BpInterface<IBatteryStats>(impl)
    {
    }

    virtual void noteStartSensor(int uid, int sensor) {
        Parcel data, reply;
        data.writeInterfaceToken(IBatteryStats::getInterfaceDescriptor());
        data.writeInt32(uid);
        data.writeInt32(sensor);
        remote()->transact(NOTE_START_SENSOR_TRANSACTION, data, &reply);
    }

    virtual void noteStopSensor(int uid, int sensor) {
        Parcel data, reply;
        data.writeInterfaceToken(IBatteryStats::getInterfaceDescriptor());
        data.writeInt32(uid);
        data.writeInt32(sensor);
        remote()->transact(NOTE_STOP_SENSOR_TRANSACTION, data, &reply);
    }
};

IMPLEMENT_META_INTERFACE(BatteryStats, "com.android.internal.app.IBatteryStats");

// ----------------------------------------------------------------------

status_t BnBatteryStats::onTransact(
    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
{
    switch(code) {
        case NOTE_START_SENSOR_TRANSACTION: {
            CHECK_INTERFACE(IBatteryStats, data, reply);
            int uid = data.readInt32();
            int sensor = data.readInt32();
            noteStartSensor(uid, sensor);
            reply->writeNoException();
            return NO_ERROR;
        } break;
        case NOTE_STOP_SENSOR_TRANSACTION: {
            CHECK_INTERFACE(IBatteryStats, data, reply);
            int uid = data.readInt32();
            int sensor = data.readInt32();
            noteStopSensor(uid, sensor);
            reply->writeNoException();
            return NO_ERROR;
        } break;
        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
}

}; // namespace android
+4 −28
Original line number Diff line number Diff line
@@ -34,32 +34,10 @@ BatteryService::BatteryService() {
    const sp<IServiceManager> sm(defaultServiceManager());
    if (sm != NULL) {
        const String16 name("batterystats");
        mBatteryStatService = sm->getService(name);
        mBatteryStatService = interface_cast<IBatteryStats>(sm->getService(name));
    }
}

status_t BatteryService::noteStartSensor(int uid, int handle) {
    Parcel data, reply;
    data.writeInterfaceToken(DESCRIPTOR);
    data.writeInt32(uid);
    data.writeInt32(handle);
    status_t err = mBatteryStatService->transact(
            TRANSACTION_noteStartSensor, data, &reply, 0);
    err = reply.readExceptionCode();
    return err;
}

status_t BatteryService::noteStopSensor(int uid, int handle) {
    Parcel data, reply;
    data.writeInterfaceToken(DESCRIPTOR);
    data.writeInt32(uid);
    data.writeInt32(handle);
    status_t err = mBatteryStatService->transact(
            TRANSACTION_noteStopSensor, data, &reply, 0);
    err = reply.readExceptionCode();
    return err;
}

bool BatteryService::addSensor(uid_t uid, int handle) {
    Mutex::Autolock _l(mActivationsLock);
    Info key(uid, handle);
@@ -86,7 +64,7 @@ void BatteryService::enableSensorImpl(uid_t uid, int handle) {
    if (mBatteryStatService != 0) {
        if (addSensor(uid, handle)) {
            int64_t identity = IPCThreadState::self()->clearCallingIdentity();
            noteStartSensor(uid, handle);
            mBatteryStatService->noteStartSensor(uid, handle);
            IPCThreadState::self()->restoreCallingIdentity(identity);
        }
    }
@@ -95,7 +73,7 @@ void BatteryService::disableSensorImpl(uid_t uid, int handle) {
    if (mBatteryStatService != 0) {
        if (removeSensor(uid, handle)) {
            int64_t identity = IPCThreadState::self()->clearCallingIdentity();
            noteStopSensor(uid, handle);
            mBatteryStatService->noteStopSensor(uid, handle);
            IPCThreadState::self()->restoreCallingIdentity(identity);
        }
    }
@@ -108,7 +86,7 @@ void BatteryService::cleanupImpl(uid_t uid) {
        for (ssize_t i=0 ; i<mActivations.size() ; i++) {
            const Info& info(mActivations[i]);
            if (info.uid == uid) {
                noteStopSensor(info.uid, info.handle);
                mBatteryStatService->noteStopSensor(info.uid, info.handle);
                mActivations.removeAt(i);
                i--;
            }
@@ -117,8 +95,6 @@ void BatteryService::cleanupImpl(uid_t uid) {
    }
}

const String16 BatteryService::DESCRIPTOR("com.android.internal.app.IBatteryStats");

ANDROID_SINGLETON_STATIC_INSTANCE(BatteryService)

// ---------------------------------------------------------------------------
+2 −6
Original line number Diff line number Diff line
@@ -17,22 +17,18 @@
#include <stdint.h>
#include <sys/types.h>

#include <binder/IBatteryStats.h>
#include <utils/Singleton.h>

namespace android {
// ---------------------------------------------------------------------------

class BatteryService : public Singleton<BatteryService> {
    static const int TRANSACTION_noteStartSensor = IBinder::FIRST_CALL_TRANSACTION + 3;
    static const int TRANSACTION_noteStopSensor = IBinder::FIRST_CALL_TRANSACTION + 4;
    static const String16 DESCRIPTOR;

    friend class Singleton<BatteryService>;
    sp<IBinder> mBatteryStatService;
    sp<IBatteryStats> mBatteryStatService;

    BatteryService();
    status_t noteStartSensor(int uid, int handle);
    status_t noteStopSensor(int uid, int handle);

    void enableSensorImpl(uid_t uid, int handle);
    void disableSensorImpl(uid_t uid, int handle);