diff --git a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java index 6a12bf0ccd8..52c65ca855d 100644 --- a/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java +++ b/engine/src/flutter/shell/platform/android/io/flutter/embedding/android/FlutterFragmentActivity.java @@ -326,9 +326,8 @@ public class FlutterFragmentActivity extends FragmentActivity private Drawable getSplashScreenFromManifest() { try { Bundle metaData = getMetaData(); - Integer splashScreenId = - metaData != null ? metaData.getInt(SPLASH_SCREEN_META_DATA_KEY) : null; - return splashScreenId != null + int splashScreenId = metaData != null ? metaData.getInt(SPLASH_SCREEN_META_DATA_KEY) : 0; + return splashScreenId != 0 ? ResourcesCompat.getDrawable(getResources(), splashScreenId, getTheme()) : null; } catch (Resources.NotFoundException e) { diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java index 9b7eb08626e..b88460b3cb4 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterActivityTest.java @@ -416,6 +416,26 @@ public class FlutterActivityTest { assertNotNull(splashScreen); } + @Test + public void itWithMetadataWithoutSplashScreenResourceKeyDoesNotProvideSplashScreen() + throws PackageManager.NameNotFoundException { + Intent intent = FlutterActivity.createDefaultIntent(RuntimeEnvironment.application); + ActivityController activityController = + Robolectric.buildActivity(FlutterActivity.class, intent); + FlutterActivity flutterActivity = activityController.get(); + + // Setup an empty metadata file. + PackageManager pm = RuntimeEnvironment.application.getPackageManager(); + ActivityInfo activityInfo = + pm.getActivityInfo(flutterActivity.getComponentName(), PackageManager.GET_META_DATA); + activityInfo.metaData = new Bundle(); + shadowOf(RuntimeEnvironment.application.getPackageManager()).addOrUpdateActivity(activityInfo); + + // It should not load the drawable. + SplashScreen splashScreen = flutterActivity.provideSplashScreen(); + assertNull(splashScreen); + } + static class FlutterActivityWithProvidedEngine extends FlutterActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { diff --git a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java index 0f222a278d0..93226dac459 100644 --- a/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java +++ b/engine/src/flutter/shell/platform/android/test/io/flutter/embedding/android/FlutterFragmentActivityTest.java @@ -243,15 +243,15 @@ public class FlutterFragmentActivityTest { @Config(shadows = {SplashShadowResources.class}) public void itLoadsSplashScreenDrawable() throws PackageManager.NameNotFoundException { TestUtils.setApiVersion(19); - Intent intent = FlutterActivity.createDefaultIntent(RuntimeEnvironment.application); - ActivityController activityController = - Robolectric.buildActivity(FlutterActivity.class, intent); - FlutterActivity flutterActivity = activityController.get(); + Intent intent = FlutterFragmentActivity.createDefaultIntent(RuntimeEnvironment.application); + ActivityController activityController = + Robolectric.buildActivity(FlutterFragmentActivity.class, intent); + FlutterFragmentActivity activity = activityController.get(); // Inject splash screen drawable resource id in the metadata PackageManager pm = RuntimeEnvironment.application.getPackageManager(); ActivityInfo activityInfo = - pm.getActivityInfo(flutterActivity.getComponentName(), PackageManager.GET_META_DATA); + pm.getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA); activityInfo.metaData = new Bundle(); activityInfo.metaData.putInt( FlutterActivityLaunchConfigs.SPLASH_SCREEN_META_DATA_KEY, @@ -259,7 +259,7 @@ public class FlutterFragmentActivityTest { shadowOf(RuntimeEnvironment.application.getPackageManager()).addOrUpdateActivity(activityInfo); // It should load the drawable. - SplashScreen splashScreen = flutterActivity.provideSplashScreen(); + SplashScreen splashScreen = activity.provideSplashScreen(); assertNotNull(splashScreen); } @@ -271,15 +271,15 @@ public class FlutterFragmentActivityTest { // in getDrawable methods. This test verifies it by fetching a (fake) themed drawable. // On failure, a Resource.NotFoundException will ocurr. TestUtils.setApiVersion(21); - Intent intent = FlutterActivity.createDefaultIntent(RuntimeEnvironment.application); - ActivityController activityController = - Robolectric.buildActivity(FlutterActivity.class, intent); - FlutterActivity flutterActivity = activityController.get(); + Intent intent = FlutterFragmentActivity.createDefaultIntent(RuntimeEnvironment.application); + ActivityController activityController = + Robolectric.buildActivity(FlutterFragmentActivity.class, intent); + FlutterFragmentActivity activity = activityController.get(); // Inject themed splash screen drawable resource id in the metadata. PackageManager pm = RuntimeEnvironment.application.getPackageManager(); ActivityInfo activityInfo = - pm.getActivityInfo(flutterActivity.getComponentName(), PackageManager.GET_META_DATA); + pm.getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA); activityInfo.metaData = new Bundle(); activityInfo.metaData.putInt( FlutterActivityLaunchConfigs.SPLASH_SCREEN_META_DATA_KEY, @@ -287,10 +287,30 @@ public class FlutterFragmentActivityTest { shadowOf(RuntimeEnvironment.application.getPackageManager()).addOrUpdateActivity(activityInfo); // It should load the drawable. - SplashScreen splashScreen = flutterActivity.provideSplashScreen(); + SplashScreen splashScreen = activity.provideSplashScreen(); assertNotNull(splashScreen); } + @Test + public void itWithMetadataWithoutSplashScreenResourceKeyDoesNotProvideSplashScreen() + throws PackageManager.NameNotFoundException { + Intent intent = FlutterFragmentActivity.createDefaultIntent(RuntimeEnvironment.application); + ActivityController activityController = + Robolectric.buildActivity(FlutterFragmentActivity.class, intent); + FlutterFragmentActivity activity = activityController.get(); + + // Setup an empty metadata file. + PackageManager pm = RuntimeEnvironment.application.getPackageManager(); + ActivityInfo activityInfo = + pm.getActivityInfo(activity.getComponentName(), PackageManager.GET_META_DATA); + activityInfo.metaData = new Bundle(); + shadowOf(RuntimeEnvironment.application.getPackageManager()).addOrUpdateActivity(activityInfo); + + // It should not load the drawable. + SplashScreen splashScreen = activity.provideSplashScreen(); + assertNull(splashScreen); + } + static class FlutterFragmentActivityWithProvidedEngine extends FlutterFragmentActivity { int numberOfEnginesCreated = 0;