Loading core/java/android/view/IWindowManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -525,11 +525,11 @@ interface IWindowManager out InputChannel inputChannel); /** * Destroy an input consumer by name and display id. * Destroy an input consumer by token and display id. * This method will also dispose the input channels associated with that InputConsumer. */ @UnsupportedAppUsage boolean destroyInputConsumer(String name, int displayId); boolean destroyInputConsumer(IBinder token, int displayId); /** * Return the touch region for the current IME window, or an empty region if there is none. Loading libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java +2 −2 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public class PipInputConsumer { final InputChannel inputChannel = new InputChannel(); try { // TODO(b/113087003): Support Picture-in-picture in multi-display. mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel); } catch (RemoteException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, Loading @@ -163,7 +163,7 @@ public class PipInputConsumer { } try { // TODO(b/113087003): Support Picture-in-picture in multi-display. mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); } catch (RemoteException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: Failed to destroy input consumer, %s", TAG, e); Loading packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java +2 −2 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public class InputConsumerController { if (mInputEventReceiver == null) { final InputChannel inputChannel = new InputChannel(); try { mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel); } catch (RemoteException e) { Log.e(TAG, "Failed to create input consumer", e); Loading @@ -158,7 +158,7 @@ public class InputConsumerController { public void unregisterInputConsumer() { if (mInputEventReceiver != null) { try { mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); } catch (RemoteException e) { Log.e(TAG, "Failed to destroy input consumer", e); } Loading services/core/java/com/android/server/wm/InputConsumerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,7 @@ class InputConsumerImpl implements IBinder.DeathRecipient { if (dc == null) { return; } dc.getInputMonitor().destroyInputConsumer(mName); dc.getInputMonitor().destroyInputConsumer(mToken); unlinkFromDeathRecipient(); } } Loading services/core/java/com/android/server/wm/InputMonitor.java +31 −25 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import com.android.server.inputmethod.InputMethodManagerInternal; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Set; import java.util.function.Consumer; Loading Loading @@ -104,7 +105,7 @@ final class InputMonitor { * The set of input consumer added to the window manager by name, which consumes input events * for the windows below it. */ private final ArrayMap<String, InputConsumerImpl> mInputConsumers = new ArrayMap(); private final ArrayList<InputConsumerImpl> mInputConsumers = new ArrayList<>(); /** * Set when recents (overview) is active as part of a shell transition. While set, any focus Loading Loading @@ -164,31 +165,35 @@ final class InputMonitor { mDisplayRemoved = true; } private void addInputConsumer(String name, InputConsumerImpl consumer) { mInputConsumers.put(name, consumer); private void addInputConsumer(InputConsumerImpl consumer) { mInputConsumers.add(consumer); consumer.linkToDeathRecipient(); consumer.layout(mInputTransaction, mDisplayWidth, mDisplayHeight); updateInputWindowsLw(true /* force */); } boolean destroyInputConsumer(String name) { if (disposeInputConsumer(mInputConsumers.remove(name))) { boolean destroyInputConsumer(IBinder token) { for (int i = 0; i < mInputConsumers.size(); i++) { final InputConsumerImpl consumer = mInputConsumers.get(i); if (consumer != null && consumer.mToken == token) { consumer.disposeChannelsLw(mInputTransaction); mInputConsumers.remove(consumer); updateInputWindowsLw(true /* force */); return true; } return false; } private boolean disposeInputConsumer(InputConsumerImpl consumer) { if (consumer != null) { consumer.disposeChannelsLw(mInputTransaction); return true; } return false; } InputConsumerImpl getInputConsumer(String name) { return mInputConsumers.get(name); // Search in reverse order as the latest input consumer with the name takes precedence for (int i = mInputConsumers.size() - 1; i >= 0; i--) { final InputConsumerImpl consumer = mInputConsumers.get(i); if (consumer.mName.equals(name)) { return consumer; } } return null; } void layoutInputConsumers(int dw, int dh) { Loading @@ -200,7 +205,7 @@ final class InputMonitor { try { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "layoutInputConsumer"); for (int i = mInputConsumers.size() - 1; i >= 0; i--) { mInputConsumers.valueAt(i).layout(mInputTransaction, dw, dh); mInputConsumers.get(i).layout(mInputTransaction, dw, dh); } } finally { Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); Loading @@ -212,15 +217,16 @@ final class InputMonitor { // (set so by this function) and must meet some condition for visibility on each update. void resetInputConsumers(SurfaceControl.Transaction t) { for (int i = mInputConsumers.size() - 1; i >= 0; i--) { mInputConsumers.valueAt(i).hide(t); mInputConsumers.get(i).hide(t); } } void createInputConsumer(IBinder token, String name, InputChannel inputChannel, int clientPid, UserHandle clientUser) { if (mInputConsumers.containsKey(name)) { final InputConsumerImpl existingConsumer = getInputConsumer(name); if (existingConsumer != null && existingConsumer.mClientUser.equals(clientUser)) { throw new IllegalStateException("Existing input consumer found with name: " + name + ", display: " + mDisplayId); + ", display: " + mDisplayId + ", user: " + clientUser); } final InputConsumerImpl consumer = new InputConsumerImpl(mService, token, name, Loading @@ -239,7 +245,7 @@ final class InputMonitor { throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } addInputConsumer(name, consumer); addInputConsumer(consumer); } @VisibleForTesting Loading Loading @@ -541,11 +547,11 @@ final class InputMonitor { } void dump(PrintWriter pw, String prefix) { final Set<String> inputConsumerKeys = mInputConsumers.keySet(); if (!inputConsumerKeys.isEmpty()) { if (!mInputConsumers.isEmpty()) { pw.println(prefix + "InputConsumers:"); for (String key : inputConsumerKeys) { mInputConsumers.get(key).dump(pw, key, prefix); for (int i = 0; i < mInputConsumers.size(); i++) { final InputConsumerImpl consumer = mInputConsumers.get(i); consumer.dump(pw, consumer.mName, prefix); } } } Loading Loading
core/java/android/view/IWindowManager.aidl +2 −2 Original line number Diff line number Diff line Loading @@ -525,11 +525,11 @@ interface IWindowManager out InputChannel inputChannel); /** * Destroy an input consumer by name and display id. * Destroy an input consumer by token and display id. * This method will also dispose the input channels associated with that InputConsumer. */ @UnsupportedAppUsage boolean destroyInputConsumer(String name, int displayId); boolean destroyInputConsumer(IBinder token, int displayId); /** * Return the touch region for the current IME window, or an empty region if there is none. Loading
libs/WindowManager/Shell/src/com/android/wm/shell/pip/phone/PipInputConsumer.java +2 −2 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public class PipInputConsumer { final InputChannel inputChannel = new InputChannel(); try { // TODO(b/113087003): Support Picture-in-picture in multi-display. mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel); } catch (RemoteException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, Loading @@ -163,7 +163,7 @@ public class PipInputConsumer { } try { // TODO(b/113087003): Support Picture-in-picture in multi-display. mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); } catch (RemoteException e) { ProtoLog.e(ShellProtoLogGroup.WM_SHELL_PICTURE_IN_PICTURE, "%s: Failed to destroy input consumer, %s", TAG, e); Loading
packages/SystemUI/shared/src/com/android/systemui/shared/system/InputConsumerController.java +2 −2 Original line number Diff line number Diff line Loading @@ -139,7 +139,7 @@ public class InputConsumerController { if (mInputEventReceiver == null) { final InputChannel inputChannel = new InputChannel(); try { mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); mWindowManager.createInputConsumer(mToken, mName, DEFAULT_DISPLAY, inputChannel); } catch (RemoteException e) { Log.e(TAG, "Failed to create input consumer", e); Loading @@ -158,7 +158,7 @@ public class InputConsumerController { public void unregisterInputConsumer() { if (mInputEventReceiver != null) { try { mWindowManager.destroyInputConsumer(mName, DEFAULT_DISPLAY); mWindowManager.destroyInputConsumer(mToken, DEFAULT_DISPLAY); } catch (RemoteException e) { Log.e(TAG, "Failed to destroy input consumer", e); } Loading
services/core/java/com/android/server/wm/InputConsumerImpl.java +1 −1 Original line number Diff line number Diff line Loading @@ -160,7 +160,7 @@ class InputConsumerImpl implements IBinder.DeathRecipient { if (dc == null) { return; } dc.getInputMonitor().destroyInputConsumer(mName); dc.getInputMonitor().destroyInputConsumer(mToken); unlinkFromDeathRecipient(); } } Loading
services/core/java/com/android/server/wm/InputMonitor.java +31 −25 Original line number Diff line number Diff line Loading @@ -73,6 +73,7 @@ import com.android.server.inputmethod.InputMethodManagerInternal; import java.io.PrintWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.Set; import java.util.function.Consumer; Loading Loading @@ -104,7 +105,7 @@ final class InputMonitor { * The set of input consumer added to the window manager by name, which consumes input events * for the windows below it. */ private final ArrayMap<String, InputConsumerImpl> mInputConsumers = new ArrayMap(); private final ArrayList<InputConsumerImpl> mInputConsumers = new ArrayList<>(); /** * Set when recents (overview) is active as part of a shell transition. While set, any focus Loading Loading @@ -164,31 +165,35 @@ final class InputMonitor { mDisplayRemoved = true; } private void addInputConsumer(String name, InputConsumerImpl consumer) { mInputConsumers.put(name, consumer); private void addInputConsumer(InputConsumerImpl consumer) { mInputConsumers.add(consumer); consumer.linkToDeathRecipient(); consumer.layout(mInputTransaction, mDisplayWidth, mDisplayHeight); updateInputWindowsLw(true /* force */); } boolean destroyInputConsumer(String name) { if (disposeInputConsumer(mInputConsumers.remove(name))) { boolean destroyInputConsumer(IBinder token) { for (int i = 0; i < mInputConsumers.size(); i++) { final InputConsumerImpl consumer = mInputConsumers.get(i); if (consumer != null && consumer.mToken == token) { consumer.disposeChannelsLw(mInputTransaction); mInputConsumers.remove(consumer); updateInputWindowsLw(true /* force */); return true; } return false; } private boolean disposeInputConsumer(InputConsumerImpl consumer) { if (consumer != null) { consumer.disposeChannelsLw(mInputTransaction); return true; } return false; } InputConsumerImpl getInputConsumer(String name) { return mInputConsumers.get(name); // Search in reverse order as the latest input consumer with the name takes precedence for (int i = mInputConsumers.size() - 1; i >= 0; i--) { final InputConsumerImpl consumer = mInputConsumers.get(i); if (consumer.mName.equals(name)) { return consumer; } } return null; } void layoutInputConsumers(int dw, int dh) { Loading @@ -200,7 +205,7 @@ final class InputMonitor { try { Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "layoutInputConsumer"); for (int i = mInputConsumers.size() - 1; i >= 0; i--) { mInputConsumers.valueAt(i).layout(mInputTransaction, dw, dh); mInputConsumers.get(i).layout(mInputTransaction, dw, dh); } } finally { Trace.traceEnd(TRACE_TAG_WINDOW_MANAGER); Loading @@ -212,15 +217,16 @@ final class InputMonitor { // (set so by this function) and must meet some condition for visibility on each update. void resetInputConsumers(SurfaceControl.Transaction t) { for (int i = mInputConsumers.size() - 1; i >= 0; i--) { mInputConsumers.valueAt(i).hide(t); mInputConsumers.get(i).hide(t); } } void createInputConsumer(IBinder token, String name, InputChannel inputChannel, int clientPid, UserHandle clientUser) { if (mInputConsumers.containsKey(name)) { final InputConsumerImpl existingConsumer = getInputConsumer(name); if (existingConsumer != null && existingConsumer.mClientUser.equals(clientUser)) { throw new IllegalStateException("Existing input consumer found with name: " + name + ", display: " + mDisplayId); + ", display: " + mDisplayId + ", user: " + clientUser); } final InputConsumerImpl consumer = new InputConsumerImpl(mService, token, name, Loading @@ -239,7 +245,7 @@ final class InputMonitor { throw new IllegalArgumentException("Illegal input consumer : " + name + ", display: " + mDisplayId); } addInputConsumer(name, consumer); addInputConsumer(consumer); } @VisibleForTesting Loading Loading @@ -541,11 +547,11 @@ final class InputMonitor { } void dump(PrintWriter pw, String prefix) { final Set<String> inputConsumerKeys = mInputConsumers.keySet(); if (!inputConsumerKeys.isEmpty()) { if (!mInputConsumers.isEmpty()) { pw.println(prefix + "InputConsumers:"); for (String key : inputConsumerKeys) { mInputConsumers.get(key).dump(pw, key, prefix); for (int i = 0; i < mInputConsumers.size(); i++) { final InputConsumerImpl consumer = mInputConsumers.get(i); consumer.dump(pw, consumer.mName, prefix); } } } Loading