Do not delete/re-create wakelock on acquisition/release

Also provide additional status for wakelock acquisition/release errors.

Bug: 27721443
Change-Id: Iac544226fed4a73a50bd954e74d96edd4bed93d2
diff --git a/jni/com_android_bluetooth_btservice_AdapterService.cpp b/jni/com_android_bluetooth_btservice_AdapterService.cpp
index 9239aad..85fb642 100755
--- a/jni/com_android_bluetooth_btservice_AdapterService.cpp
+++ b/jni/com_android_bluetooth_btservice_AdapterService.cpp
@@ -488,7 +488,7 @@
 
 static JavaVMAttachArgs sAttachArgs = {
   .version = JNI_VERSION_1_6,
-  .name = "bluedroid wake/alarm thread",
+  .name = "bluetooth wake",
   .group = NULL
 };
 
@@ -532,54 +532,62 @@
     jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
     if (status != JNI_OK && status != JNI_EDETACHED) {
         ALOGE("%s unable to get environment for JNI call", __func__);
-        return BT_STATUS_FAIL;
+        return BT_STATUS_JNI_ENVIRONMENT_ERROR;
     }
     if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
         ALOGE("%s unable to attach thread to VM", __func__);
-        return BT_STATUS_FAIL;
+        return BT_STATUS_JNI_THREAD_ATTACH_ERROR;
     }
 
-    jboolean ret = JNI_FALSE;
+    jint ret = BT_STATUS_SUCCESS;
     jstring lock_name_jni = env->NewStringUTF(lock_name);
     if (lock_name_jni) {
-        ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_acquireWakeLock, lock_name_jni);
+        bool acquired = env->CallBooleanMethod(sJniAdapterServiceObj,
+                            method_acquireWakeLock, lock_name_jni);
+        if (!acquired) ret = BT_STATUS_WAKELOCK_ERROR;
         env->DeleteLocalRef(lock_name_jni);
     } else {
         ALOGE("%s unable to allocate string: %s", __func__, lock_name);
+        ret = BT_STATUS_NOMEM;
     }
 
     if (status == JNI_EDETACHED) {
         vm->DetachCurrentThread();
     }
 
-    return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
+    return ret;
 }
 
 static int release_wake_lock_callout(const char *lock_name) {
     JNIEnv *env;
     JavaVM *vm = AndroidRuntime::getJavaVM();
     jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
-
     if (status != JNI_OK && status != JNI_EDETACHED) {
         ALOGE("%s unable to get environment for JNI call", __func__);
-        return BT_STATUS_FAIL;
+        return BT_STATUS_JNI_ENVIRONMENT_ERROR;
     }
     if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
         ALOGE("%s unable to attach thread to VM", __func__);
-        return BT_STATUS_FAIL;
+        return BT_STATUS_JNI_THREAD_ATTACH_ERROR;
     }
-    jboolean ret = JNI_FALSE;
+
+    jint ret = BT_STATUS_SUCCESS;
     jstring lock_name_jni = env->NewStringUTF(lock_name);
     if (lock_name_jni) {
-        ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_releaseWakeLock, lock_name_jni);
+        bool released = env->CallBooleanMethod(sJniAdapterServiceObj,
+                            method_releaseWakeLock, lock_name_jni);
+        if (!released) ret = BT_STATUS_WAKELOCK_ERROR;
         env->DeleteLocalRef(lock_name_jni);
     } else {
         ALOGE("%s unable to allocate string: %s", __func__, lock_name);
+        ret = BT_STATUS_NOMEM;
     }
+
     if (status == JNI_EDETACHED) {
         vm->DetachCurrentThread();
     }
-    return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
+
+    return ret;
 }
 
 // Called by Java code when alarm is fired. A wake lock is held by the caller
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 5ca9d24..f1c8f01 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -2020,21 +2020,14 @@
     // extended to allow acquiring an arbitrary number of wake locks. The current interface
     // takes |lockName| as a parameter in anticipation of that implementation.
     private boolean acquireWakeLock(String lockName) {
-        if (mWakeLock != null) {
-            if (!lockName.equals(mWakeLockName)) {
-                errorLog("Multiple wake lock acquisition attempted; aborting: " + lockName);
-                return false;
-            }
-
-            // We're already holding the desired wake lock so return success.
-            if (mWakeLock.isHeld()) {
-                return true;
-            }
+        if (mWakeLock == null) {
+            mWakeLockName = lockName;
+            mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockName);
         }
 
-        mWakeLockName = lockName;
-        mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, lockName);
-        mWakeLock.acquire();
+        if (!mWakeLock.isHeld())
+            mWakeLock.acquire();
+
         return true;
     }
 
@@ -2050,8 +2043,6 @@
             }
 
             mWakeLock.release();
-            mWakeLock = null;
-            mWakeLockName = null;
         }
         return true;
     }