199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk/* 299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * Copyright 2015, The Android Open Source Project 399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * 499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * Licensed under the Apache License, Version 2.0 (the "License"); 599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * you may not use this file except in compliance with the License. 699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * You may obtain a copy of the License at 799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * 899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * http://www.apache.org/licenses/LICENSE-2.0 999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * 1099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * Unless required by applicable law or agreed to in writing, software 1199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * distributed under the License is distributed on an "AS IS" BASIS, 1299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * See the License for the specific language governing permissions and 1499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk * limitations under the License. 1599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk */ 1699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 1799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include "include/mediautils/BatteryNotifier.h" 1899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 1999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <binder/IServiceManager.h> 2099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <utils/Log.h> 2199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <private/android_filesystem_config.h> 2299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2399e69716215cd0665379bc90d708f2ea8689831dRuben Brunknamespace android { 2499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2599e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::DeathNotifier::binderDied(const wp<IBinder>& /*who*/) { 2699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk BatteryNotifier::getInstance().onBatteryStatServiceDied(); 2799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 2899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2999e69716215cd0665379bc90d708f2ea8689831dRuben BrunkBatteryNotifier::BatteryNotifier() : mVideoRefCount(0), mAudioRefCount(0) {} 3099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 3199e69716215cd0665379bc90d708f2ea8689831dRuben BrunkBatteryNotifier::~BatteryNotifier() { 3299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 3399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mDeathNotifier != nullptr) { 3499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk IInterface::asBinder(mBatteryStatService)->unlinkToDeath(mDeathNotifier); 3599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 3699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 3799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 3899e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartVideo() { 3999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 4099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 4199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0 && batteryService != nullptr) { 4299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStartVideo(AID_MEDIA); 4399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 4499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount++; 4599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 4699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 4799e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopVideo() { 4899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 4999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0) { 5099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk ALOGW("%s: video refcount is broken.", __FUNCTION__); 5199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return; 5299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 5399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 5499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 5599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 5699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount--; 5799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0 && batteryService != nullptr) { 5899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStopVideo(AID_MEDIA); 5999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 6099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 6199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 6299e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetVideo() { 6399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 6499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 6599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount = 0; 6699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 6799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetAudio(); 6899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 6999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 7099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 7199e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartAudio() { 7299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 7399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 7499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0 && batteryService != nullptr) { 7599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStartAudio(AID_MEDIA); 7699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 7799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount++; 7899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 7999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 8099e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopAudio() { 8199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 8299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0) { 8399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk ALOGW("%s: audio refcount is broken.", __FUNCTION__); 8499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return; 8599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 8699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 8799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 8899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 8999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount--; 9099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0 && batteryService != nullptr) { 9199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStopAudio(AID_MEDIA); 9299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 9399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 9499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 9599e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetAudio() { 9699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 9799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 9899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount = 0; 9999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 10099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetAudio(); 10199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 10299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 10399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 10499e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteFlashlightOn(const String8& id, int uid) { 10599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 10699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 10799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 10899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 10999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (!mFlashlightState[k]) { 11099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState[k] = true; 11199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 11299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteFlashlightOn(uid); 11399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 11499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 11599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 11699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 11799e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteFlashlightOff(const String8& id, int uid) { 11899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 11999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 12099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 12199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 12299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mFlashlightState[k]) { 12399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState[k] = false; 12499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 12599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteFlashlightOff(uid); 12699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 12799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 12899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 12999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 13099e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetFlashlight() { 13199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 13299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 13399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState.clear(); 13499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 13599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetFlashlight(); 13699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 13799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 13899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 13999e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartCamera(const String8& id, int uid) { 14099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 14199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 14299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 14399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (!mCameraState[k]) { 14499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState[k] = true; 14599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 14699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStartCamera(uid); 14799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 14899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 14999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 15099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 15199e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopCamera(const String8& id, int uid) { 15299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 15399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 15499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 15599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mCameraState[k]) { 15699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState[k] = false; 15799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 15899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStopCamera(uid); 15999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 16099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 16199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 16299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 16399e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetCamera() { 16499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 16599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 16699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState.clear(); 16799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 16899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetCamera(); 16999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 17099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 17199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 17299e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::onBatteryStatServiceDied() { 17399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 17499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService.clear(); 17599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mDeathNotifier.clear(); 17699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // Do not reset mVideoRefCount and mAudioRefCount here. The ref 17799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // counting is independent of the battery service availability. 17899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // We need this if battery service becomes available after media 17999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // started. 18099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 18199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 18299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 18399e69716215cd0665379bc90d708f2ea8689831dRuben Brunksp<IBatteryStats> BatteryNotifier::getBatteryService_l() { 18499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mBatteryStatService != nullptr) { 18599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return mBatteryStatService; 18699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 18799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // Get battery service from service manager 18899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const sp<IServiceManager> sm(defaultServiceManager()); 18999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (sm != nullptr) { 19099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const String16 name("batterystats"); 19199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService = interface_cast<IBatteryStats>(sm->checkService(name)); 19299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mBatteryStatService == nullptr) { 19399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk ALOGE("batterystats service unavailable!"); 19499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return nullptr; 19599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 19699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 19799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mDeathNotifier = new DeathNotifier(); 19899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk IInterface::asBinder(mBatteryStatService)->linkToDeath(mDeathNotifier); 19999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 20099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // Notify start now if media already started 20199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount > 0) { 20299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService->noteStartVideo(AID_MEDIA); 20399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 20499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount > 0) { 20599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService->noteStartAudio(AID_MEDIA); 20699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 20799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 20899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return mBatteryStatService; 20999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 21099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 21199e69716215cd0665379bc90d708f2ea8689831dRuben BrunkANDROID_SINGLETON_STATIC_INSTANCE(BatteryNotifier); 21299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 21399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} // namespace android 214