From c7ad0a0cb06aa446d0e3777ead0f2e4ba8d5c349 Mon Sep 17 00:00:00 2001 From: Vladislav Kaznacheev Date: Thu, 19 Mar 2015 10:13:31 -0700 Subject: [PATCH] Constrain 'touch modal' behavior to the activity stack. Currently a 'touch modal' window grabs drag events from the entire screen. Since 'touch modal' is the default, this makes dragging between apps impossible. This change allows such grabbing behavior only for events that are still over the same activity stack. Bug:19548858 Change-Id: I7d48b58e7fcb620521361e17cb70914913afae03 --- services/core/java/com/android/server/wm/DragState.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/services/core/java/com/android/server/wm/DragState.java b/services/core/java/com/android/server/wm/DragState.java index c6951bd4f9f64..1a125d4bfae27 100644 --- a/services/core/java/com/android/server/wm/DragState.java +++ b/services/core/java/com/android/server/wm/DragState.java @@ -24,6 +24,7 @@ import com.android.server.wm.WindowManagerService.H; import android.content.ClipData; import android.content.ClipDescription; import android.graphics.Point; +import android.graphics.Rect; import android.graphics.Region; import android.os.IBinder; import android.os.Message; @@ -63,6 +64,7 @@ class DragState { Display mDisplay; private final Region mTmpRegion = new Region(); + private final Rect mTmpRect = new Rect(); DragState(WindowManagerService service, IBinder token, SurfaceControl surface, int flags, IBinder localWin) { @@ -411,6 +413,12 @@ class DragState { continue; } + child.getStackBounds(mTmpRect); + if (!mTmpRect.contains(x, y)) { + // outside of this window's activity stack == don't tell about drags + continue; + } + child.getTouchableRegion(mTmpRegion); final int touchFlags = flags &