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

Commit 913b63d2 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Follow framework change to track started ops by proc.

Change-Id: Ibbce3bf6556f45751c74bab045b46377e56bff9b
parent ba3ed90b
Loading
Loading
Loading
Loading
+7 −3
Original line number Original line Diff line number Diff line
@@ -32,11 +32,14 @@ public:


    virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
    virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
    virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
    virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
    virtual int32_t startOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
    virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
    virtual void finishOperation(int32_t code, int32_t uid, const String16& packageName) = 0;
            const String16& packageName) = 0;
    virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
            const String16& packageName) = 0;
    virtual void startWatchingMode(int32_t op, const String16& packageName,
    virtual void startWatchingMode(int32_t op, const String16& packageName,
            const sp<IAppOpsCallback>& callback) = 0;
            const sp<IAppOpsCallback>& callback) = 0;
    virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) = 0;
    virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) = 0;
    virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) = 0;


    enum {
    enum {
        CHECK_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
        CHECK_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
@@ -44,7 +47,8 @@ public:
        START_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+2,
        START_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+2,
        FINISH_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+3,
        FINISH_OPERATION_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+3,
        START_WATCHING_MODE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+4,
        START_WATCHING_MODE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+4,
        STOP_WATCHING_MODE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+5
        STOP_WATCHING_MODE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+5,
        GET_TOKEN_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION+6,
    };
    };


    enum {
    enum {
+14 −2
Original line number Original line Diff line number Diff line
@@ -15,6 +15,7 @@
 */
 */


#include <binder/AppOpsManager.h>
#include <binder/AppOpsManager.h>
#include <binder/Binder.h>
#include <binder/IServiceManager.h>
#include <binder/IServiceManager.h>


#include <utils/SystemClock.h>
#include <utils/SystemClock.h>
@@ -22,6 +23,16 @@
namespace android {
namespace android {


static String16 _appops("appops");
static String16 _appops("appops");
static pthread_mutex_t gTokenMutex = PTHREAD_MUTEX_INITIALIZER;
static sp<IBinder> gToken;

static const sp<IBinder>& getToken(const sp<IAppOpsService>& service) {
    pthread_mutex_lock(&gTokenMutex);
    if (gToken == NULL) {
        gToken = service->getToken(new BBinder());
    }
    return gToken;
}


AppOpsManager::AppOpsManager()
AppOpsManager::AppOpsManager()
{
{
@@ -66,13 +77,14 @@ int32_t AppOpsManager::noteOp(int32_t op, int32_t uid, const String16& callingPa


int32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) {
int32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) {
    sp<IAppOpsService> service = getService();
    sp<IAppOpsService> service = getService();
    return service != NULL ? service->startOperation(op, uid, callingPackage) : MODE_IGNORED;
    return service != NULL ? service->startOperation(getToken(service), op, uid, callingPackage)
            : MODE_IGNORED;
}
}


void AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) {
void AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) {
    sp<IAppOpsService> service = getService();
    sp<IAppOpsService> service = getService();
    if (service != NULL) {
    if (service != NULL) {
        service->finishOperation(op, uid, callingPackage);
        service->finishOperation(getToken(service), op, uid, callingPackage);
    }
    }
}
}


+28 −4
Original line number Original line Diff line number Diff line
@@ -61,9 +61,11 @@ public:
        return reply.readInt32();
        return reply.readInt32();
    }
    }


    virtual int32_t startOperation(int32_t code, int32_t uid, const String16& packageName) {
    virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
                const String16& packageName) {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
        data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
        data.writeStrongBinder(token);
        data.writeInt32(code);
        data.writeInt32(code);
        data.writeInt32(uid);
        data.writeInt32(uid);
        data.writeString16(packageName);
        data.writeString16(packageName);
@@ -73,9 +75,11 @@ public:
        return reply.readInt32();
        return reply.readInt32();
    }
    }


    virtual void finishOperation(int32_t code, int32_t uid, const String16& packageName) {
    virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid,
            const String16& packageName) {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
        data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
        data.writeStrongBinder(token);
        data.writeInt32(code);
        data.writeInt32(code);
        data.writeInt32(uid);
        data.writeInt32(uid);
        data.writeString16(packageName);
        data.writeString16(packageName);
@@ -98,6 +102,16 @@ public:
        data.writeStrongBinder(callback->asBinder());
        data.writeStrongBinder(callback->asBinder());
        remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
        remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply);
    }
    }

    virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) {
        Parcel data, reply;
        data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor());
        data.writeStrongBinder(clientToken);
        remote()->transact(GET_TOKEN_TRANSACTION, data, &reply);
        // fail on exception
        if (reply.readExceptionCode() != 0) return NULL;
        return reply.readStrongBinder();
    }
};
};


IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
IMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService");
@@ -131,20 +145,22 @@ status_t BnAppOpsService::onTransact(
        } break;
        } break;
        case START_OPERATION_TRANSACTION: {
        case START_OPERATION_TRANSACTION: {
            CHECK_INTERFACE(IAppOpsService, data, reply);
            CHECK_INTERFACE(IAppOpsService, data, reply);
            sp<IBinder> token = data.readStrongBinder();
            int32_t code = data.readInt32();
            int32_t code = data.readInt32();
            int32_t uid = data.readInt32();
            int32_t uid = data.readInt32();
            String16 packageName = data.readString16();
            String16 packageName = data.readString16();
            int32_t res = startOperation(code, uid, packageName);
            int32_t res = startOperation(token, code, uid, packageName);
            reply->writeNoException();
            reply->writeNoException();
            reply->writeInt32(res);
            reply->writeInt32(res);
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case FINISH_OPERATION_TRANSACTION: {
        case FINISH_OPERATION_TRANSACTION: {
            CHECK_INTERFACE(IAppOpsService, data, reply);
            CHECK_INTERFACE(IAppOpsService, data, reply);
            sp<IBinder> token = data.readStrongBinder();
            int32_t code = data.readInt32();
            int32_t code = data.readInt32();
            int32_t uid = data.readInt32();
            int32_t uid = data.readInt32();
            String16 packageName = data.readString16();
            String16 packageName = data.readString16();
            finishOperation(code, uid, packageName);
            finishOperation(token, code, uid, packageName);
            reply->writeNoException();
            reply->writeNoException();
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
@@ -164,6 +180,14 @@ status_t BnAppOpsService::onTransact(
            reply->writeNoException();
            reply->writeNoException();
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case GET_TOKEN_TRANSACTION: {
            CHECK_INTERFACE(IAppOpsService, data, reply);
            sp<IBinder> clientToken = data.readStrongBinder();
            sp<IBinder> token = getToken(clientToken);
            reply->writeNoException();
            reply->writeStrongBinder(token);
            return NO_ERROR;
        } break;
        default:
        default:
            return BBinder::onTransact(code, data, reply, flags);
            return BBinder::onTransact(code, data, reply, flags);
    }
    }