diff --git a/core/jni/android_hardware_input_InputApplicationHandle.cpp b/core/jni/android_hardware_input_InputApplicationHandle.cpp index 9137ee0227ff6..ff73c74e125e4 100644 --- a/core/jni/android_hardware_input_InputApplicationHandle.cpp +++ b/core/jni/android_hardware_input_InputApplicationHandle.cpp @@ -77,32 +77,28 @@ bool NativeInputApplicationHandle::updateInfo() { return mInfo.token.get() != nullptr; } - // --- Global functions --- -sp android_view_InputApplicationHandle_getHandle( +std::shared_ptr android_view_InputApplicationHandle_getHandle( JNIEnv* env, jobject inputApplicationHandleObj) { if (!inputApplicationHandleObj) { return NULL; } AutoMutex _l(gHandleMutex); - jlong ptr = env->GetLongField(inputApplicationHandleObj, gInputApplicationHandleClassInfo.ptr); - NativeInputApplicationHandle* handle; + std::shared_ptr* handle; if (ptr) { - handle = reinterpret_cast(ptr); + handle = reinterpret_cast*>(ptr); } else { jweak objWeak = env->NewWeakGlobalRef(inputApplicationHandleObj); - handle = new NativeInputApplicationHandle(objWeak); - handle->incStrong((void*)android_view_InputApplicationHandle_getHandle); + handle = new std::shared_ptr(std::make_shared(objWeak)); env->SetLongField(inputApplicationHandleObj, gInputApplicationHandleClassInfo.ptr, reinterpret_cast(handle)); } - return handle; + return *handle; } - // --- JNI --- static void android_view_InputApplicationHandle_nativeDispose(JNIEnv* env, jobject obj) { @@ -112,8 +108,9 @@ static void android_view_InputApplicationHandle_nativeDispose(JNIEnv* env, jobje if (ptr) { env->SetLongField(obj, gInputApplicationHandleClassInfo.ptr, 0); - NativeInputApplicationHandle* handle = reinterpret_cast(ptr); - handle->decStrong((void*)android_view_InputApplicationHandle_getHandle); + std::shared_ptr* handle = + reinterpret_cast*>(ptr); + delete handle; } } diff --git a/core/jni/android_hardware_input_InputApplicationHandle.h b/core/jni/android_hardware_input_InputApplicationHandle.h index 52ab3e614ba1d..ec99d6da5b8e2 100644 --- a/core/jni/android_hardware_input_InputApplicationHandle.h +++ b/core/jni/android_hardware_input_InputApplicationHandle.h @@ -39,8 +39,7 @@ private: jweak mObjWeak; }; - -extern sp android_view_InputApplicationHandle_getHandle( +extern std::shared_ptr android_view_InputApplicationHandle_getHandle( JNIEnv* env, jobject inputApplicationHandleObj); } // namespace android diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp index bdb4544f4aae2..796c5c4cc521f 100644 --- a/core/jni/android_hardware_input_InputWindowHandle.cpp +++ b/core/jni/android_hardware_input_InputWindowHandle.cpp @@ -168,8 +168,8 @@ bool NativeInputWindowHandle::updateInfo() { jobject inputApplicationHandleObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.inputApplicationHandle); if (inputApplicationHandleObj) { - sp inputApplicationHandle = - android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); + std::shared_ptr inputApplicationHandle = + android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); if (inputApplicationHandle != nullptr) { inputApplicationHandle->updateInfo(); mInfo.applicationInfo = *(inputApplicationHandle->getInfo()); diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 10523a2adbb20..784366318319b 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -239,9 +239,9 @@ public: void notifySwitch(nsecs_t when, uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) override; void notifyConfigurationChanged(nsecs_t when) override; - std::chrono::nanoseconds notifyAnr(const sp& inputApplicationHandle, - const sp& token, - const std::string& reason) override; + std::chrono::nanoseconds notifyAnr( + const std::shared_ptr& inputApplicationHandle, + const sp& token, const std::string& reason) override; void notifyInputChannelBroken(const sp& token) override; void notifyFocusChanged(const sp& oldToken, const sp& newToken) override; bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) override; @@ -682,8 +682,8 @@ void NativeInputManager::notifyConfigurationChanged(nsecs_t when) { checkAndClearExceptionFromCallback(env, "notifyConfigurationChanged"); } -static jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, - const sp& inputApplicationHandle) { +static jobject getInputApplicationHandleObjLocalRef( + JNIEnv* env, const std::shared_ptr& inputApplicationHandle) { if (inputApplicationHandle == nullptr) { return nullptr; } @@ -694,8 +694,8 @@ static jobject getInputApplicationHandleObjLocalRef(JNIEnv* env, } std::chrono::nanoseconds NativeInputManager::notifyAnr( - const sp& inputApplicationHandle, const sp& token, - const std::string& reason) { + const std::shared_ptr& inputApplicationHandle, + const sp& token, const std::string& reason) { #if DEBUG_INPUT_DISPATCHER_POLICY ALOGD("notifyANR"); #endif @@ -780,8 +780,12 @@ void NativeInputManager::displayRemoved(JNIEnv* env, int32_t displayId) { void NativeInputManager::setFocusedApplication(JNIEnv* env, int32_t displayId, jobject applicationHandleObj) { - sp applicationHandle = + if (!applicationHandleObj) { + return; + } + std::shared_ptr applicationHandle = android_view_InputApplicationHandle_getHandle(env, applicationHandleObj); + applicationHandle->updateInfo(); mInputManager->getDispatcher()->setFocusedApplication(displayId, applicationHandle); }