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 17dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen#define LOG_TAG "BatteryNotifier" 18dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen//#define LOG_NDEBUG 0 19dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen 2099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include "include/mediautils/BatteryNotifier.h" 2199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <binder/IServiceManager.h> 2399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <utils/Log.h> 2499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk#include <private/android_filesystem_config.h> 2599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2699e69716215cd0665379bc90d708f2ea8689831dRuben Brunknamespace android { 2799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 2899e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::DeathNotifier::binderDied(const wp<IBinder>& /*who*/) { 2999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk BatteryNotifier::getInstance().onBatteryStatServiceDied(); 3099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 3199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 3299e69716215cd0665379bc90d708f2ea8689831dRuben BrunkBatteryNotifier::BatteryNotifier() : mVideoRefCount(0), mAudioRefCount(0) {} 3399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 3499e69716215cd0665379bc90d708f2ea8689831dRuben BrunkBatteryNotifier::~BatteryNotifier() { 3599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 3699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mDeathNotifier != nullptr) { 3799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk IInterface::asBinder(mBatteryStatService)->unlinkToDeath(mDeathNotifier); 3899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 3999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 4099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 4199e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartVideo() { 4299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 4399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 4499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0 && batteryService != nullptr) { 4599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStartVideo(AID_MEDIA); 4699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 4799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount++; 4899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 4999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 5099e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopVideo() { 5199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 5299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0) { 5399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk ALOGW("%s: video refcount is broken.", __FUNCTION__); 5499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return; 5599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 5699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 5799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 5899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 5999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount--; 6099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount == 0 && batteryService != nullptr) { 6199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStopVideo(AID_MEDIA); 6299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 6399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 6499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 6599e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetVideo() { 6699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 6799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 6899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mVideoRefCount = 0; 6999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 70dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen batteryService->noteResetVideo(); 7199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 7299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 7399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 7499e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartAudio() { 7599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 7699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 7799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0 && batteryService != nullptr) { 78dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen batteryService->noteStartAudio(AID_AUDIOSERVER); 7999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 8099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount++; 8199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 8299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 8399e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopAudio() { 8499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 8599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0) { 8699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk ALOGW("%s: audio refcount is broken.", __FUNCTION__); 8799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return; 8899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 8999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 9099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 9199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 9299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount--; 9399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount == 0 && batteryService != nullptr) { 94dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen batteryService->noteStopAudio(AID_AUDIOSERVER); 9599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 9699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 9799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 9899e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetAudio() { 9999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 10099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 10199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mAudioRefCount = 0; 10299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 10399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetAudio(); 10499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 10599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 10699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 10799e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteFlashlightOn(const String8& id, int uid) { 10899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 10999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 11099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 11199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 11299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (!mFlashlightState[k]) { 11399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState[k] = true; 11499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 11599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteFlashlightOn(uid); 11699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 11799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 11899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 11999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 12099e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteFlashlightOff(const String8& id, int uid) { 12199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 12299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 12399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 12499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 12599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mFlashlightState[k]) { 12699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState[k] = false; 12799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 12899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteFlashlightOff(uid); 12999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 13099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 13199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 13299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 13399e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetFlashlight() { 13499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 13599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 13699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mFlashlightState.clear(); 13799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 13899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetFlashlight(); 13999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 14099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 14199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 14299e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStartCamera(const String8& id, int uid) { 14399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 14499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 14599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 14699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (!mCameraState[k]) { 14799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState[k] = true; 14899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 14999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStartCamera(uid); 15099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 15199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 15299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 15399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 15499e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteStopCamera(const String8& id, int uid) { 15599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 15699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 15799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk std::pair<String8, int> k = std::make_pair(id, uid); 15899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mCameraState[k]) { 15999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState[k] = false; 16099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 16199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteStopCamera(uid); 16299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 16399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 16499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 16599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 16699e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::noteResetCamera() { 16799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 16899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk sp<IBatteryStats> batteryService = getBatteryService_l(); 16999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mCameraState.clear(); 17099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (batteryService != nullptr) { 17199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk batteryService->noteResetCamera(); 17299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 17399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 17499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 17599e69716215cd0665379bc90d708f2ea8689831dRuben Brunkvoid BatteryNotifier::onBatteryStatServiceDied() { 17699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk Mutex::Autolock _l(mLock); 17799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService.clear(); 17899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mDeathNotifier.clear(); 17999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // Do not reset mVideoRefCount and mAudioRefCount here. The ref 18099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // counting is independent of the battery service availability. 18199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // We need this if battery service becomes available after media 18299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // started. 18399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 18499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 18599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 18699e69716215cd0665379bc90d708f2ea8689831dRuben Brunksp<IBatteryStats> BatteryNotifier::getBatteryService_l() { 18799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mBatteryStatService != nullptr) { 18899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return mBatteryStatService; 18999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 19099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk // Get battery service from service manager 19199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const sp<IServiceManager> sm(defaultServiceManager()); 19299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (sm != nullptr) { 19399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk const String16 name("batterystats"); 19499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService = interface_cast<IBatteryStats>(sm->checkService(name)); 19599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mBatteryStatService == nullptr) { 196dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // this may occur normally during the init sequence as mediaserver 197dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // and audioserver start before the batterystats service is available. 198dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen ALOGW("batterystats service unavailable!"); 19999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return nullptr; 20099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 20199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 20299e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mDeathNotifier = new DeathNotifier(); 20399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk IInterface::asBinder(mBatteryStatService)->linkToDeath(mDeathNotifier); 20499e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 205dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // Notify start now if mediaserver or audioserver is already started. 206dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // 1) mediaserver and audioserver is started before batterystats service 207dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // 2) batterystats server may have crashed. 20899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mVideoRefCount > 0) { 20999e69716215cd0665379bc90d708f2ea8689831dRuben Brunk mBatteryStatService->noteStartVideo(AID_MEDIA); 21099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 21199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk if (mAudioRefCount > 0) { 212dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen mBatteryStatService->noteStartAudio(AID_AUDIOSERVER); 21399e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 214dcb346b7dc5b88c3e85db8a70bbd6a2fee8192b9Marco Nelissen // TODO: Notify for camera and flashlight state as well? 21599e69716215cd0665379bc90d708f2ea8689831dRuben Brunk } 21699e69716215cd0665379bc90d708f2ea8689831dRuben Brunk return mBatteryStatService; 21799e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} 21899e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 21999e69716215cd0665379bc90d708f2ea8689831dRuben BrunkANDROID_SINGLETON_STATIC_INSTANCE(BatteryNotifier); 22099e69716215cd0665379bc90d708f2ea8689831dRuben Brunk 22199e69716215cd0665379bc90d708f2ea8689831dRuben Brunk} // namespace android 222