From 8f34cb4c6257bc18ed08ff83eacba7c2b1c0288d Mon Sep 17 00:00:00 2001 From: Amir Hardon Date: Fri, 21 Jun 2019 12:49:20 -0700 Subject: [PATCH] Don't hang to a platform view's input connection after it's disposed --- .../flutter/plugin/editing/TextInputPlugin.java | 15 +++++++++++++++ .../plugin/platform/PlatformViewsController.java | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java index 72b1f56167d95..9a72419016bfd 100644 --- a/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java +++ b/shell/platform/android/io/flutter/plugin/editing/TextInputPlugin.java @@ -237,6 +237,21 @@ public InputConnection getLastInputConnection() { return lastInputConnection; } + /** + * Clears a platform view text input client if it is the current input target. + * + * This is called when a platform view is disposed to make sure we're not hanging to a stale input + * connection. + */ + public void clearPlatformViewClient(int platformViewId) { + if (inputTarget.type == InputTarget.Type.PLATFORM_VIEW && inputTarget.id == platformViewId) { + inputTarget = new InputTarget(InputTarget.Type.NO_TARGET, 0); + hideTextInput(mView); + mImm.restartInput(mView); + mRestartInputPending = false; + } + } + private void showTextInput(View view) { view.requestFocus(); mImm.showSoftInput(view, 0); diff --git a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java index 334d2d18dcfd9..8ea704b39c733 100644 --- a/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java +++ b/shell/platform/android/io/flutter/plugin/platform/PlatformViewsController.java @@ -135,8 +135,11 @@ public void disposePlatformView(int viewId) { + viewId); } - contextToPlatformView.remove(vdController.getView().getContext()); + if (textInputPlugin != null) { + textInputPlugin.clearPlatformViewClient(viewId); + } + contextToPlatformView.remove(vdController.getView().getContext()); vdController.dispose(); vdControllers.remove(viewId); }