1 package com.testrunner; 2 3 import android.app.Application; 4 import android.content.Context; 5 import android.content.res.Configuration; 6 import androidx.annotation.NonNull; 7 import androidx.annotation.Nullable; 8 9 import com.facebook.react.PackageList; 10 import com.facebook.react.ReactApplication; 11 import com.facebook.react.ReactInstanceManager; 12 import com.facebook.react.ReactNativeHost; 13 import com.facebook.react.ReactPackage; 14 import com.facebook.react.config.ReactFeatureFlags; 15 import com.facebook.soloader.SoLoader; 16 import com.testrunner.newarchitecture.MainApplicationReactNativeHost; 17 18 import expo.interfaces.devmenu.DevMenuPreferencesInterface; 19 import expo.modules.ApplicationLifecycleDispatcher; 20 import expo.modules.ReactNativeHostWrapper; 21 import expo.modules.devmenu.DevMenuDefaultPreferences; 22 import expo.modules.devmenu.DevMenuManager; 23 import expo.modules.devmenu.tests.DevMenuTestInterceptor; 24 25 import java.lang.reflect.InvocationTargetException; 26 import java.util.List; 27 28 public class MainApplication extends Application implements ReactApplication { 29 private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper( 30 this, 31 new ReactNativeHost(this) { 32 @Override 33 public boolean getUseDeveloperSupport() { 34 return BuildConfig.DEBUG; 35 } 36 37 @Override 38 protected List<ReactPackage> getPackages() { 39 @SuppressWarnings("UnnecessaryLocalVariable") 40 List<ReactPackage> packages = new PackageList(this).getPackages(); 41 // Packages that cannot be autolinked yet can be added manually here, for example: 42 // packages.add(new MyReactNativePackage()); 43 return packages; 44 } 45 46 @Override 47 protected String getJSMainModuleName() { 48 return ".expo/.virtual-metro-entry"; 49 } 50 }); 51 52 private final ReactNativeHost mNewArchitectureNativeHost = 53 new ReactNativeHostWrapper(this, new MainApplicationReactNativeHost(this)); 54 55 @Override getReactNativeHost()56 public ReactNativeHost getReactNativeHost() { 57 if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) { 58 return mNewArchitectureNativeHost; 59 } else { 60 return mReactNativeHost; 61 } 62 } 63 64 @Override onCreate()65 public void onCreate() { 66 super.onCreate(); 67 // If you opted-in for the New Architecture, we enable the TurboModule system 68 ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED; 69 SoLoader.init(this, /* native exopackage */ false); 70 71 DevMenuManager.INSTANCE.setTestInterceptor(new DevMenuTestInterceptor() { 72 @Nullable 73 @Override 74 public DevMenuPreferencesInterface overrideSettings() { 75 return new DevMenuDefaultPreferences() { 76 @Override 77 public boolean getShowsAtLaunch() { 78 return false; 79 } 80 81 @Override 82 public boolean isOnboardingFinished() { 83 return true; 84 } 85 }; 86 } 87 }); 88 89 initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 90 ApplicationLifecycleDispatcher.onApplicationCreate(this); 91 } 92 93 @Override onConfigurationChanged(@onNull Configuration newConfig)94 public void onConfigurationChanged(@NonNull Configuration newConfig) { 95 super.onConfigurationChanged(newConfig); 96 ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig); 97 } 98 99 /** 100 * Loads Flipper in React Native templates. Call this in the onCreate method with something like 101 * initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); 102 * 103 * @param context 104 * @param reactInstanceManager 105 */ initializeFlipper( Context context, ReactInstanceManager reactInstanceManager)106 private static void initializeFlipper( 107 Context context, ReactInstanceManager reactInstanceManager) { 108 if (BuildConfig.DEBUG) { 109 try { 110 /* 111 We use reflection here to pick up the class that initializes Flipper, 112 since Flipper library is not available in release mode 113 */ 114 Class<?> aClass = Class.forName("com.testrunner.ReactNativeFlipper"); 115 aClass 116 .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) 117 .invoke(null, context, reactInstanceManager); 118 } catch (ClassNotFoundException e) { 119 e.printStackTrace(); 120 } catch (NoSuchMethodException e) { 121 e.printStackTrace(); 122 } catch (IllegalAccessException e) { 123 e.printStackTrace(); 124 } catch (InvocationTargetException e) { 125 e.printStackTrace(); 126 } 127 } 128 } 129 } 130