15da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn/* 25da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * Copyright (C) 2013 The Android Open Source Project 35da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * 45da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 55da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * you may not use this file except in compliance with the License. 65da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * You may obtain a copy of the License at 75da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * 85da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 95da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * 105da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 115da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 125da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * See the License for the specific language governing permissions and 145da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn * limitations under the License. 155da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn */ 165da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 175da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#define LOG_TAG "AppOpsService" 185da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 195da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <binder/IAppOpsService.h> 205da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 215da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <utils/Log.h> 225da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <binder/Parcel.h> 235da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <utils/String8.h> 245da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 255da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <private/binder/Static.h> 265da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 275da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornnamespace android { 285da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 295da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn// ---------------------------------------------------------------------- 305da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 315da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornclass BpAppOpsService : public BpInterface<IAppOpsService> 325da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 335da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornpublic: 345da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn BpAppOpsService(const sp<IBinder>& impl) 355da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn : BpInterface<IAppOpsService>(impl) 365da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn { 375da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 385da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 395da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual int32_t checkOperation(int32_t code, int32_t uid, const String16& packageName) { 405da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 415da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 425da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(code); 435da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(uid); 445da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 455da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(CHECK_OPERATION_TRANSACTION, data, &reply); 465da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn // fail on exception 47e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (reply.readExceptionCode() != 0) return MODE_ERRORED; 48e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala return reply.readInt32(); 495da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 505da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 515da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual int32_t noteOperation(int32_t code, int32_t uid, const String16& packageName) { 525da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 535da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 545da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(code); 555da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(uid); 565da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 575da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(NOTE_OPERATION_TRANSACTION, data, &reply); 585da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn // fail on exception 59e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (reply.readExceptionCode() != 0) return MODE_ERRORED; 60e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala return reply.readInt32(); 615da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 625da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 63913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn virtual int32_t startOperation(const sp<IBinder>& token, int32_t code, int32_t uid, 64913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn const String16& packageName) { 655da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 665da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 67913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeStrongBinder(token); 685da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(code); 695da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(uid); 705da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 715da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(START_OPERATION_TRANSACTION, data, &reply); 725da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn // fail on exception 73e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (reply.readExceptionCode() != 0) return MODE_ERRORED; 74e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala return reply.readInt32(); 755da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 765da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 77913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid, 78913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn const String16& packageName) { 795da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 805da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 81913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeStrongBinder(token); 825da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(code); 835da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(uid); 845da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 855da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply); 865da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 875da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 885da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual void startWatchingMode(int32_t op, const String16& packageName, 895da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn const sp<IAppOpsCallback>& callback) { 905da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 915da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 925da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(op); 935da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 945da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeStrongBinder(callback->asBinder()); 955da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply); 965da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 975da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 985da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) { 995da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 1005da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 1015da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeStrongBinder(callback->asBinder()); 1025da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply); 1035da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 104913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn 105913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) { 106913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn Parcel data, reply; 107913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 108913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeStrongBinder(clientToken); 109913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn remote()->transact(GET_TOKEN_TRANSACTION, data, &reply); 110913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn // fail on exception 111913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn if (reply.readExceptionCode() != 0) return NULL; 112913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return reply.readStrongBinder(); 113913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn } 1145da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn}; 1155da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1165da5ca520cca085528588f6067acb1c437001ef2Dianne HackbornIMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService"); 1175da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1185da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn// ---------------------------------------------------------------------- 1195da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1205da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornstatus_t BnAppOpsService::onTransact( 1215da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1225da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 1235da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn //printf("AppOpsService received: "); data.print(); 1245da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn switch(code) { 1255da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case CHECK_OPERATION_TRANSACTION: { 1265da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1275da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1285da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1295da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1305da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t res = checkOperation(code, uid, packageName); 1315da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1325da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1335da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1345da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1355da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case NOTE_OPERATION_TRANSACTION: { 1365da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1375da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1385da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1395da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1405da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t res = noteOperation(code, uid, packageName); 1415da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1425da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1435da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1445da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1455da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case START_OPERATION_TRANSACTION: { 1465da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 147913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = data.readStrongBinder(); 1485da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1495da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1505da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 151913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn int32_t res = startOperation(token, code, uid, packageName); 1525da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1535da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1545da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1555da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1565da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case FINISH_OPERATION_TRANSACTION: { 1575da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 158913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = data.readStrongBinder(); 1595da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1605da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1615da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 162913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn finishOperation(token, code, uid, packageName); 1635da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1645da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1655da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1665da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case START_WATCHING_MODE_TRANSACTION: { 1675da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1685da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t op = data.readInt32(); 1695da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1705da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder()); 1715da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn startWatchingMode(op, packageName, callback); 1725da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1735da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1745da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1755da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case STOP_WATCHING_MODE_TRANSACTION: { 1765da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1775da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder()); 1785da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn stopWatchingMode(callback); 1795da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1805da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1815da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 182913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn case GET_TOKEN_TRANSACTION: { 183913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 184913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> clientToken = data.readStrongBinder(); 185913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = getToken(clientToken); 186913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn reply->writeNoException(); 187913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn reply->writeStrongBinder(token); 188913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return NO_ERROR; 189913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn } break; 1905da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn default: 1915da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return BBinder::onTransact(code, data, reply, flags); 1925da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 1935da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 1945da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1955da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn}; // namespace android 196