BatteryNotifier.cpp revision 99e69716215cd0665379bc90d708f2ea8689831d
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