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#include <binder/AppOpsManager.h> 18913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn#include <binder/Binder.h> 195da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <binder/IServiceManager.h> 205da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 215da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn#include <utils/SystemClock.h> 225da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 235da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornnamespace android { 245da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 255da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornstatic String16 _appops("appops"); 26913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackbornstatic pthread_mutex_t gTokenMutex = PTHREAD_MUTEX_INITIALIZER; 27913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackbornstatic sp<IBinder> gToken; 28913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn 29913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackbornstatic const sp<IBinder>& getToken(const sp<IAppOpsService>& service) { 30913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn pthread_mutex_lock(&gTokenMutex); 31913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn if (gToken == NULL) { 32913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn gToken = service->getToken(new BBinder()); 33913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn } 3420d03805941c75a4489ec2e7ce5a3c021bde09f0Zhijun He pthread_mutex_unlock(&gTokenMutex); 35913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return gToken; 36913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn} 375da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 385da5ca520cca085528588f6067acb1c437001ef2Dianne HackbornAppOpsManager::AppOpsManager() 395da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 405da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 415da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 425da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornsp<IAppOpsService> AppOpsManager::getService() 435da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 445da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn int64_t startTime = 0; 455da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn mLock.lock(); 465da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = mService; 47e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala while (service == NULL || !service->asBinder()->isBinderAlive()) { 48e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala sp<IBinder> binder = defaultServiceManager()->checkService(_appops); 49e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (binder == NULL) { 50e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala // Wait for the app ops service to come back... 51e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala if (startTime == 0) { 52e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala startTime = uptimeMillis(); 53e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala ALOGI("Waiting for app ops service"); 54e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala } else if ((uptimeMillis()-startTime) > 10000) { 55e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala ALOGW("Waiting too long for app ops service, giving up"); 56e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala return NULL; 575da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 58e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala sleep(1); 59e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala } else { 60e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala service = interface_cast<IAppOpsService>(binder); 61e88a85e0d0a25c943e974114557770ba10b81847Eino-Ville Talvala mService = service; 625da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 635da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 645da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn mLock.unlock(); 655da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return service; 665da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 675da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 685da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornint32_t AppOpsManager::checkOp(int32_t op, int32_t uid, const String16& callingPackage) 695da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn{ 705da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 715da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return service != NULL ? service->checkOperation(op, uid, callingPackage) : MODE_IGNORED; 725da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 735da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 745da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornint32_t AppOpsManager::noteOp(int32_t op, int32_t uid, const String16& callingPackage) { 755da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 765da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn return service != NULL ? service->noteOperation(op, uid, callingPackage) : MODE_IGNORED; 775da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 785da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 795da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornint32_t AppOpsManager::startOp(int32_t op, int32_t uid, const String16& callingPackage) { 805da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 81913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn return service != NULL ? service->startOperation(getToken(service), op, uid, callingPackage) 82913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn : MODE_IGNORED; 835da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 845da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 855da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornvoid AppOpsManager::finishOp(int32_t op, int32_t uid, const String16& callingPackage) { 865da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 875da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn if (service != NULL) { 88913b63d235a982174b66acad95ca2f87ac8a1982Dianne Hackborn service->finishOperation(getToken(service), op, uid, callingPackage); 895da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 905da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 915da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 925da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornvoid AppOpsManager::startWatchingMode(int32_t op, const String16& packageName, 935da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn const sp<IAppOpsCallback>& callback) { 945da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 955da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn if (service != NULL) { 965da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn service->startWatchingMode(op, packageName, callback); 975da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 985da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 995da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1005da5ca520cca085528588f6067acb1c437001ef2Dianne Hackbornvoid AppOpsManager::stopWatchingMode(const sp<IAppOpsCallback>& callback) { 1015da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn sp<IAppOpsService> service = getService(); 1025da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn if (service != NULL) { 1035da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn service->stopWatchingMode(callback); 1045da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn } 1055da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn} 1065da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn 1075da5ca520cca085528588f6067acb1c437001ef2Dianne Hackborn}; // namespace android 108