diff --git a/core/java/android/view/InputWindowHandle.java b/core/java/android/view/InputWindowHandle.java index 43ee34f81875f..4816d2c4950f2 100644 --- a/core/java/android/view/InputWindowHandle.java +++ b/core/java/android/view/InputWindowHandle.java @@ -42,6 +42,12 @@ public final class InputWindowHandle { // channel and the server input channel will both contain this token. public IBinder token; + /** + * The {@link IWindow} handle if InputWindowHandle is associated with a window, null otherwise. + */ + @Nullable + private IBinder windowToken; + // The window name. public String name; @@ -139,6 +145,7 @@ public final class InputWindowHandle { .append(", visible=").append(visible) .append(", scaleFactor=").append(scaleFactor) .append(", transform=").append(transform) + .append(", windowToken=").append(getWindow()) .toString(); } @@ -170,4 +177,12 @@ public final class InputWindowHandle { public void setTouchableRegionCrop(@Nullable SurfaceControl bounds) { touchableRegionSurfaceControl = new WeakReference<>(bounds); } + + public void setWindowToken(IWindow iwindow) { + windowToken = iwindow.asBinder(); + } + + public IWindow getWindow() { + return IWindow.Stub.asInterface(windowToken); + } } diff --git a/core/jni/android_hardware_input_InputWindowHandle.cpp b/core/jni/android_hardware_input_InputWindowHandle.cpp index 671d556a97170..e4ef7d39d77ca 100644 --- a/core/jni/android_hardware_input_InputWindowHandle.cpp +++ b/core/jni/android_hardware_input_InputWindowHandle.cpp @@ -76,6 +76,7 @@ static struct { jfieldID replaceTouchableRegionWithCrop; WeakRefHandleField touchableRegionSurfaceControl; jfieldID transform; + jfieldID windowToken; } gInputWindowHandleClassInfo; static struct { @@ -215,6 +216,14 @@ bool NativeInputWindowHandle::updateInfo() { mInfo.touchableRegionCropHandle.clear(); } + jobject windowTokenObj = env->GetObjectField(obj, gInputWindowHandleClassInfo.windowToken); + if (windowTokenObj) { + mInfo.windowToken = ibinderForJavaObject(env, windowTokenObj); + env->DeleteLocalRef(windowTokenObj); + } else { + mInfo.windowToken.clear(); + } + env->DeleteLocalRef(obj); return true; } @@ -314,6 +323,9 @@ jobject android_view_InputWindowHandle_fromWindowInfo(JNIEnv* env, gui::WindowIn ScopedLocalRef matrixObj(env, AMatrix_newInstance(env, transformVals)); env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.transform, matrixObj.get()); + env->SetObjectField(inputWindowHandle, gInputWindowHandleClassInfo.windowToken, + javaObjectForIBinder(env, windowInfo.windowToken)); + return inputWindowHandle; } @@ -441,6 +453,9 @@ int register_android_view_InputWindowHandle(JNIEnv* env) { GET_FIELD_ID(gInputWindowHandleClassInfo.transform, clazz, "transform", "Landroid/graphics/Matrix;"); + GET_FIELD_ID(gInputWindowHandleClassInfo.windowToken, clazz, "windowToken", + "Landroid/os/IBinder;"); + jclass weakRefClazz; FIND_CLASS(weakRefClazz, "java/lang/ref/Reference"); diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index 90d1494cb6f04..f8af43bee24dd 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -289,6 +289,7 @@ final class InputMonitor { inputWindowHandle.setInputFeatures(w.mAttrs.inputFeatures); inputWindowHandle.setPaused(w.mActivityRecord != null && w.mActivityRecord.paused); inputWindowHandle.setVisible(w.isVisible()); + inputWindowHandle.setWindowToken(w.mClient); final boolean focusable = w.canReceiveKeys() && (mService.mPerDisplayFocusEnabled || mDisplayContent.isOnTop()); diff --git a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java index b4e11ff77cb3c..6ce7b4232b075 100644 --- a/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java +++ b/services/core/java/com/android/server/wm/InputWindowHandleWrapper.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.graphics.Region; import android.os.IBinder; +import android.view.IWindow; import android.view.InputApplicationHandle; import android.view.InputWindowHandle; import android.view.SurfaceControl; @@ -267,6 +268,14 @@ class InputWindowHandleWrapper { mChanged = true; } + void setWindowToken(IWindow windowToken) { + if (mHandle.getWindow() == windowToken) { + return; + } + mHandle.setWindowToken(windowToken); + mChanged = true; + } + @Override public String toString() { return mHandle + ", changed=" + mChanged; diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index bfdd26e976515..e0cd520cb2398 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -8264,7 +8264,7 @@ public class WindowManagerService extends IWindowManager.Stub } updateInputChannel(clientChannel.getToken(), callingUid, callingPid, displayId, surface, - name, applicationHandle, flags, privateFlags, type, null /* region */); + name, applicationHandle, flags, privateFlags, type, null /* region */, window); clientChannel.copyTo(outInputChannel); } @@ -8272,9 +8272,10 @@ public class WindowManagerService extends IWindowManager.Stub private void updateInputChannel(IBinder channelToken, int callingUid, int callingPid, int displayId, SurfaceControl surface, String name, InputApplicationHandle applicationHandle, int flags, - int privateFlags, int type, Region region) { + int privateFlags, int type, Region region, IWindow window) { InputWindowHandle h = new InputWindowHandle(applicationHandle, displayId); h.token = channelToken; + h.setWindowToken(window); h.name = name; final int sanitizedFlags = flags & (LayoutParams.FLAG_NOT_TOUCHABLE @@ -8330,7 +8331,7 @@ public class WindowManagerService extends IWindowManager.Stub } updateInputChannel(channelToken, win.mOwnerUid, win.mOwnerPid, displayId, surface, name, - applicationHandle, flags, privateFlags, win.mWindowType, region); + applicationHandle, flags, privateFlags, win.mWindowType, region, win.mClient); } /** Return whether layer tracing is enabled */