summaryrefslogtreecommitdiffstats
path: root/services/core/java/com/android/server/wm
diff options
context:
space:
mode:
Diffstat (limited to 'services/core/java/com/android/server/wm')
-rw-r--r--services/core/java/com/android/server/wm/AccessibilityController.java2
-rw-r--r--services/core/java/com/android/server/wm/InputConsumerImpl.java (renamed from services/core/java/com/android/server/wm/FakeWindowImpl.java)38
-rw-r--r--services/core/java/com/android/server/wm/InputMonitor.java24
-rw-r--r--services/core/java/com/android/server/wm/WindowManagerService.java35
4 files changed, 41 insertions, 58 deletions
diff --git a/services/core/java/com/android/server/wm/AccessibilityController.java b/services/core/java/com/android/server/wm/AccessibilityController.java
index 482ae24..66ae9ef 100644
--- a/services/core/java/com/android/server/wm/AccessibilityController.java
+++ b/services/core/java/com/android/server/wm/AccessibilityController.java
@@ -1248,7 +1248,7 @@ final class AccessibilityController {
&& windowType != WindowManager.LayoutParams.TYPE_BOOT_PROGRESS
&& windowType != WindowManager.LayoutParams.TYPE_DISPLAY_OVERLAY
&& windowType != WindowManager.LayoutParams.TYPE_DRAG
- && windowType != WindowManager.LayoutParams.TYPE_HIDDEN_NAV_CONSUMER
+ && windowType != WindowManager.LayoutParams.TYPE_INPUT_CONSUMER
&& windowType != WindowManager.LayoutParams.TYPE_POINTER
&& windowType != WindowManager.LayoutParams.TYPE_MAGNIFICATION_OVERLAY
&& windowType != WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA_OVERLAY
diff --git a/services/core/java/com/android/server/wm/FakeWindowImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java
index 1136ced..0581a16 100644
--- a/services/core/java/com/android/server/wm/FakeWindowImpl.java
+++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java
@@ -16,17 +16,18 @@
package com.android.server.wm;
-import com.android.server.input.InputApplicationHandle;
-import com.android.server.input.InputWindowHandle;
-
import android.os.Looper;
import android.os.Process;
import android.view.Display;
import android.view.InputChannel;
import android.view.InputEventReceiver;
+import android.view.WindowManager;
import android.view.WindowManagerPolicy;
-public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
+import com.android.server.input.InputApplicationHandle;
+import com.android.server.input.InputWindowHandle;
+
+public final class InputConsumerImpl implements WindowManagerPolicy.InputConsumer {
final WindowManagerService mService;
final InputChannel mServerChannel, mClientChannel;
final InputApplicationHandle mApplicationHandle;
@@ -34,12 +35,9 @@ public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
final InputEventReceiver mInputEventReceiver;
final int mWindowLayer;
- boolean mTouchFullscreen;
-
- public FakeWindowImpl(WindowManagerService service,
- Looper looper, InputEventReceiver.Factory inputEventReceiverFactory,
- String name, int windowType, int layoutParamsFlags,
- boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
+ public InputConsumerImpl(WindowManagerService service, Looper looper,
+ InputEventReceiver.Factory inputEventReceiverFactory) {
+ String name = "input consumer";
mService = service;
InputChannel[] channels = InputChannel.openInputChannelPair(name);
@@ -58,31 +56,25 @@ public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
mWindowHandle = new InputWindowHandle(mApplicationHandle, null, Display.DEFAULT_DISPLAY);
mWindowHandle.name = name;
mWindowHandle.inputChannel = mServerChannel;
- mWindowLayer = getLayerLw(windowType);
+ mWindowHandle.layoutParamsType = WindowManager.LayoutParams.TYPE_INPUT_CONSUMER;
+ mWindowLayer = getLayerLw(mWindowHandle.layoutParamsType);
mWindowHandle.layer = mWindowLayer;
- mWindowHandle.layoutParamsFlags = layoutParamsFlags;
- mWindowHandle.layoutParamsType = windowType;
+ mWindowHandle.layoutParamsFlags = 0;
mWindowHandle.dispatchingTimeoutNanos =
WindowManagerService.DEFAULT_INPUT_DISPATCHING_TIMEOUT_NANOS;
mWindowHandle.visible = true;
- mWindowHandle.canReceiveKeys = canReceiveKeys;
- mWindowHandle.hasFocus = hasFocus;
+ mWindowHandle.canReceiveKeys = false;
+ mWindowHandle.hasFocus = false;
mWindowHandle.hasWallpaper = false;
mWindowHandle.paused = false;
mWindowHandle.ownerPid = Process.myPid();
mWindowHandle.ownerUid = Process.myUid();
mWindowHandle.inputFeatures = 0;
mWindowHandle.scaleFactor = 1.0f;
-
- mTouchFullscreen = touchFullscreen;
}
void layout(int dw, int dh) {
- if (mTouchFullscreen) {
- mWindowHandle.touchableRegion.set(0, 0, dw, dh);
- } else {
- mWindowHandle.touchableRegion.setEmpty();
- }
+ mWindowHandle.touchableRegion.set(0, 0, dw, dh);
mWindowHandle.frameLeft = 0;
mWindowHandle.frameTop = 0;
mWindowHandle.frameRight = dw;
@@ -92,7 +84,7 @@ public final class FakeWindowImpl implements WindowManagerPolicy.FakeWindow {
@Override
public void dismiss() {
synchronized (mService.mWindowMap) {
- if (mService.removeFakeWindowLocked(this)) {
+ if (mService.removeInputConsumer()) {
mInputEventReceiver.dispose();
mService.mInputManager.unregisterInputChannel(mServerChannel);
mClientChannel.dispose();
diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java
index c24fcb3..ae442e5 100644
--- a/services/core/java/com/android/server/wm/InputMonitor.java
+++ b/services/core/java/com/android/server/wm/InputMonitor.java
@@ -16,10 +16,6 @@
package com.android.server.wm;
-import com.android.server.input.InputManagerService;
-import com.android.server.input.InputApplicationHandle;
-import com.android.server.input.InputWindowHandle;
-
import android.app.ActivityManagerNative;
import android.graphics.Rect;
import android.os.RemoteException;
@@ -30,17 +26,21 @@ import android.view.InputChannel;
import android.view.KeyEvent;
import android.view.WindowManager;
+import com.android.server.input.InputApplicationHandle;
+import com.android.server.input.InputManagerService;
+import com.android.server.input.InputWindowHandle;
+
import java.util.Arrays;
final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
private final WindowManagerService mService;
-
+
// Current window with input focus for keys and other non-touch events. May be null.
private WindowState mInputFocus;
-
+
// When true, prevents input dispatch from proceeding until set to false again.
private boolean mInputDispatchFrozen;
-
+
// When true, input dispatch proceeds normally. Otherwise all events are dropped.
// Initially false, so that input does not get dispatched until boot is finished at
// which point the ActivityManager will enable dispatching.
@@ -256,10 +256,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
}
}
- final int NFW = mService.mFakeWindows.size();
- for (int i = 0; i < NFW; i++) {
- addInputWindowHandleLw(mService.mFakeWindows.get(i).mWindowHandle);
- }
+ boolean addInputConsumerHandle = mService.mInputConsumer != null;
// Add all windows on the default display.
final int numDisplays = mService.mDisplayContents.size();
@@ -273,6 +270,11 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
// Skip this window because it cannot possibly receive input.
continue;
}
+ if (addInputConsumerHandle
+ && inputWindowHandle.layer <= mService.mInputConsumer.mWindowHandle.layer) {
+ addInputWindowHandleLw(mService.mInputConsumer.mWindowHandle);
+ addInputConsumerHandle = false;
+ }
final int flags = child.mAttrs.flags;
final int privateFlags = child.mAttrs.privateFlags;
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index d956d76..cebb909 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -108,7 +108,6 @@ import android.view.WindowManager.LayoutParams;
import android.view.WindowManagerGlobal;
import android.view.WindowManagerInternal;
import android.view.WindowManagerPolicy;
-import android.view.WindowManagerPolicy.FakeWindow;
import android.view.WindowManagerPolicy.PointerEventListener;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
@@ -382,10 +381,10 @@ public class WindowManagerService extends IWindowManager.Stub
final ArrayList<AppWindowToken> mFinishedStarting = new ArrayList<>();
/**
- * Fake windows added to the window manager. Note: ordered from top to
- * bottom, opposite of mWindows.
+ * The input consumer added to the window manager which consumes input events to windows below
+ * it.
*/
- final ArrayList<FakeWindowImpl> mFakeWindows = new ArrayList<>();
+ InputConsumerImpl mInputConsumer;
/**
* Windows that are being resized. Used so we can tell the client about
@@ -8966,9 +8965,8 @@ public class WindowManagerService extends IWindowManager.Stub
final int dw = displayInfo.logicalWidth;
final int dh = displayInfo.logicalHeight;
- final int NFW = mFakeWindows.size();
- for (int i=0; i<NFW; i++) {
- mFakeWindows.get(i).layout(dw, dh);
+ if (mInputConsumer != null) {
+ mInputConsumer.layout(dw, dh);
}
final int N = windows.size();
@@ -10995,28 +10993,19 @@ public class WindowManagerService extends IWindowManager.Stub
}
@Override
- public FakeWindow addFakeWindow(Looper looper,
- InputEventReceiver.Factory inputEventReceiverFactory,
- String name, int windowType, int layoutParamsFlags, int layoutParamsPrivateFlags,
- boolean canReceiveKeys, boolean hasFocus, boolean touchFullscreen) {
+ public InputConsumerImpl addInputConsumer(Looper looper,
+ InputEventReceiver.Factory inputEventReceiverFactory) {
synchronized (mWindowMap) {
- FakeWindowImpl fw = new FakeWindowImpl(this, looper, inputEventReceiverFactory,
- name, windowType, layoutParamsFlags, canReceiveKeys, hasFocus, touchFullscreen);
- int i=0;
- while (i<mFakeWindows.size()) {
- if (mFakeWindows.get(i).mWindowLayer <= fw.mWindowLayer) {
- break;
- }
- }
- mFakeWindows.add(i, fw);
+ mInputConsumer = new InputConsumerImpl(this, looper, inputEventReceiverFactory);
mInputMonitor.updateInputWindowsLw(true);
- return fw;
+ return mInputConsumer;
}
}
- boolean removeFakeWindowLocked(FakeWindow window) {
+ boolean removeInputConsumer() {
synchronized (mWindowMap) {
- if (mFakeWindows.remove(window)) {
+ if (mInputConsumer != null) {
+ mInputConsumer = null;
mInputMonitor.updateInputWindowsLw(true);
return true;
}