From 16b955bd1f6b321cbe88cc628c5e8bdd1ba57cc2 Mon Sep 17 00:00:00 2001 From: Andrew Jack Date: Wed, 9 May 2018 13:04:40 -0700 Subject: [PATCH] Fix Android modal crash: android.view.WindowManager$BadTokenException Summary: Fixes a crash with the Android Dialog. This occurs when the Activity is finishing or has been removed and React Native requests the modal to be shown. Stacktrace here: ``` Caused by android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@f125ea3 is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:683) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:319) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:85) at android.app.Dialog.show(Dialog.java:326) at com.facebook.react.views.modal.ReactModalHostView.showOrUpdate(ReactModalHostView.java:256) at com.facebook.react.views.modal.ReactModalHostManager.onAfterUpdateTransaction(ReactModalHostManager.java:107) at com.facebook.react.views.modal.ReactModalHostManager.onAfterUpdateTransaction(ReactModalHostManager.java:28) at com.facebook.react.uimanager.ViewManager.updateProperties(ViewManager.java:35) at com.facebook.react.uimanager.NativeViewHierarchyManager.createView(NativeViewHierarchyManager.java:233) at com.facebook.react.uimanager.UIViewOperationQueue$CreateViewOperation.execute(UIViewOperationQueue.java:153) at com.facebook.react.uimanager.UIViewOperationQueue$1.run(UIViewOperationQueue.java:816) at com.facebook.react.uimanager.UIViewOperationQueue.flushPendingBatches(UIViewOperationQueue.java:929) at com.facebook.react.uimanager.UIViewOperationQueue.access$2100(UIViewOperationQueue.java:47) at com.facebook.react.uimanager.UIViewOperationQueue$2.runGuarded(UIViewOperationQueue.java:887) at com.facebook.react.bridge.GuardedRunnable.run(GuardedRunnable.java:21) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:207) at android.app.ActivityThread.main(ActivityThread.java:5728) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) ``` Related issues: #18570 & #18634 mdvacca added to this file in https://github.com/facebook/react-native/commit/e5c2a66897b9c562c549e63adcf70783ea34c418 Doesn't look like the issue was introduced in the above change, but it masks the issue. The wrapping if block should not allow a null activity to display a dialog. Run sample app on Android and display dialog when app is about to close. [ANDROID] [BUGFIX] [Modal] - Fix Android BadTokenException crash Closes https://github.com/facebook/react-native/pull/18996 Differential Revision: D7938147 Pulled By: hramos fbshipit-source-id: f4ffd1746304d6184d727339072a7e926ffdaf39 --- .../java/com/facebook/react/views/modal/ReactModalHostView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java index 00eac510a..ab0491fe4 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java +++ b/ReactAndroid/src/main/java/com/facebook/react/views/modal/ReactModalHostView.java @@ -250,7 +250,7 @@ public class ReactModalHostView extends ViewGroup implements LifecycleEventListe if (mHardwareAccelerated) { mDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); } - if (currentActivity == null || !currentActivity.isFinishing()) { + if (currentActivity != null && !currentActivity.isFinishing()) { mDialog.show(); } }