From 03d65a72748a03e07c677911eeae325cd03cbf96 Mon Sep 17 00:00:00 2001 From: arthurhung Date: Tue, 28 Apr 2020 09:19:24 +0800 Subject: Fix consumer closed input channel cause an error occurred (1/2) An input channel specifies the file descriptors used to send input events to a window in another process. And All of the file descriptors open in the calling process shall be closed when process terminated. The server side could receive the socket broken event when the process terminated, we should do the unregister channel before close the file descriptor or do it automatically without error if there is no valid window. - Change the order that remove window before dispose the receiver. - Unregister input channel when windowless window removed. Bug: 133782251 Test: open app and exit by back key or recent apps, check if any error log occurs. Change-Id: I59d0084c2c771544e7ee226ce53c574f60c6b988 --- core/java/android/view/ViewRootImpl.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'core/java/android/view/ViewRootImpl.java') diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index 42f11c162473..4b929d1f8988 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -4636,14 +4636,17 @@ public final class ViewRootImpl implements ViewParent, mInputQueueCallback = null; mInputQueue = null; } - if (mInputEventReceiver != null) { - mInputEventReceiver.dispose(); - mInputEventReceiver = null; - } try { mWindowSession.remove(mWindow); } catch (RemoteException e) { } + // Dispose receiver would dispose client InputChannel, too. That could send out a socket + // broken event, so we need to unregister the server InputChannel when removing window to + // prevent server side receive the event and prompt error. + if (mInputEventReceiver != null) { + mInputEventReceiver.dispose(); + mInputEventReceiver = null; + } mDisplayManager.unregisterDisplayListener(mDisplayListener); -- cgit v1.2.3