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: 34e2347b7953f70232541bdc1b392230d6231aaeb9Chih-Hung Hsieh explicit 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, 64616554c051842f3700c65197f69b7653883e5794Svet Ganov const String16& packageName, bool startIfModeDefault) { 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); 71616554c051842f3700c65197f69b7653883e5794Svet Ganov data.writeInt32(startIfModeDefault ? 1 : 0); 725da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(START_OPERATION_TRANSACTION, data, &reply); 735da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn // fail on exception 74e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (reply.readExceptionCode() != 0) return MODE_ERRORED; 75e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala return reply.readInt32(); 765da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 775da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 78913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn virtual void finishOperation(const sp<IBinder>& token, int32_t code, int32_t uid, 79913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn const String16& packageName) { 805da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 815da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 82913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeStrongBinder(token); 835da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(code); 845da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(uid); 855da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 865da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(FINISH_OPERATION_TRANSACTION, data, &reply); 875da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 885da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 895da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual void startWatchingMode(int32_t op, const String16& packageName, 905da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn const sp<IAppOpsCallback>& callback) { 915da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 925da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 935da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInt32(op); 945da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeString16(packageName); 952ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen data.writeStrongBinder(IInterface::asBinder(callback)); 965da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(START_WATCHING_MODE_TRANSACTION, data, &reply); 975da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 985da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 995da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn virtual void stopWatchingMode(const sp<IAppOpsCallback>& callback) { 1005da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn Parcel data, reply; 1015da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 1022ea926bda2fa30f3ba8d0ed2d2395a8ada952e6eMarco Nelissen data.writeStrongBinder(IInterface::asBinder(callback)); 1035da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn remote()->transact(STOP_WATCHING_MODE_TRANSACTION, data, &reply); 1045da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 105913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn 106913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn virtual sp<IBinder> getToken(const sp<IBinder>& clientToken) { 107913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn Parcel data, reply; 108913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 109913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn data.writeStrongBinder(clientToken); 110913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn remote()->transact(GET_TOKEN_TRANSACTION, data, &reply); 111913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn // fail on exception 112913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn if (reply.readExceptionCode() != 0) return NULL; 113913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return reply.readStrongBinder(); 114913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn } 115b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 116b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav 117b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav virtual int32_t permissionToOpCode(const String16& permission) { 118b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav Parcel data, reply; 119b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav data.writeInterfaceToken(IAppOpsService::getInterfaceDescriptor()); 120b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav data.writeString16(permission); 121b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav remote()->transact(PERMISSION_TO_OP_CODE_TRANSACTION, data, &reply); 122b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav // fail on exception 123b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav if (reply.readExceptionCode() != 0) return -1; 124b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return reply.readInt32(); 125b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } 1265da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn}; 1275da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1285da5ca520cca085528588f6067acb1c437001ef2Dianne HackbornIMPLEMENT_META_INTERFACE(AppOpsService, "com.android.internal.app.IAppOpsService"); 1295da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1305da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn// ---------------------------------------------------------------------- 1315da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1325da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornstatus_t BnAppOpsService::onTransact( 1335da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 1345da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 1355da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn //printf("AppOpsService received: "); data.print(); 1365da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn switch(code) { 1375da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case CHECK_OPERATION_TRANSACTION: { 1385da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1395da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1405da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1415da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1425da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t res = checkOperation(code, uid, packageName); 1435da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1445da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1455da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1465da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1475da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case NOTE_OPERATION_TRANSACTION: { 1485da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1495da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1505da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1515da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1525da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t res = noteOperation(code, uid, packageName); 1535da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1545da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1555da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1565da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1575da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case START_OPERATION_TRANSACTION: { 1585da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 159913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = data.readStrongBinder(); 1605da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1615da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1625da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 163616554c051842f3700c65197f69b7653883e5794Svet Ganov bool startIfModeDefault = data.readInt32() == 1; 164616554c051842f3700c65197f69b7653883e5794Svet Ganov int32_t res = startOperation(token, code, uid, packageName, startIfModeDefault); 1655da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1665da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeInt32(res); 1675da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1685da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1695da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case FINISH_OPERATION_TRANSACTION: { 1705da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 171913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = data.readStrongBinder(); 1725da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t code = data.readInt32(); 1735da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t uid = data.readInt32(); 1745da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 175913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn finishOperation(token, code, uid, packageName); 1765da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1775da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1785da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1795da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case START_WATCHING_MODE_TRANSACTION: { 1805da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1815da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int32_t op = data.readInt32(); 1825da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn String16 packageName = data.readString16(); 1835da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder()); 1845da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn startWatchingMode(op, packageName, callback); 1855da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1865da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1875da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 1885da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn case STOP_WATCHING_MODE_TRANSACTION: { 1895da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 1905da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsCallback> callback = interface_cast<IAppOpsCallback>(data.readStrongBinder()); 1915da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn stopWatchingMode(callback); 1925da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn reply->writeNoException(); 1935da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return NO_ERROR; 1945da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } break; 195913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn case GET_TOKEN_TRANSACTION: { 196913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn CHECK_INTERFACE(IAppOpsService, data, reply); 197913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> clientToken = data.readStrongBinder(); 198913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn sp<IBinder> token = getToken(clientToken); 199913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn reply->writeNoException(); 200913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn reply->writeStrongBinder(token); 201913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return NO_ERROR; 202913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn } break; 203b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav case PERMISSION_TO_OP_CODE_TRANSACTION: { 204b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav CHECK_INTERFACE(IAppOpsService, data, reply); 205b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav String16 permission = data.readString16(); 206b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav const int32_t opCode = permissionToOpCode(permission); 207b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav reply->writeNoException(); 208b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav reply->writeInt32(opCode); 209b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav return NO_ERROR; 210b412f6e203b38f8047f760261a5e3dc6d0722f08Svetoslav } break; 2115da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn default: 2125da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return BBinder::onTransact(code, data, reply, flags); 2135da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 2145da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 2155da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 2165da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn}; // namespace android 217