Loading services/core/java/com/android/server/wm/InputMonitor.java +2 −24 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static com.android.server.wm.WindowManagerService.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerService.DEBUG_INPUT; import static com.android.server.wm.WindowState.BOUNDS_FOR_TOUCH; import android.app.ActivityManagerNative; import android.graphics.Rect; import android.os.RemoteException; Loading Loading @@ -62,8 +62,6 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { private final Object mInputDevicesReadyMonitor = new Object(); private boolean mInputDevicesReady; Rect mTmpRect = new Rect(); public InputMonitor(WindowManagerService service) { mService = service; } Loading Loading @@ -176,27 +174,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { final boolean hasFocus, final boolean hasWallpaper, DisplayContent displayContent) { // Add a window to our list of input windows. inputWindowHandle.name = child.toString(); final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; if (modal && child.mAppToken != null) { // Limit the outer touch to the activity stack region. flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; // If this is a modal window we need to dismiss it if it's not full screen and the touch // happens outside of the frame that displays the content. This means we need to // intercept touches outside of that window. The dim layer user associated with the // window (task or stack) will give us the good bounds, as they would be used to display // the dim layer. final DimLayer.DimLayerUser dimLayerUser = child.getDimLayerUser(); if (dimLayerUser != null) { dimLayerUser.getBounds(mTmpRect); } else { child.getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } inputWindowHandle.touchableRegion.set(mTmpRect); } else { // Not modal or full screen modal child.getTouchableRegion(inputWindowHandle.touchableRegion); } flags = child.getTouchableRegion(inputWindowHandle.touchableRegion, flags, this); inputWindowHandle.layoutParamsFlags = flags; inputWindowHandle.layoutParamsType = type; inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos(); Loading services/core/java/com/android/server/wm/WindowState.java +31 −0 Original line number Diff line number Diff line Loading @@ -1336,6 +1336,37 @@ final class WindowState implements WindowManagerPolicy.WindowState { return mAppToken != null && mAppToken.mTask != null && mAppToken.mTask.inDockedWorkspace(); } int getTouchableRegion(Region region, int flags, InputMonitor inputMonitor) { final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; if (modal && mAppToken != null) { // Limit the outer touch to the activity stack region. flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; if (!inFreeformWorkspace()) { // If this is a modal window we need to dismiss it if it's not full screen and the // touch happens outside of the frame that displays the content. This means we // need to intercept touches outside of that window. The dim layer user // associated with the window (task or stack) will give us the good bounds, as // they would be used to display the dim layer. final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser(); if (dimLayerUser != null) { dimLayerUser.getBounds(mTmpRect); } else { getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } } else { // For freeform windows we the touch region to include the whole surface for the // shadows. getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } region.set(mTmpRect); } else { // Not modal or full screen modal getTouchableRegion(region); } return flags; } private class DeathRecipient implements IBinder.DeathRecipient { @Override public void binderDied() { Loading Loading
services/core/java/com/android/server/wm/InputMonitor.java +2 −24 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.server.wm; import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER; import static com.android.server.wm.WindowManagerService.DEBUG_FOCUS_LIGHT; import static com.android.server.wm.WindowManagerService.DEBUG_INPUT; import static com.android.server.wm.WindowState.BOUNDS_FOR_TOUCH; import android.app.ActivityManagerNative; import android.graphics.Rect; import android.os.RemoteException; Loading Loading @@ -62,8 +62,6 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { private final Object mInputDevicesReadyMonitor = new Object(); private boolean mInputDevicesReady; Rect mTmpRect = new Rect(); public InputMonitor(WindowManagerService service) { mService = service; } Loading Loading @@ -176,27 +174,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks { final boolean hasFocus, final boolean hasWallpaper, DisplayContent displayContent) { // Add a window to our list of input windows. inputWindowHandle.name = child.toString(); final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; if (modal && child.mAppToken != null) { // Limit the outer touch to the activity stack region. flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; // If this is a modal window we need to dismiss it if it's not full screen and the touch // happens outside of the frame that displays the content. This means we need to // intercept touches outside of that window. The dim layer user associated with the // window (task or stack) will give us the good bounds, as they would be used to display // the dim layer. final DimLayer.DimLayerUser dimLayerUser = child.getDimLayerUser(); if (dimLayerUser != null) { dimLayerUser.getBounds(mTmpRect); } else { child.getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } inputWindowHandle.touchableRegion.set(mTmpRect); } else { // Not modal or full screen modal child.getTouchableRegion(inputWindowHandle.touchableRegion); } flags = child.getTouchableRegion(inputWindowHandle.touchableRegion, flags, this); inputWindowHandle.layoutParamsFlags = flags; inputWindowHandle.layoutParamsType = type; inputWindowHandle.dispatchingTimeoutNanos = child.getInputDispatchingTimeoutNanos(); Loading
services/core/java/com/android/server/wm/WindowState.java +31 −0 Original line number Diff line number Diff line Loading @@ -1336,6 +1336,37 @@ final class WindowState implements WindowManagerPolicy.WindowState { return mAppToken != null && mAppToken.mTask != null && mAppToken.mTask.inDockedWorkspace(); } int getTouchableRegion(Region region, int flags, InputMonitor inputMonitor) { final boolean modal = (flags & (WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)) == 0; if (modal && mAppToken != null) { // Limit the outer touch to the activity stack region. flags |= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL; if (!inFreeformWorkspace()) { // If this is a modal window we need to dismiss it if it's not full screen and the // touch happens outside of the frame that displays the content. This means we // need to intercept touches outside of that window. The dim layer user // associated with the window (task or stack) will give us the good bounds, as // they would be used to display the dim layer. final DimLayer.DimLayerUser dimLayerUser = getDimLayerUser(); if (dimLayerUser != null) { dimLayerUser.getBounds(mTmpRect); } else { getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } } else { // For freeform windows we the touch region to include the whole surface for the // shadows. getVisibleBounds(mTmpRect, BOUNDS_FOR_TOUCH); } region.set(mTmpRect); } else { // Not modal or full screen modal getTouchableRegion(region); } return flags; } private class DeathRecipient implements IBinder.DeathRecipient { @Override public void binderDied() { Loading