diff options
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 }, |