Skip to content

Commit

Permalink
Do not crash when the main activity is unavailable
Browse files Browse the repository at this point in the history
The React Native application context has a method for obtaining the current Android activity, but this sometimes returns null. We believe this happens due to a race condition between the Javascript engine and the native code, but we aren't completely sure. What we do know is that this situation happens in the wild, since it shows up in our Bugsnag reports.

The fix is the leave the BlurView native component uninitialized in these cases. This prevents it from rendering anything, but that's preferable to crashing the whole app.
  • Loading branch information
swansontec committed Sep 29, 2020
1 parent 79f338b commit 03dfe7d
Showing 1 changed file with 11 additions and 11 deletions.
22 changes: 11 additions & 11 deletions android/src/main/java/com/cmcewen/blurview/BlurViewManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,9 @@
import android.view.ViewGroup;

import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.annotations.ReactProp;

import java.util.Objects;

import javax.annotation.Nonnull;

import eightbitlab.com.blurview.BlurView;
Expand All @@ -32,14 +29,17 @@ class BlurViewManager extends ViewGroupManager<BlurView> {
@Override
public @Nonnull BlurView createViewInstance(@Nonnull ThemedReactContext ctx) {
BlurView blurView = new BlurView(ctx);
View decorView = Objects.requireNonNull(ctx.getCurrentActivity()).getWindow().getDecorView();
ViewGroup rootView = decorView.findViewById(android.R.id.content);
Drawable windowBackground = decorView.getBackground();
blurView.setupWith(rootView)
.setFrameClearDrawable(windowBackground)
.setBlurAlgorithm(new RenderScriptBlur(ctx))
.setBlurRadius(defaultRadius)
.setHasFixedTransformationMatrix(false);
Activity currentActivity = ctx.getCurrentActivity();
if (currentActivity != null) {
View decorView = currentActivity.getWindow().getDecorView();
ViewGroup rootView = decorView.findViewById(android.R.id.content);
Drawable windowBackground = decorView.getBackground();
blurView.setupWith(rootView)
.setFrameClearDrawable(windowBackground)
.setBlurAlgorithm(new RenderScriptBlur(ctx))
.setBlurRadius(defaultRadius)
.setHasFixedTransformationMatrix(false);
}
return blurView;
}

Expand Down

0 comments on commit 03dfe7d

Please sign in to comment.