12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- /*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- //#define LOG_NDEBUG 0
- #define LOG_TAG "JWakeLock"
- #include <utils/Log.h>
- #include "JWakeLock.h"
- #include <media/stagefright/foundation/ADebug.h>
- namespace android {
- JWakeLock::JWakeLock(const sp<JObjectHolder> &context) :
- mWakeLockCount(0),
- mWakeLock(NULL),
- mContext(context) {}
- JWakeLock::~JWakeLock() {
- clearJavaWakeLock();
- }
- bool JWakeLock::acquire() {
- if (mWakeLockCount == 0) {
- if (mWakeLock == NULL) {
- JNIEnv *env = JavaVMHelper::getJNIEnv();
- jclass jContextCls = env->FindClass("android/content/Context");
- jclass jPowerManagerCls = env->FindClass("android/os/PowerManager");
- jmethodID jGetSystemService = env->GetMethodID(jContextCls,
- "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
- jobject javaPowerManagerObj = env->CallObjectMethod(mContext->getJObject(),
- jGetSystemService, env->NewStringUTF("power"));
- jfieldID jPARTIAL_WAKE_LOCK = env->GetStaticFieldID(jPowerManagerCls,
- "PARTIAL_WAKE_LOCK", "I");
- jint PARTIAL_WAKE_LOCK = env->GetStaticIntField(jPowerManagerCls, jPARTIAL_WAKE_LOCK);
- jmethodID jNewWakeLock = env->GetMethodID(jPowerManagerCls,
- "newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;");
- jobject javaWakeLock = env->CallObjectMethod(javaPowerManagerObj,
- jNewWakeLock, PARTIAL_WAKE_LOCK, env->NewStringUTF("JWakeLock"));
- mWakeLock = new JObjectHolder(javaWakeLock);
- env->DeleteLocalRef(javaPowerManagerObj);
- env->DeleteLocalRef(javaWakeLock);
- }
- if (mWakeLock != NULL) {
- JNIEnv *env = JavaVMHelper::getJNIEnv();
- jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
- jmethodID jAcquire = env->GetMethodID(wakeLockCls, "acquire", "()V");
- env->CallVoidMethod(mWakeLock->getJObject(), jAcquire);
- mWakeLockCount++;
- return true;
- }
- } else {
- mWakeLockCount++;
- return true;
- }
- return false;
- }
- void JWakeLock::release(bool force) {
- if (mWakeLockCount == 0) {
- return;
- }
- if (force) {
- // Force wakelock release below by setting reference count to 1.
- mWakeLockCount = 1;
- }
- if (--mWakeLockCount == 0) {
- if (mWakeLock != NULL) {
- JNIEnv *env = JavaVMHelper::getJNIEnv();
- jclass wakeLockCls = env->FindClass("android/os/PowerManager$WakeLock");
- jmethodID jRelease = env->GetMethodID(wakeLockCls, "release", "()V");
- env->CallVoidMethod(mWakeLock->getJObject(), jRelease);
- }
- }
- }
- void JWakeLock::clearJavaWakeLock() {
- release(true);
- }
- } // namespace android
|