From 2c43c9efd28ab61b384c706c97ea0a28558bd163 Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Mon, 30 Jul 2018 17:28:37 -0700 Subject: Clear calling id in dontOverrideDisplayInfo. It might create DisplayContent in some cases where WM may need to do something only privileged processes are allowed to do. Bug: 111840884 Test: dontOverrideDisplayInfo succeeds with the freeform windowing mode CL. Change-Id: I09b32c8fa2be4bd775a11e884c81cc38cb2c2368 --- .../android/server/wm/WindowManagerService.java | 31 +++++++++++++--------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 9b792e3f2d13..042f58fb805c 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -7090,19 +7090,24 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void dontOverrideDisplayInfo(int displayId) { - synchronized (mWindowMap) { - final DisplayContent dc = getDisplayContentOrCreate(displayId); - if (dc == null) { - throw new IllegalArgumentException( - "Trying to register a non existent display."); - } - // We usually set the override info in DisplayManager so that we get consistent - // values when displays are changing. However, we don't do this for displays that - // serve as containers for ActivityViews because we don't want letter-/pillar-boxing - // during resize. - dc.mShouldOverrideDisplayConfiguration = false; - mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, - null /* info */); + final long token = Binder.clearCallingIdentity(); + try { + synchronized (mWindowMap) { + final DisplayContent dc = getDisplayContentOrCreate(displayId); + if (dc == null) { + throw new IllegalArgumentException( + "Trying to register a non existent display."); + } + // We usually set the override info in DisplayManager so that we get consistent + // values when displays are changing. However, we don't do this for displays that + // serve as containers for ActivityViews because we don't want letter-/pillar-boxing + // during resize. + dc.mShouldOverrideDisplayConfiguration = false; + mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, + null /* info */); + } + } finally { + Binder.restoreCallingIdentity(token); } } -- cgit v1.2.3-59-g8ed1b From 3b388800b57b533260aabd9924f58a9180ae9ede Mon Sep 17 00:00:00 2001 From: Garfield Tan Date: Tue, 31 Jul 2018 15:24:35 -0700 Subject: Fix 2 input issues. 1) Only register InputConsumer to default display; 2) Only use one input monitor for all displays. Bug: 112049699 Bug: 112081256 Test: Manual. Launcher stopped crashing. Input works. Change-Id: I87c5ad3f4c76055f4f164db48af6bd90f1e4339f --- .../java/com/android/server/wm/DisplayContent.java | 4 +++- .../java/com/android/server/wm/InputMonitor.java | 3 ++- .../android/server/wm/WindowManagerService.java | 23 ++++++++++++---------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index cea5f4c61ab7..6286062c6c0a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -801,7 +801,9 @@ class DisplayContent extends WindowContainer { - dc.getInputMonitor().createInputConsumer(token, name, inputChannel, + // TODO(b/112049699): Fix this for multiple displays. There is only one inputChannel + // here to accept the return value. + DisplayContent display = mRoot.getDisplayContent(Display.DEFAULT_DISPLAY); + if (display != null) { + display.getInputMonitor().createInputConsumer(token, name, inputChannel, Binder.getCallingPid(), Binder.getCallingUserHandle()); - }); + } } } @Override public boolean destroyInputConsumer(String name) { synchronized (mWindowMap) { - AtomicBoolean retValue = new AtomicBoolean(true); - mRoot.forAllDisplays(dc -> { - if (!dc.getInputMonitor().destroyInputConsumer(name)) { - retValue.set(false); - } - }); - return retValue.get(); + // TODO(b/112049699): Fix this for multiple displays. For consistency with + // createInputConsumer above. + DisplayContent display = mRoot.getDisplayContent(Display.DEFAULT_DISPLAY); + if (display != null) { + return display.getInputMonitor().destroyInputConsumer(name); + } + return false; } } -- cgit v1.2.3-59-g8ed1b