Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d7d9a2d3 authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Refactor InputWindowHandle JNI code" into main

parents 46055df9 de3341c3
Loading
Loading
Loading
Loading
+64 −101
Original line number Original line Diff line number Diff line
@@ -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);
    }
    }
@@ -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);
@@ -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>
@@ -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(
@@ -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 */
+4 −17
Original line number Original line Diff line number Diff line
@@ -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


+7 −5
Original line number Original line Diff line number Diff line
@@ -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,