blob: 983d77e05a673f6d10f1498792d38de0e9dca807 [file] [log] [blame]
Wei Jia53692fa2017-12-11 10:33:46 -08001/*
2 * Copyright 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17//#define LOG_NDEBUG 0
18#define LOG_TAG "JWakeLock"
19#include <utils/Log.h>
20
21#include "JWakeLock.h"
22
Wei Jia53692fa2017-12-11 10:33:46 -080023#include <media/stagefright/foundation/ADebug.h>
Wei Jia53692fa2017-12-11 10:33:46 -080024
25namespace android {
26
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080027JWakeLock::JWakeLock(const sp<JObjectHolder> &context) :
Wei Jia53692fa2017-12-11 10:33:46 -080028 mWakeLockCount(0),
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080029 mWakeLock(NULL),
30 mContext(context) {}
Wei Jia53692fa2017-12-11 10:33:46 -080031
32JWakeLock::~JWakeLock() {
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080033 clearJavaWakeLock();
Wei Jia53692fa2017-12-11 10:33:46 -080034}
35
36bool JWakeLock::acquire() {
37 if (mWakeLockCount == 0) {
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080038 if (mWakeLock == NULL) {
39 JNIEnv *env = JavaVMHelper::getJNIEnv();
40 jclass jContextCls = env->FindClass("android/content/Context");
41 jclass jPowerManagerCls = env->FindClass("android/os/PowerManager");
42
43 jmethodID jGetSystemService = env->GetMethodID(jContextCls,
44 "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
45 jobject javaPowerManagerObj = env->CallObjectMethod(mContext->getJObject(),
46 jGetSystemService, env->NewStringUTF("power"));
47
48 jfieldID jPARTIAL_WAKE_LOCK = env->GetStaticFieldID(jPowerManagerCls,
49 "PARTIAL_WAKE_LOCK", "I");
50 jint PARTIAL_WAKE_LOCK = env->GetStaticIntField(jPowerManagerCls, jPARTIAL_WAKE_LOCK);
51
52 jmethodID jNewWakeLock = env->GetMethodID(jPowerManagerCls,
53 "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;");
54 jobject javaWakeLock = env->CallObjectMethod(javaPowerManagerObj,
55 jNewWakeLock, PARTIAL_WAKE_LOCK, env->NewStringUTF("JWakeLock"));
56 mWakeLock = new JObjectHolder(javaWakeLock);
57 env->DeleteLocalRef(javaPowerManagerObj);
58 env->DeleteLocalRef(javaWakeLock);
Wei Jia53692fa2017-12-11 10:33:46 -080059 }
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080060 if (mWakeLock != NULL) {
61 JNIEnv *env = JavaVMHelper::getJNIEnv();
62 jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
63 jmethodID jAcquire = env->GetMethodID(wakeLockCls, "acquire", "()V");
64 env->CallVoidMethod(mWakeLock->getJObject(), jAcquire);
65 mWakeLockCount++;
66 return true;
Wei Jia53692fa2017-12-11 10:33:46 -080067 }
68 } else {
69 mWakeLockCount++;
70 return true;
71 }
72 return false;
73}
74
75void JWakeLock::release(bool force) {
76 if (mWakeLockCount == 0) {
77 return;
78 }
79 if (force) {
80 // Force wakelock release below by setting reference count to 1.
81 mWakeLockCount = 1;
82 }
83 if (--mWakeLockCount == 0) {
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080084 if (mWakeLock != NULL) {
85 JNIEnv *env = JavaVMHelper::getJNIEnv();
86 jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
87 jmethodID jRelease = env->GetMethodID(wakeLockCls, "release", "()V");
88 env->CallVoidMethod(mWakeLock->getJObject(), jRelease);
Wei Jia53692fa2017-12-11 10:33:46 -080089 }
Wei Jia53692fa2017-12-11 10:33:46 -080090 }
91}
92
Dichen Zhangfc9f40f2019-01-04 14:15:28 -080093void JWakeLock::clearJavaWakeLock() {
Wei Jia53692fa2017-12-11 10:33:46 -080094 release(true);
Wei Jia53692fa2017-12-11 10:33:46 -080095}
96
97} // namespace android