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