Loading core/jni/android_hardware_input_InputWindowHandle.cpp +64 −101 Original line number Original line Diff line number Diff line Loading @@ -83,68 +83,53 @@ static struct { jmethodID ctor; jmethodID ctor; } gRegionClassInfo; } gRegionClassInfo; static Mutex gHandleMutex; // --- Global functions --- // --- NativeInputWindowHandle --- NativeInputWindowHandle::NativeInputWindowHandle(jweak objWeak) : mObjWeak(objWeak) { } NativeInputWindowHandle::~NativeInputWindowHandle() { JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObjWeak); // Clear the weak reference to the layer handle and flush any binder ref count operations so we sp<gui::WindowInfoHandle> android_view_InputWindowHandle_getHandle(JNIEnv* env, jobject obj) { // do not hold on to any binder references. sp<gui::WindowInfoHandle> handle = [&]() { // TODO(b/139697085) remove this after it can be flushed automatically jlong cachedHandle = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); mInfo.touchableRegionCropHandle.clear(); if (cachedHandle) { IPCThreadState::self()->flushCommands(); return sp<gui::WindowInfoHandle>::fromExisting( reinterpret_cast<gui::WindowInfoHandle*>(cachedHandle)); } } jobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) { auto newHandle = sp<gui::WindowInfoHandle>::make(); return env->NewLocalRef(mObjWeak); newHandle->incStrong((void*)android_view_InputWindowHandle_getHandle); } env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, reinterpret_cast<jlong>(newHandle.get())); return newHandle; }(); bool NativeInputWindowHandle::updateInfo() { gui::WindowInfo* windowInfo = handle->editInfo(); JNIEnv* env = AndroidRuntime::getJNIEnv(); jobject obj = env->NewLocalRef(mObjWeak); if (!obj) { releaseChannel(); return false; } mInfo.touchableRegion.clear(); windowInfo->touchableRegion.clear(); jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token); jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token); if (tokenObj) { if (tokenObj) { mInfo.token = ibinderForJavaObject(env, tokenObj); windowInfo->token = ibinderForJavaObject(env, tokenObj); env->DeleteLocalRef(tokenObj); env->DeleteLocalRef(tokenObj); } else { } else { mInfo.token.clear(); windowInfo->token.clear(); } } mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>"); windowInfo->name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>"); mInfo.dispatchingTimeout = std::chrono::milliseconds( windowInfo->dispatchingTimeout = std::chrono::milliseconds( env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis)); env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis)); ScopedLocalRef<jobject> frameObj(env, ScopedLocalRef<jobject> frameObj(env, env->GetObjectField(obj, gInputWindowHandleClassInfo.frame)); env->GetObjectField(obj, gInputWindowHandleClassInfo.frame)); mInfo.frame = JNICommon::rectFromObj(env, frameObj.get()); windowInfo->frame = JNICommon::rectFromObj(env, frameObj.get()); mInfo.surfaceInset = env->GetIntField(obj, windowInfo->surfaceInset = env->GetIntField(obj, gInputWindowHandleClassInfo.surfaceInset); gInputWindowHandleClassInfo.surfaceInset); windowInfo->globalScaleFactor = mInfo.globalScaleFactor = env->GetFloatField(obj, env->GetFloatField(obj, gInputWindowHandleClassInfo.scaleFactor); gInputWindowHandleClassInfo.scaleFactor); jobject regionObj = env->GetObjectField(obj, jobject regionObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.touchableRegion); gInputWindowHandleClassInfo.touchableRegion); if (regionObj) { if (regionObj) { for (graphics::RegionIterator it(env, regionObj); !it.isDone(); it.next()) { for (graphics::RegionIterator it(env, regionObj); !it.isDone(); it.next()) { ARect rect = it.getRect(); ARect rect = it.getRect(); mInfo.addTouchableRegion(Rect(rect.left, rect.top, rect.right, rect.bottom)); windowInfo->addTouchableRegion(Rect(rect.left, rect.top, rect.right, rect.bottom)); } } env->DeleteLocalRef(regionObj); env->DeleteLocalRef(regionObj); } } Loading @@ -153,49 +138,55 @@ bool NativeInputWindowHandle::updateInfo() { env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags)); env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags)); const auto type = static_cast<WindowInfo::Type>( const auto type = static_cast<WindowInfo::Type>( env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType)); env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType)); mInfo.layoutParamsFlags = flags; windowInfo->layoutParamsFlags = flags; mInfo.layoutParamsType = type; windowInfo->layoutParamsType = type; mInfo.inputConfig = static_cast<gui::WindowInfo::InputConfig>( windowInfo->inputConfig = static_cast<gui::WindowInfo::InputConfig>( env->GetIntField(obj, gInputWindowHandleClassInfo.inputConfig)); env->GetIntField(obj, gInputWindowHandleClassInfo.inputConfig)); mInfo.touchOcclusionMode = static_cast<TouchOcclusionMode>( windowInfo->touchOcclusionMode = static_cast<TouchOcclusionMode>( env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode)); env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode)); mInfo.ownerPid = gui::Pid{env->GetIntField(obj, gInputWindowHandleClassInfo.ownerPid)}; windowInfo->ownerPid = gui::Pid{env->GetIntField(obj, gInputWindowHandleClassInfo.ownerPid)}; mInfo.ownerUid = gui::Uid{ windowInfo->ownerUid = gui::Uid{ static_cast<uid_t>(env->GetIntField(obj, gInputWindowHandleClassInfo.ownerUid))}; static_cast<uid_t>(env->GetIntField(obj, gInputWindowHandleClassInfo.ownerUid))}; mInfo.packageName = getStringField(env, obj, gInputWindowHandleClassInfo.packageName, "<null>"); windowInfo->packageName = mInfo.displayId = getStringField(env, obj, gInputWindowHandleClassInfo.packageName, "<null>"); windowInfo->displayId = ui::LogicalDisplayId{env->GetIntField(obj, gInputWindowHandleClassInfo.displayId)}; ui::LogicalDisplayId{env->GetIntField(obj, gInputWindowHandleClassInfo.displayId)}; jobject inputApplicationHandleObj = env->GetObjectField(obj, jobject inputApplicationHandleObj = gInputWindowHandleClassInfo.inputApplicationHandle); env->GetObjectField(obj, gInputWindowHandleClassInfo.inputApplicationHandle); if (inputApplicationHandleObj) { if (inputApplicationHandleObj) { std::shared_ptr<InputApplicationHandle> inputApplicationHandle = std::shared_ptr<InputApplicationHandle> inputApplicationHandle = android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); if (inputApplicationHandle != nullptr) { if (inputApplicationHandle != nullptr) { inputApplicationHandle->updateInfo(); inputApplicationHandle->updateInfo(); mInfo.applicationInfo = *(inputApplicationHandle->getInfo()); windowInfo->applicationInfo = *(inputApplicationHandle->getInfo()); } } env->DeleteLocalRef(inputApplicationHandleObj); env->DeleteLocalRef(inputApplicationHandleObj); } } mInfo.replaceTouchableRegionWithCrop = env->GetBooleanField(obj, windowInfo->replaceTouchableRegionWithCrop = gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop); env->GetBooleanField(obj, gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop); jobject weakSurfaceCtrl = env->GetObjectField(obj, jobject weakSurfaceCtrl = env->GetObjectField(obj, gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl); gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl); bool touchableRegionCropHandleSet = false; bool touchableRegionCropHandleSet = false; if (weakSurfaceCtrl) { if (weakSurfaceCtrl) { // Promote java weak reference. // Promote java weak reference. jobject strongSurfaceCtrl = env->CallObjectMethod(weakSurfaceCtrl, jobject strongSurfaceCtrl = gInputWindowHandleClassInfo.touchableRegionSurfaceControl.get); env->CallObjectMethod(weakSurfaceCtrl, gInputWindowHandleClassInfo.touchableRegionSurfaceControl .get); if (strongSurfaceCtrl) { if (strongSurfaceCtrl) { jlong mNativeObject = env->GetLongField(strongSurfaceCtrl, jlong mNativeObject = gInputWindowHandleClassInfo.touchableRegionSurfaceControl.mNativeObject); env->GetLongField(strongSurfaceCtrl, gInputWindowHandleClassInfo.touchableRegionSurfaceControl .mNativeObject); if (mNativeObject) { if (mNativeObject) { auto ctrl = reinterpret_cast<SurfaceControl *>(mNativeObject); auto ctrl = reinterpret_cast<SurfaceControl *>(mNativeObject); mInfo.touchableRegionCropHandle = ctrl->getHandle(); windowInfo->touchableRegionCropHandle = ctrl->getHandle(); touchableRegionCropHandleSet = true; touchableRegionCropHandleSet = true; } } env->DeleteLocalRef(strongSurfaceCtrl); env->DeleteLocalRef(strongSurfaceCtrl); Loading @@ -203,15 +194,15 @@ bool NativeInputWindowHandle::updateInfo() { env->DeleteLocalRef(weakSurfaceCtrl); env->DeleteLocalRef(weakSurfaceCtrl); } } if (!touchableRegionCropHandleSet) { if (!touchableRegionCropHandleSet) { mInfo.touchableRegionCropHandle.clear(); windowInfo->touchableRegionCropHandle.clear(); } } jobject windowTokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.windowToken); jobject windowTokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.windowToken); if (windowTokenObj) { if (windowTokenObj) { mInfo.windowToken = ibinderForJavaObject(env, windowTokenObj); windowInfo->windowToken = ibinderForJavaObject(env, windowTokenObj); env->DeleteLocalRef(windowTokenObj); env->DeleteLocalRef(windowTokenObj); } else { } else { mInfo.windowToken.clear(); windowInfo->windowToken.clear(); } } ScopedLocalRef<jobject> ScopedLocalRef<jobject> Loading @@ -220,41 +211,16 @@ bool NativeInputWindowHandle::updateInfo() { gInputWindowHandleClassInfo gInputWindowHandleClassInfo .focusTransferTarget)); .focusTransferTarget)); if (focusTransferTargetObj.get()) { if (focusTransferTargetObj.get()) { mInfo.focusTransferTarget = ibinderForJavaObject(env, focusTransferTargetObj.get()); windowInfo->focusTransferTarget = ibinderForJavaObject(env, focusTransferTargetObj.get()); } else { } else { mInfo.focusTransferTarget.clear(); windowInfo->focusTransferTarget.clear(); } env->DeleteLocalRef(obj); return true; } // --- Global functions --- sp<NativeInputWindowHandle> android_view_InputWindowHandle_getHandle( JNIEnv* env, jobject inputWindowHandleObj) { if (!inputWindowHandleObj) { return NULL; } } AutoMutex _l(gHandleMutex); jlong ptr = env->GetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr); NativeInputWindowHandle* handle; if (ptr) { handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); } else { jweak objWeak = env->NewWeakGlobalRef(inputWindowHandleObj); handle = new NativeInputWindowHandle(objWeak); handle->incStrong((void*)android_view_InputWindowHandle_getHandle); env->SetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr, reinterpret_cast<jlong>(handle)); } return handle; return handle; } } jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowInfo windowInfo) { jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, const gui::WindowInfo& windowInfo) { ScopedLocalRef<jobject> ScopedLocalRef<jobject> applicationHandle(env, applicationHandle(env, android_view_InputApplicationHandle_fromInputApplicationInfo( android_view_InputApplicationHandle_fromInputApplicationInfo( Loading Loading @@ -337,17 +303,14 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn // --- JNI --- // --- JNI --- static void android_view_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) { static void android_view_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) { AutoMutex _l(gHandleMutex); jlong ptr = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); jlong ptr = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); if (ptr) { if (!ptr) { return; } env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, 0); env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, 0); auto handle = reinterpret_cast<gui::WindowInfoHandle*>(ptr); NativeInputWindowHandle* handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); handle->decStrong((void*)android_view_InputWindowHandle_getHandle); handle->decStrong((void*)android_view_InputWindowHandle_getHandle); } } } static const JNINativeMethod gInputWindowHandleMethods[] = { static const JNINativeMethod gInputWindowHandleMethods[] = { /* name, signature, funcPtr */ /* name, signature, funcPtr */ Loading core/jni/android_hardware_input_InputWindowHandle.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -24,24 +24,11 @@ namespace android { namespace android { class NativeInputWindowHandle : public gui::WindowInfoHandle { sp<gui::WindowInfoHandle> android_view_InputWindowHandle_getHandle(JNIEnv* env, public: jobject inputWindowHandleObj); NativeInputWindowHandle(jweak objWeak); virtual ~NativeInputWindowHandle(); jobject getInputWindowHandleObjLocalRef(JNIEnv* env); jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, const gui::WindowInfo& windowInfo); virtual bool updateInfo(); private: jweak mObjWeak; }; extern sp<NativeInputWindowHandle> android_view_InputWindowHandle_getHandle( JNIEnv* env, jobject inputWindowHandleObj); extern jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowInfo windowInfo); } // namespace android } // namespace android Loading core/jni/android_view_SurfaceControl.cpp +7 −5 Original line number Original line Diff line number Diff line Loading @@ -979,14 +979,16 @@ static void nativeSetAlpha(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject inputWindow) { jlong nativeObject, jobject inputWindow) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); if (!inputWindow) { jniThrowNullPointerException(env, "InputWindowHandle is null"); return; } sp<NativeInputWindowHandle> handle = android_view_InputWindowHandle_getHandle( auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); env, inputWindow); handle->updateInfo(); sp<gui::WindowInfoHandle> info = android_view_InputWindowHandle_getHandle(env, inputWindow); auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); transaction->setInputWindowInfo(ctrl, *handle->getInfo()); transaction->setInputWindowInfo(ctrl, std::move(info)); } } static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj, Loading Loading
core/jni/android_hardware_input_InputWindowHandle.cpp +64 −101 Original line number Original line Diff line number Diff line Loading @@ -83,68 +83,53 @@ static struct { jmethodID ctor; jmethodID ctor; } gRegionClassInfo; } gRegionClassInfo; static Mutex gHandleMutex; // --- Global functions --- // --- NativeInputWindowHandle --- NativeInputWindowHandle::NativeInputWindowHandle(jweak objWeak) : mObjWeak(objWeak) { } NativeInputWindowHandle::~NativeInputWindowHandle() { JNIEnv* env = AndroidRuntime::getJNIEnv(); env->DeleteWeakGlobalRef(mObjWeak); // Clear the weak reference to the layer handle and flush any binder ref count operations so we sp<gui::WindowInfoHandle> android_view_InputWindowHandle_getHandle(JNIEnv* env, jobject obj) { // do not hold on to any binder references. sp<gui::WindowInfoHandle> handle = [&]() { // TODO(b/139697085) remove this after it can be flushed automatically jlong cachedHandle = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); mInfo.touchableRegionCropHandle.clear(); if (cachedHandle) { IPCThreadState::self()->flushCommands(); return sp<gui::WindowInfoHandle>::fromExisting( reinterpret_cast<gui::WindowInfoHandle*>(cachedHandle)); } } jobject NativeInputWindowHandle::getInputWindowHandleObjLocalRef(JNIEnv* env) { auto newHandle = sp<gui::WindowInfoHandle>::make(); return env->NewLocalRef(mObjWeak); newHandle->incStrong((void*)android_view_InputWindowHandle_getHandle); } env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, reinterpret_cast<jlong>(newHandle.get())); return newHandle; }(); bool NativeInputWindowHandle::updateInfo() { gui::WindowInfo* windowInfo = handle->editInfo(); JNIEnv* env = AndroidRuntime::getJNIEnv(); jobject obj = env->NewLocalRef(mObjWeak); if (!obj) { releaseChannel(); return false; } mInfo.touchableRegion.clear(); windowInfo->touchableRegion.clear(); jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token); jobject tokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.token); if (tokenObj) { if (tokenObj) { mInfo.token = ibinderForJavaObject(env, tokenObj); windowInfo->token = ibinderForJavaObject(env, tokenObj); env->DeleteLocalRef(tokenObj); env->DeleteLocalRef(tokenObj); } else { } else { mInfo.token.clear(); windowInfo->token.clear(); } } mInfo.name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>"); windowInfo->name = getStringField(env, obj, gInputWindowHandleClassInfo.name, "<null>"); mInfo.dispatchingTimeout = std::chrono::milliseconds( windowInfo->dispatchingTimeout = std::chrono::milliseconds( env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis)); env->GetLongField(obj, gInputWindowHandleClassInfo.dispatchingTimeoutMillis)); ScopedLocalRef<jobject> frameObj(env, ScopedLocalRef<jobject> frameObj(env, env->GetObjectField(obj, gInputWindowHandleClassInfo.frame)); env->GetObjectField(obj, gInputWindowHandleClassInfo.frame)); mInfo.frame = JNICommon::rectFromObj(env, frameObj.get()); windowInfo->frame = JNICommon::rectFromObj(env, frameObj.get()); mInfo.surfaceInset = env->GetIntField(obj, windowInfo->surfaceInset = env->GetIntField(obj, gInputWindowHandleClassInfo.surfaceInset); gInputWindowHandleClassInfo.surfaceInset); windowInfo->globalScaleFactor = mInfo.globalScaleFactor = env->GetFloatField(obj, env->GetFloatField(obj, gInputWindowHandleClassInfo.scaleFactor); gInputWindowHandleClassInfo.scaleFactor); jobject regionObj = env->GetObjectField(obj, jobject regionObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.touchableRegion); gInputWindowHandleClassInfo.touchableRegion); if (regionObj) { if (regionObj) { for (graphics::RegionIterator it(env, regionObj); !it.isDone(); it.next()) { for (graphics::RegionIterator it(env, regionObj); !it.isDone(); it.next()) { ARect rect = it.getRect(); ARect rect = it.getRect(); mInfo.addTouchableRegion(Rect(rect.left, rect.top, rect.right, rect.bottom)); windowInfo->addTouchableRegion(Rect(rect.left, rect.top, rect.right, rect.bottom)); } } env->DeleteLocalRef(regionObj); env->DeleteLocalRef(regionObj); } } Loading @@ -153,49 +138,55 @@ bool NativeInputWindowHandle::updateInfo() { env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags)); env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsFlags)); const auto type = static_cast<WindowInfo::Type>( const auto type = static_cast<WindowInfo::Type>( env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType)); env->GetIntField(obj, gInputWindowHandleClassInfo.layoutParamsType)); mInfo.layoutParamsFlags = flags; windowInfo->layoutParamsFlags = flags; mInfo.layoutParamsType = type; windowInfo->layoutParamsType = type; mInfo.inputConfig = static_cast<gui::WindowInfo::InputConfig>( windowInfo->inputConfig = static_cast<gui::WindowInfo::InputConfig>( env->GetIntField(obj, gInputWindowHandleClassInfo.inputConfig)); env->GetIntField(obj, gInputWindowHandleClassInfo.inputConfig)); mInfo.touchOcclusionMode = static_cast<TouchOcclusionMode>( windowInfo->touchOcclusionMode = static_cast<TouchOcclusionMode>( env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode)); env->GetIntField(obj, gInputWindowHandleClassInfo.touchOcclusionMode)); mInfo.ownerPid = gui::Pid{env->GetIntField(obj, gInputWindowHandleClassInfo.ownerPid)}; windowInfo->ownerPid = gui::Pid{env->GetIntField(obj, gInputWindowHandleClassInfo.ownerPid)}; mInfo.ownerUid = gui::Uid{ windowInfo->ownerUid = gui::Uid{ static_cast<uid_t>(env->GetIntField(obj, gInputWindowHandleClassInfo.ownerUid))}; static_cast<uid_t>(env->GetIntField(obj, gInputWindowHandleClassInfo.ownerUid))}; mInfo.packageName = getStringField(env, obj, gInputWindowHandleClassInfo.packageName, "<null>"); windowInfo->packageName = mInfo.displayId = getStringField(env, obj, gInputWindowHandleClassInfo.packageName, "<null>"); windowInfo->displayId = ui::LogicalDisplayId{env->GetIntField(obj, gInputWindowHandleClassInfo.displayId)}; ui::LogicalDisplayId{env->GetIntField(obj, gInputWindowHandleClassInfo.displayId)}; jobject inputApplicationHandleObj = env->GetObjectField(obj, jobject inputApplicationHandleObj = gInputWindowHandleClassInfo.inputApplicationHandle); env->GetObjectField(obj, gInputWindowHandleClassInfo.inputApplicationHandle); if (inputApplicationHandleObj) { if (inputApplicationHandleObj) { std::shared_ptr<InputApplicationHandle> inputApplicationHandle = std::shared_ptr<InputApplicationHandle> inputApplicationHandle = android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); android_view_InputApplicationHandle_getHandle(env, inputApplicationHandleObj); if (inputApplicationHandle != nullptr) { if (inputApplicationHandle != nullptr) { inputApplicationHandle->updateInfo(); inputApplicationHandle->updateInfo(); mInfo.applicationInfo = *(inputApplicationHandle->getInfo()); windowInfo->applicationInfo = *(inputApplicationHandle->getInfo()); } } env->DeleteLocalRef(inputApplicationHandleObj); env->DeleteLocalRef(inputApplicationHandleObj); } } mInfo.replaceTouchableRegionWithCrop = env->GetBooleanField(obj, windowInfo->replaceTouchableRegionWithCrop = gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop); env->GetBooleanField(obj, gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop); jobject weakSurfaceCtrl = env->GetObjectField(obj, jobject weakSurfaceCtrl = env->GetObjectField(obj, gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl); gInputWindowHandleClassInfo.touchableRegionSurfaceControl.ctrl); bool touchableRegionCropHandleSet = false; bool touchableRegionCropHandleSet = false; if (weakSurfaceCtrl) { if (weakSurfaceCtrl) { // Promote java weak reference. // Promote java weak reference. jobject strongSurfaceCtrl = env->CallObjectMethod(weakSurfaceCtrl, jobject strongSurfaceCtrl = gInputWindowHandleClassInfo.touchableRegionSurfaceControl.get); env->CallObjectMethod(weakSurfaceCtrl, gInputWindowHandleClassInfo.touchableRegionSurfaceControl .get); if (strongSurfaceCtrl) { if (strongSurfaceCtrl) { jlong mNativeObject = env->GetLongField(strongSurfaceCtrl, jlong mNativeObject = gInputWindowHandleClassInfo.touchableRegionSurfaceControl.mNativeObject); env->GetLongField(strongSurfaceCtrl, gInputWindowHandleClassInfo.touchableRegionSurfaceControl .mNativeObject); if (mNativeObject) { if (mNativeObject) { auto ctrl = reinterpret_cast<SurfaceControl *>(mNativeObject); auto ctrl = reinterpret_cast<SurfaceControl *>(mNativeObject); mInfo.touchableRegionCropHandle = ctrl->getHandle(); windowInfo->touchableRegionCropHandle = ctrl->getHandle(); touchableRegionCropHandleSet = true; touchableRegionCropHandleSet = true; } } env->DeleteLocalRef(strongSurfaceCtrl); env->DeleteLocalRef(strongSurfaceCtrl); Loading @@ -203,15 +194,15 @@ bool NativeInputWindowHandle::updateInfo() { env->DeleteLocalRef(weakSurfaceCtrl); env->DeleteLocalRef(weakSurfaceCtrl); } } if (!touchableRegionCropHandleSet) { if (!touchableRegionCropHandleSet) { mInfo.touchableRegionCropHandle.clear(); windowInfo->touchableRegionCropHandle.clear(); } } jobject windowTokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.windowToken); jobject windowTokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.windowToken); if (windowTokenObj) { if (windowTokenObj) { mInfo.windowToken = ibinderForJavaObject(env, windowTokenObj); windowInfo->windowToken = ibinderForJavaObject(env, windowTokenObj); env->DeleteLocalRef(windowTokenObj); env->DeleteLocalRef(windowTokenObj); } else { } else { mInfo.windowToken.clear(); windowInfo->windowToken.clear(); } } ScopedLocalRef<jobject> ScopedLocalRef<jobject> Loading @@ -220,41 +211,16 @@ bool NativeInputWindowHandle::updateInfo() { gInputWindowHandleClassInfo gInputWindowHandleClassInfo .focusTransferTarget)); .focusTransferTarget)); if (focusTransferTargetObj.get()) { if (focusTransferTargetObj.get()) { mInfo.focusTransferTarget = ibinderForJavaObject(env, focusTransferTargetObj.get()); windowInfo->focusTransferTarget = ibinderForJavaObject(env, focusTransferTargetObj.get()); } else { } else { mInfo.focusTransferTarget.clear(); windowInfo->focusTransferTarget.clear(); } env->DeleteLocalRef(obj); return true; } // --- Global functions --- sp<NativeInputWindowHandle> android_view_InputWindowHandle_getHandle( JNIEnv* env, jobject inputWindowHandleObj) { if (!inputWindowHandleObj) { return NULL; } } AutoMutex _l(gHandleMutex); jlong ptr = env->GetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr); NativeInputWindowHandle* handle; if (ptr) { handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); } else { jweak objWeak = env->NewWeakGlobalRef(inputWindowHandleObj); handle = new NativeInputWindowHandle(objWeak); handle->incStrong((void*)android_view_InputWindowHandle_getHandle); env->SetLongField(inputWindowHandleObj, gInputWindowHandleClassInfo.ptr, reinterpret_cast<jlong>(handle)); } return handle; return handle; } } jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowInfo windowInfo) { jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, const gui::WindowInfo& windowInfo) { ScopedLocalRef<jobject> ScopedLocalRef<jobject> applicationHandle(env, applicationHandle(env, android_view_InputApplicationHandle_fromInputApplicationInfo( android_view_InputApplicationHandle_fromInputApplicationInfo( Loading Loading @@ -337,17 +303,14 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn // --- JNI --- // --- JNI --- static void android_view_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) { static void android_view_InputWindowHandle_nativeDispose(JNIEnv* env, jobject obj) { AutoMutex _l(gHandleMutex); jlong ptr = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); jlong ptr = env->GetLongField(obj, gInputWindowHandleClassInfo.ptr); if (ptr) { if (!ptr) { return; } env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, 0); env->SetLongField(obj, gInputWindowHandleClassInfo.ptr, 0); auto handle = reinterpret_cast<gui::WindowInfoHandle*>(ptr); NativeInputWindowHandle* handle = reinterpret_cast<NativeInputWindowHandle*>(ptr); handle->decStrong((void*)android_view_InputWindowHandle_getHandle); handle->decStrong((void*)android_view_InputWindowHandle_getHandle); } } } static const JNINativeMethod gInputWindowHandleMethods[] = { static const JNINativeMethod gInputWindowHandleMethods[] = { /* name, signature, funcPtr */ /* name, signature, funcPtr */ Loading
core/jni/android_hardware_input_InputWindowHandle.h +4 −17 Original line number Original line Diff line number Diff line Loading @@ -24,24 +24,11 @@ namespace android { namespace android { class NativeInputWindowHandle : public gui::WindowInfoHandle { sp<gui::WindowInfoHandle> android_view_InputWindowHandle_getHandle(JNIEnv* env, public: jobject inputWindowHandleObj); NativeInputWindowHandle(jweak objWeak); virtual ~NativeInputWindowHandle(); jobject getInputWindowHandleObjLocalRef(JNIEnv* env); jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, const gui::WindowInfo& windowInfo); virtual bool updateInfo(); private: jweak mObjWeak; }; extern sp<NativeInputWindowHandle> android_view_InputWindowHandle_getHandle( JNIEnv* env, jobject inputWindowHandleObj); extern jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowInfo windowInfo); } // namespace android } // namespace android Loading
core/jni/android_view_SurfaceControl.cpp +7 −5 Original line number Original line Diff line number Diff line Loading @@ -979,14 +979,16 @@ static void nativeSetAlpha(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeSetInputWindowInfo(JNIEnv* env, jclass clazz, jlong transactionObj, jlong nativeObject, jobject inputWindow) { jlong nativeObject, jobject inputWindow) { auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); if (!inputWindow) { jniThrowNullPointerException(env, "InputWindowHandle is null"); return; } sp<NativeInputWindowHandle> handle = android_view_InputWindowHandle_getHandle( auto transaction = reinterpret_cast<SurfaceComposerClient::Transaction*>(transactionObj); env, inputWindow); handle->updateInfo(); sp<gui::WindowInfoHandle> info = android_view_InputWindowHandle_getHandle(env, inputWindow); auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); auto ctrl = reinterpret_cast<SurfaceControl *>(nativeObject); transaction->setInputWindowInfo(ctrl, *handle->getInfo()); transaction->setInputWindowInfo(ctrl, std::move(info)); } } static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj, static void nativeAddWindowInfosReportedListener(JNIEnv* env, jclass clazz, jlong transactionObj, Loading