153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia/*
253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Copyright 2017 The Android Open Source Project
353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Licensed under the Apache License, Version 2.0 (the "License");
553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * you may not use this file except in compliance with the License.
653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * You may obtain a copy of the License at
753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *      http://www.apache.org/licenses/LICENSE-2.0
953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia *
1053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * Unless required by applicable law or agreed to in writing, software
1153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * distributed under the License is distributed on an "AS IS" BASIS,
1253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * See the License for the specific language governing permissions and
1453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia * limitations under the License.
1553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia */
1653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
1753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//#define LOG_NDEBUG 0
1853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#define LOG_TAG "JWakeLock"
1953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <utils/Log.h>
2053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include "JWakeLock.h"
2253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <binder/IPCThreadState.h>
2453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <binder/IServiceManager.h>
2553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <media/stagefright/foundation/ADebug.h>
2653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia#include <powermanager/PowerManager.h>
2753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
2953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jianamespace android {
3053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia//TODO: use JAVA PowerManager, instead of binder
3253692fa54d0bf1d69184035a4c05ea0601a09c14Wei JiaJWakeLock::JWakeLock() :
3353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mPowerManager(NULL),
3453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mWakeLockToken(NULL),
3553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mWakeLockCount(0),
3653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mDeathRecipient(new PMDeathRecipient(this)) {}
3753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
3853692fa54d0bf1d69184035a4c05ea0601a09c14Wei JiaJWakeLock::~JWakeLock() {
3953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (mPowerManager != NULL) {
4053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        sp<IBinder> binder = IInterface::asBinder(mPowerManager);
4153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        binder->unlinkToDeath(mDeathRecipient);
4253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
4353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    clearPowerManager();
4453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}
4553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
4653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiabool JWakeLock::acquire() {
4753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (mWakeLockCount == 0) {
4853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        CHECK(mWakeLockToken == NULL);
4953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        if (mPowerManager == NULL) {
5053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            // use checkService() to avoid blocking if power service is not up yet
5153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            sp<IBinder> binder =
5253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                defaultServiceManager()->checkService(String16("power"));
5353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            if (binder == NULL) {
5453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                ALOGW("could not get the power manager service");
5553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            } else {
5653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                mPowerManager = interface_cast<IPowerManager>(binder);
5753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                binder->linkToDeath(mDeathRecipient);
5853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            }
5953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        }
6053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        if (mPowerManager != NULL) {
6153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            sp<IBinder> binder = new BBinder();
6253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int64_t token = IPCThreadState::self()->clearCallingIdentity();
6353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            status_t status = mPowerManager->acquireWakeLock(
6453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                    POWERMANAGER_PARTIAL_WAKE_LOCK,
6553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                    binder, String16("JWakeLock"), String16("media"));
6653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            IPCThreadState::self()->restoreCallingIdentity(token);
6753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            if (status == NO_ERROR) {
6853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                mWakeLockToken = binder;
6953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                mWakeLockCount++;
7053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia                return true;
7153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            }
7253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        }
7353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    } else {
7453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        mWakeLockCount++;
7553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        return true;
7653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
7753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    return false;
7853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}
7953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
8053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::release(bool force) {
8153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (mWakeLockCount == 0) {
8253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        return;
8353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
8453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (force) {
8553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        // Force wakelock release below by setting reference count to 1.
8653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        mWakeLockCount = 1;
8753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
8853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (--mWakeLockCount == 0) {
8953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        CHECK(mWakeLockToken != NULL);
9053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        if (mPowerManager != NULL) {
9153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            int64_t token = IPCThreadState::self()->clearCallingIdentity();
9253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            mPowerManager->releaseWakeLock(mWakeLockToken, 0 /* flags */);
9353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia            IPCThreadState::self()->restoreCallingIdentity(token);
9453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        }
9553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        mWakeLockToken.clear();
9653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
9753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}
9853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
9953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::clearPowerManager() {
10053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    release(true);
10153692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    mPowerManager.clear();
10253692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}
10353692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
10453692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jiavoid JWakeLock::PMDeathRecipient::binderDied(const wp<IBinder>& who __unused) {
10553692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    if (mWakeLock != NULL) {
10653692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia        mWakeLock->clearPowerManager();
10753692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia    }
10853692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}
10953692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia
11053692fa54d0bf1d69184035a4c05ea0601a09c14Wei Jia}  // namespace android
111