From 7abcaafd6600535825aa8330af7290ba8acea245 Mon Sep 17 00:00:00 2001 From: David Vacca Date: Mon, 29 Jun 2020 15:25:40 -0700 Subject: [PATCH] Fix crash when updating dialog props after the Activity has disappeared Summary: This diff avoids accessing window and activities object that has dissapear changelog: [Android][Fix] Fix crash when updating RN dialog props after the activity disappeared Reviewed By: JoshuaGross Differential Revision: D22264672 fbshipit-source-id: 89c9895c8c6b6fec383a0e160847e5059616e265 --- .../react/views/modal/ReactModalHostView.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) 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 d5312acdb18672..e404e0d4e9730f 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 @@ -17,6 +17,7 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewStructure; +import android.view.Window; import android.view.WindowManager; import android.view.accessibility.AccessibilityEvent; import android.widget.FrameLayout; @@ -347,24 +348,26 @@ private void updateProperties() { Assertions.assertNotNull(mDialog, "mDialog must exist when we call updateProperties"); Activity currentActivity = getCurrentActivity(); - if (currentActivity != null) { - int activityWindowFlags = currentActivity.getWindow().getAttributes().flags; - if ((activityWindowFlags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) { - mDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } else { - mDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); - } + + Window window = mDialog.getWindow(); + if (currentActivity == null || currentActivity.isFinishing() || !window.isActive()) { + // If the activity has disappeared, then we shouldn't update the window associated to the + // Dialog. + return; + } + int activityWindowFlags = currentActivity.getWindow().getAttributes().flags; + if ((activityWindowFlags & WindowManager.LayoutParams.FLAG_FULLSCREEN) != 0) { + window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); + } else { + window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); } if (mTransparent) { - mDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); + window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND); } else { - mDialog.getWindow().setDimAmount(0.5f); - mDialog - .getWindow() - .setFlags( - WindowManager.LayoutParams.FLAG_DIM_BEHIND, - WindowManager.LayoutParams.FLAG_DIM_BEHIND); + window.setDimAmount(0.5f); + window.setFlags( + WindowManager.LayoutParams.FLAG_DIM_BEHIND, WindowManager.LayoutParams.FLAG_DIM_BEHIND); } }