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

Commit 8ca2be72 authored by chaviw's avatar chaviw Committed by Chavi Weingarten
Browse files

Add transform matrix to InputWindowHandle.

Added the transform matrix from WindowInfo native to the Java side
InputWindowHandle. This is to allow clients that register a
WindowInfoListener to translate the window's screen coordinates to
window space.

Test: Transform is now sent to WindowInfoListener
Bug: 188792659
Change-Id: Ifba8488ff470d3c6c8066e23b871c3d541cff0a1
parent 577a74da
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.view;
import static android.view.Display.INVALID_DISPLAY;

import android.annotation.Nullable;
import android.graphics.Matrix;
import android.graphics.Region;
import android.gui.TouchOcclusionMode;
import android.os.IBinder;
@@ -122,6 +123,12 @@ public final class InputWindowHandle {
     */
    public boolean replaceTouchableRegionWithCrop;

    /**
     * The transform that should be applied to the Window to get it from screen coordinates to
     * window coordinates
     */
    public Matrix transform;

    private native void nativeDispose();

    public InputWindowHandle(InputApplicationHandle inputApplicationHandle, int displayId) {
@@ -136,6 +143,8 @@ public final class InputWindowHandle {
                        .append(frameRight).append(",").append(frameBottom).append("]")
                .append(", touchableRegion=").append(touchableRegion)
                .append(", visible=").append(visible)
                .append(", scaleFactor=").append(scaleFactor)
                .append(", transform=").append(transform)
                .toString();

    }
+12 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@
#include <ui/Region.h>
#include <utils/threads.h>

#include <android/graphics/matrix.h>
#include <gui/WindowInfo.h>
#include "SkRegion.h"
#include "android_hardware_input_InputApplicationHandle.h"
@@ -74,6 +75,7 @@ static struct {
    jfieldID displayId;
    jfieldID replaceTouchableRegionWithCrop;
    WeakRefHandleField touchableRegionSurfaceControl;
    jfieldID transform;
} gInputWindowHandleClassInfo;

static struct {
@@ -305,6 +307,13 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn
    env->SetIntField(inputWindowHandle, gInputWindowHandleClassInfo.inputFeatures,
                     static_cast<int32_t>(windowInfo.inputFeatures.get()));

    float transformVals[9];
    for (int i = 0; i < 9; i++) {
        transformVals[i] = windowInfo.transform[i % 3][i / 3];
    }
    ScopedLocalRef<jobject> matrixObj(env, AMatrix_newInstance(env, transformVals));
    env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.transform, matrixObj.get());

    return inputWindowHandle;
}

@@ -429,6 +438,9 @@ int register_android_view_InputWindowHandle(JNIEnv* env) {
    GET_FIELD_ID(gInputWindowHandleClassInfo.replaceTouchableRegionWithCrop, clazz,
            "replaceTouchableRegionWithCrop", "Z");

    GET_FIELD_ID(gInputWindowHandleClassInfo.transform, clazz, "transform",
                 "Landroid/graphics/Matrix;");

    jclass weakRefClazz;
    FIND_CLASS(weakRefClazz, "java/lang/ref/Reference");

+7 −0
Original line number Diff line number Diff line
@@ -35,3 +35,10 @@ bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]) {
    }
    return false;
}

jobject AMatrix_newInstance(JNIEnv* env, float values[9]) {
    jobject matrixObj = android::android_graphics_Matrix_newInstance(env);
    SkMatrix* m = android::android_graphics_Matrix_getSkMatrix(env, matrixObj);
    m->set9(values);
    return matrixObj;
}
+10 −0
Original line number Diff line number Diff line
@@ -34,6 +34,16 @@ __BEGIN_DECLS
 */
ANDROID_API bool AMatrix_getContents(JNIEnv* env, jobject matrixObj, float values[9]);

/**
 * Returns a new Matrix jobject that contains the values passed in as initial values.
 * @param values The 9 values of the 3x3 matrix in the following order.
 *               values[0] = scaleX  values[1] = skewX   values[2] = transX
 *               values[3] = skewY   values[4] = scaleY  values[5] = transY
 *               values[6] = persp0  values[7] = persp1  values[8] = persp2
 * @return The matrix jobject
 */
ANDROID_API jobject AMatrix_newInstance(JNIEnv* env, float values[9]);

__END_DECLS

#endif // ANDROID_GRAPHICS_MATRIX_H
+7 −0
Original line number Diff line number Diff line
@@ -378,13 +378,17 @@ static const JNINativeMethod methods[] = {
    {"nEquals", "(JJ)Z", (void*) SkMatrixGlue::equals}
};

static jclass sClazz;
static jfieldID sNativeInstanceField;
static jmethodID sCtor;

int register_android_graphics_Matrix(JNIEnv* env) {
    int result = RegisterMethodsOrDie(env, "android/graphics/Matrix", methods, NELEM(methods));

    jclass clazz = FindClassOrDie(env, "android/graphics/Matrix");
    sClazz = MakeGlobalRefOrDie(env, clazz);
    sNativeInstanceField = GetFieldIDOrDie(env, clazz, "native_instance", "J");
    sCtor = GetMethodIDOrDie(env, clazz, "<init>", "()V");

    return result;
}
@@ -393,4 +397,7 @@ SkMatrix* android_graphics_Matrix_getSkMatrix(JNIEnv* env, jobject matrixObj) {
    return reinterpret_cast<SkMatrix*>(env->GetLongField(matrixObj, sNativeInstanceField));
}

jobject android_graphics_Matrix_newInstance(JNIEnv* env) {
    return env->NewObject(sClazz, sCtor);
}
}
Loading