diff --git a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java index 7ba52567572..075a828f2e2 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/view/FlutterView.java @@ -7,6 +7,7 @@ package io.flutter.view; import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.res.Configuration; import android.graphics.Bitmap; import android.graphics.PixelFormat; @@ -129,7 +130,11 @@ public class FlutterView extends SurfaceView implements BinaryMessenger, Texture public FlutterView(Context context, AttributeSet attrs, FlutterNativeView nativeView) { super(context, attrs); - Activity activity = (Activity) getContext(); + Activity activity = getActivity(getContext()); + if (activity == null) { + throw new IllegalArgumentException("Bad context"); + } + if (nativeView == null) { mNativeView = new FlutterNativeView(activity.getApplicationContext()); } else { @@ -191,6 +196,20 @@ public class FlutterView extends SurfaceView implements BinaryMessenger, Texture sendLocalesToDart(getResources().getConfiguration()); sendUserPlatformSettingsToDart(); } + + private static Activity getActivity(Context context) { + if (context == null) { + return null; + } + if (context instanceof Activity) { + return (Activity) context; + } + if (context instanceof ContextWrapper) { + // Recurse up chain of base contexts until we find an Activity. + return getActivity(((ContextWrapper) context).getBaseContext()); + } + return null; + } @Override public boolean onKeyUp(int keyCode, KeyEvent event) {