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