Add displayId to transferTouch
To account for the case where the displays are mirrored, add display id to transferTouch(..). When mirroring is on, windows with identical tokens would be positioned on different displays. This could break the transferTouch API, if the window of mirror happens to be found first. This could mean that screenrecording may have different behaviour from the regular usage. Bug: 220077253 Test: atest inputflinger_tests Test: manual testing - pull down notification shade from home screen Change-Id: Ia8965cad83e2c29062329958edbc9516ae67f1ed
This commit is contained in:
@@ -658,10 +658,10 @@ public class InputManagerService extends IInputManager.Stub
|
||||
* gesture
|
||||
* @return True if the transfer succeeded, false if there was no active touch gesture happening
|
||||
*/
|
||||
public boolean transferTouch(IBinder destChannelToken) {
|
||||
public boolean transferTouch(IBinder destChannelToken, int displayId) {
|
||||
// TODO(b/162194035): Replace this with a SPY window
|
||||
Objects.requireNonNull(destChannelToken, "destChannelToken must not be null");
|
||||
return mNative.transferTouch(destChannelToken);
|
||||
return mNative.transferTouch(destChannelToken, displayId);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -90,7 +90,11 @@ public interface NativeInputManagerService {
|
||||
boolean transferTouchFocus(IBinder fromChannelToken, IBinder toChannelToken,
|
||||
boolean isDragDrop);
|
||||
|
||||
boolean transferTouch(IBinder destChannelToken);
|
||||
/**
|
||||
* Transfer the current touch gesture to the window identified by 'destChannelToken' positioned
|
||||
* on display with id 'displayId'.
|
||||
*/
|
||||
boolean transferTouch(IBinder destChannelToken, int displayId);
|
||||
|
||||
void setPointerSpeed(int speed);
|
||||
|
||||
@@ -263,7 +267,7 @@ public interface NativeInputManagerService {
|
||||
boolean isDragDrop);
|
||||
|
||||
@Override
|
||||
public native boolean transferTouch(IBinder destChannelToken);
|
||||
public native boolean transferTouch(IBinder destChannelToken, int displayId);
|
||||
|
||||
@Override
|
||||
public native void setPointerSpeed(int speed);
|
||||
|
||||
@@ -2798,7 +2798,7 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP
|
||||
* Move the touch gesture from the currently touched window on this display to this window.
|
||||
*/
|
||||
public boolean transferTouch() {
|
||||
return mWmService.mInputManager.transferTouch(mInputChannelToken);
|
||||
return mWmService.mInputManager.transferTouch(mInputChannelToken, getDisplayId());
|
||||
}
|
||||
|
||||
void disposeInputChannel() {
|
||||
|
||||
@@ -1846,12 +1846,13 @@ static jboolean nativeTransferTouchFocus(JNIEnv* env, jobject nativeImplObj,
|
||||
}
|
||||
}
|
||||
|
||||
static jboolean nativeTransferTouch(JNIEnv* env, jobject nativeImplObj,
|
||||
jobject destChannelTokenObj) {
|
||||
static jboolean nativeTransferTouch(JNIEnv* env, jobject nativeImplObj, jobject destChannelTokenObj,
|
||||
jint displayId) {
|
||||
sp<IBinder> destChannelToken = ibinderForJavaObject(env, destChannelTokenObj);
|
||||
|
||||
NativeInputManager* im = getNativeInputManager(env, nativeImplObj);
|
||||
if (im->getInputManager()->getDispatcher().transferTouch(destChannelToken)) {
|
||||
if (im->getInputManager()->getDispatcher().transferTouch(destChannelToken,
|
||||
static_cast<int32_t>(displayId))) {
|
||||
return JNI_TRUE;
|
||||
} else {
|
||||
return JNI_FALSE;
|
||||
@@ -2345,7 +2346,7 @@ static const JNINativeMethod gInputManagerMethods[] = {
|
||||
{"setSystemUiLightsOut", "(Z)V", (void*)nativeSetSystemUiLightsOut},
|
||||
{"transferTouchFocus", "(Landroid/os/IBinder;Landroid/os/IBinder;Z)Z",
|
||||
(void*)nativeTransferTouchFocus},
|
||||
{"transferTouch", "(Landroid/os/IBinder;)Z", (void*)nativeTransferTouch},
|
||||
{"transferTouch", "(Landroid/os/IBinder;I)Z", (void*)nativeTransferTouch},
|
||||
{"setPointerSpeed", "(I)V", (void*)nativeSetPointerSpeed},
|
||||
{"setPointerAcceleration", "(F)V", (void*)nativeSetPointerAcceleration},
|
||||
{"setShowTouches", "(Z)V", (void*)nativeSetShowTouches},
|
||||
|
||||
Reference in New Issue
Block a user