diff options
| author | 2018-07-30 15:32:11 +0800 | |
|---|---|---|
| committer | 2018-08-06 10:21:16 +0800 | |
| commit | b37e35e4a5576f89a39ff1f422b5c7f71ec3924d (patch) | |
| tree | f13fbd7c623332dcc72470681557ed305bdd3b45 | |
| parent | 5293635e2133897886ee6d0359b1f309b516c4b7 (diff) | |
Fix WM input limitations on secondary displays (2/N)
One DisplayContent contains one InputMonitor now.
- Change setInputWindow of InputManagerService to carry displayId,
so InputWindowHandle can be updated by each DisplayContent.
- Only one focus in current, so reference the WMS current focus,
need changed in focus of multi-display patch.
- Change InputConsumerController can just create in default display,
need consider more behaviors about adding to another display.
Bug: 111363643
Test: atest WindowManagerSmokeTest ActivityManagerMultiDisplayTests
Test: atest libinput_tests inputflinger_tests
Change-Id: I336945abdd36a543207e15650264280b04253eef
6 files changed, 34 insertions, 32 deletions
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java index 9df9ba600f2a..a5d7b27bc2cd 100644 --- a/services/core/java/com/android/server/input/InputManagerService.java +++ b/services/core/java/com/android/server/input/InputManagerService.java @@ -212,7 +212,8 @@ public class InputManagerService extends IInputManager.Stub int injectorPid, int injectorUid, int syncMode, int timeoutMillis, int policyFlags); private static native void nativeToggleCapsLock(long ptr, int deviceId); - private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles); + private static native void nativeSetInputWindows(long ptr, InputWindowHandle[] windowHandles, + int displayId); private static native void nativeSetInputDispatchMode(long ptr, boolean enabled, boolean frozen); private static native void nativeSetSystemUiVisibility(long ptr, int visibility); private static native void nativeSetFocusedApplication(long ptr, @@ -1467,7 +1468,7 @@ public class InputManagerService extends IInputManager.Stub } public void setInputWindows(InputWindowHandle[] windowHandles, - InputWindowHandle focusedWindowHandle) { + InputWindowHandle focusedWindowHandle, int displayId) { final IWindow newFocusedWindow = focusedWindowHandle != null ? focusedWindowHandle.clientWindow : null; if (mFocusedWindow != newFocusedWindow) { @@ -1476,7 +1477,7 @@ public class InputManagerService extends IInputManager.Stub setPointerCapture(false); } } - nativeSetInputWindows(mPtr, windowHandles); + nativeSetInputWindows(mPtr, windowHandles, displayId); } public void setFocusedApplication(InputApplicationHandle application) { diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index 4ab06a28712d..44d01871b693 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -814,9 +814,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo // {@link DisplayContent} ready for use. mDisplayReady = true; - // TODO(b/112081256): Use independent InputMonitor. - mInputMonitor = isDefaultDisplay ? new InputMonitor(service, mDisplayId) - : mService.getDefaultDisplayContentLocked().mInputMonitor; + mInputMonitor = new InputMonitor(service, mDisplayId); } boolean isReady() { @@ -2134,6 +2132,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo mRemovingDisplay = false; } + mInputMonitor.onRemoved(); mService.onDisplayRemoved(mDisplayId); } diff --git a/services/core/java/com/android/server/wm/InputConsumerImpl.java b/services/core/java/com/android/server/wm/InputConsumerImpl.java index 6a08f4d22661..af0eac6fbc6c 100644 --- a/services/core/java/com/android/server/wm/InputConsumerImpl.java +++ b/services/core/java/com/android/server/wm/InputConsumerImpl.java @@ -20,7 +20,6 @@ import android.os.IBinder; import android.os.Process; import android.os.RemoteException; import android.os.UserHandle; -import android.view.Display; import android.view.InputChannel; import android.view.WindowManager; import com.android.server.input.InputApplicationHandle; diff --git a/services/core/java/com/android/server/wm/InputMonitor.java b/services/core/java/com/android/server/wm/InputMonitor.java index c4beb553e0ec..823a0dec22b2 100644 --- a/services/core/java/com/android/server/wm/InputMonitor.java +++ b/services/core/java/com/android/server/wm/InputMonitor.java @@ -367,6 +367,13 @@ final class InputMonitor { } } + void onRemoved() { + // If DisplayContent removed, we need find a way to remove window handles of this display + // from InputDispatcher, so pass an empty InputWindowHandles to remove them. + mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle, + mDisplayId); + } + private final class UpdateInputForAllWindowsConsumer implements Consumer<WindowState> { InputConsumerImpl navInputConsumer; InputConsumerImpl pipInputConsumer; @@ -399,8 +406,7 @@ final class InputMonitor { this.inDrag = inDrag; wallpaperController = mService.mRoot.mWallpaperController; - // TODO(b/112081256): Use independent InputMonitor for each display. - mService.mRoot/*.getDisplayContent(mDisplayId)*/.forAllWindows(this, + mService.mRoot.getDisplayContent(mDisplayId).forAllWindows(this, true /* traverseTopToBottom */); if (mAddWallpaperInputConsumerHandle) { // No visible wallpaper found, add the wallpaper input consumer at the end. @@ -408,8 +414,8 @@ final class InputMonitor { } // Send windows to native code. - // TODO: Update Input windows and focus by display? - mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle); + mService.mInputManager.setInputWindows(mInputWindowHandles, mFocusedInputWindowHandle, + mDisplayId); clearInputWindowHandlesLw(); @@ -429,7 +435,8 @@ final class InputMonitor { final int flags = w.mAttrs.flags; final int privateFlags = w.mAttrs.privateFlags; final int type = w.mAttrs.type; - final boolean hasFocus = w == mInputFocus; + // TODO(b/111361570): multi-display focus, one focus for all display in current. + final boolean hasFocus = w == mService.mCurrentFocus;//mInputFocus; final boolean isVisible = w.isVisibleLw(); if (mAddRecentsAnimationInputConsumerHandle) { diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index ab735af9a075..7123908a7b82 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -6070,26 +6070,21 @@ public class WindowManagerService extends IWindowManager.Stub @Override public void createInputConsumer(IBinder token, String name, InputChannel inputChannel) { synchronized (mWindowMap) { - // 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()); - } + // TODO(b/112049699): multi-display inputConsumer, just support default in current. + // Need consider about the behavior from controller. + DisplayContent displayContent = getDefaultDisplayContentLocked(); + displayContent.getInputMonitor().createInputConsumer(token, name, inputChannel, + Binder.getCallingPid(), Binder.getCallingUserHandle()); } } @Override public boolean destroyInputConsumer(String name) { synchronized (mWindowMap) { - // 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; + // TODO(b/112049699): multi-display inputConsumer, just support default in current. + // Need consider about the behavior from controller. + DisplayContent displayContent = getDefaultDisplayContentLocked(); + return displayContent.getInputMonitor().destroyInputConsumer(name); } } diff --git a/services/core/jni/com_android_server_input_InputManagerService.cpp b/services/core/jni/com_android_server_input_InputManagerService.cpp index 52f2d674f993..f5f19f644e25 100644 --- a/services/core/jni/com_android_server_input_InputManagerService.cpp +++ b/services/core/jni/com_android_server_input_InputManagerService.cpp @@ -210,7 +210,7 @@ public: const sp<InputWindowHandle>& inputWindowHandle, bool monitor); status_t unregisterInputChannel(JNIEnv* env, const sp<InputChannel>& inputChannel); - void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray); + void setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray, int displayId); void setFocusedApplication(JNIEnv* env, jobject applicationHandleObj); void setInputDispatchMode(bool enabled, bool frozen); void setSystemUiVisibility(int32_t visibility); @@ -736,7 +736,8 @@ void NativeInputManager::getDispatcherConfiguration(InputDispatcherConfiguration } } -void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray) { +void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleObjArray, + int displayId) { Vector<sp<InputWindowHandle> > windowHandles; if (windowHandleObjArray) { @@ -756,7 +757,7 @@ void NativeInputManager::setInputWindows(JNIEnv* env, jobjectArray windowHandleO } } - mInputManager->getDispatcher()->setInputWindows(windowHandles); + mInputManager->getDispatcher()->setInputWindows(windowHandles, displayId); // Do this after the dispatcher has updated the window handle state. bool newPointerGesturesEnabled = true; @@ -1446,10 +1447,10 @@ static void nativeToggleCapsLock(JNIEnv* env, jclass /* clazz */, } static void nativeSetInputWindows(JNIEnv* env, jclass /* clazz */, - jlong ptr, jobjectArray windowHandleObjArray) { + jlong ptr, jobjectArray windowHandleObjArray, jint displayId) { NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr); - im->setInputWindows(env, windowHandleObjArray); + im->setInputWindows(env, windowHandleObjArray, displayId); } static void nativeSetFocusedApplication(JNIEnv* env, jclass /* clazz */, @@ -1678,7 +1679,7 @@ static const JNINativeMethod gInputManagerMethods[] = { (void*) nativeInjectInputEvent }, { "nativeToggleCapsLock", "(JI)V", (void*) nativeToggleCapsLock }, - { "nativeSetInputWindows", "(J[Lcom/android/server/input/InputWindowHandle;)V", + { "nativeSetInputWindows", "(J[Lcom/android/server/input/InputWindowHandle;I)V", (void*) nativeSetInputWindows }, { "nativeSetFocusedApplication", "(JLcom/android/server/input/InputApplicationHandle;)V", (void*) nativeSetFocusedApplication }, |