diff --git a/android/expoview/src/main/AndroidManifest.xml b/android/expoview/src/main/AndroidManifest.xml index 50be3c41656ee..9ebf0551156fa 100644 --- a/android/expoview/src/main/AndroidManifest.xml +++ b/android/expoview/src/main/AndroidManifest.xml @@ -106,6 +106,11 @@ android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> + + diff --git a/android/expoview/src/main/java/host/exp/exponent/ExpoApplication.java b/android/expoview/src/main/java/host/exp/exponent/ExpoApplication.java index 40035a7e60d52..9c1fd4dd1f823 100644 --- a/android/expoview/src/main/java/host/exp/exponent/ExpoApplication.java +++ b/android/expoview/src/main/java/host/exp/exponent/ExpoApplication.java @@ -53,8 +53,6 @@ public void onCreate() { if (!Constants.isStandaloneApp()) { KernelConstants.MAIN_ACTIVITY_CLASS = LauncherActivity.class; } - - AppLoaderProvider.registerLoader(this, "react-native-headless", ExpoHeadlessAppLoader.class); KernelProvider.setFactory(new KernelProvider.KernelFactory() { @Override public KernelInterface create() { @@ -62,7 +60,7 @@ public KernelInterface create() { } }); - ExponentKernelModuleProvider.setFactory(reactContext -> new ExponentKernelModule(reactContext)); + ExponentKernelModuleProvider.setFactory(ExponentKernelModule::new); Exponent.initialize(this, this); NativeModuleDepsProvider.getInstance().add(Kernel.class, KernelProvider.getInstance()); diff --git a/android/versioned-abis/expoview-abi37_0_0/src/main/java/abi37_0_0/org/unimodules/adapters/react/ReactAdapterPackage.java b/android/versioned-abis/expoview-abi37_0_0/src/main/java/abi37_0_0/org/unimodules/adapters/react/ReactAdapterPackage.java index b2ac8831b4941..93e9258d1d1f1 100644 --- a/android/versioned-abis/expoview-abi37_0_0/src/main/java/abi37_0_0/org/unimodules/adapters/react/ReactAdapterPackage.java +++ b/android/versioned-abis/expoview-abi37_0_0/src/main/java/abi37_0_0/org/unimodules/adapters/react/ReactAdapterPackage.java @@ -26,7 +26,6 @@ public class ReactAdapterPackage extends BasePackage { @Override public List createInternalModules(Context context) { - AppLoaderProvider.registerLoader(context, "react-native-headless", RNHeadlessAppLoader.class); // We can force-cast here, because this package will only be used in React Native context. ReactContext reactContext = (ReactContext) context; return Arrays.asList( diff --git a/packages/@unimodules/react-native-adapter/android/src/main/AndroidManifest.xml b/packages/@unimodules/react-native-adapter/android/src/main/AndroidManifest.xml index e63893dfe2b96..ad5d93b80b46d 100644 --- a/packages/@unimodules/react-native-adapter/android/src/main/AndroidManifest.xml +++ b/packages/@unimodules/react-native-adapter/android/src/main/AndroidManifest.xml @@ -1,5 +1,11 @@ + - + + + diff --git a/packages/@unimodules/react-native-adapter/android/src/main/java/org/unimodules/adapters/react/ReactAdapterPackage.java b/packages/@unimodules/react-native-adapter/android/src/main/java/org/unimodules/adapters/react/ReactAdapterPackage.java index 4613be46e7771..20fd42d8a2ec6 100644 --- a/packages/@unimodules/react-native-adapter/android/src/main/java/org/unimodules/adapters/react/ReactAdapterPackage.java +++ b/packages/@unimodules/react-native-adapter/android/src/main/java/org/unimodules/adapters/react/ReactAdapterPackage.java @@ -26,7 +26,6 @@ public class ReactAdapterPackage extends BasePackage { @Override public List createInternalModules(Context context) { - AppLoaderProvider.registerLoader(context, "react-native-headless", RNHeadlessAppLoader.class); // We can force-cast here, because this package will only be used in React Native context. ReactContext reactContext = (ReactContext) context; return Arrays.asList( diff --git a/packages/unimodules-app-loader/android/src/main/java/org/unimodules/apploader/AppLoaderProvider.java b/packages/unimodules-app-loader/android/src/main/java/org/unimodules/apploader/AppLoaderProvider.java index d12b36634c96f..ea5ac4cbf818b 100644 --- a/packages/unimodules-app-loader/android/src/main/java/org/unimodules/apploader/AppLoaderProvider.java +++ b/packages/unimodules-app-loader/android/src/main/java/org/unimodules/apploader/AppLoaderProvider.java @@ -1,7 +1,7 @@ package org.unimodules.apploader; import android.content.Context; -import android.content.SharedPreferences; +import android.content.pm.PackageManager; import android.util.Log; import java.util.HashMap; @@ -9,23 +9,8 @@ public class AppLoaderProvider { - private static Map loaderClasses = new HashMap<>(); private static Map loaders = new HashMap<>(); - public static void registerLoader(Context context, String name, Class loaderClass) { - registerLoader(context, name, loaderClass, false); - } - - public static void registerLoader(Context context, String name, Class loaderClass, boolean overload) { - if (!overload) { - if (appLoaderRegisteredForName(context, name, loaderClass)) return; - } - getSharedPreferences(context).edit() - .putString(appLoaderKey(name), loaderClass.getName()) - .apply(); - loaderClasses.put(name, loaderClass); - } - public static HeadlessAppLoader getLoader(String name, Context context) { if (!loaders.containsKey(name)) { try { @@ -39,32 +24,21 @@ public static HeadlessAppLoader getLoader(String name, Context context) { return loaders.get(name); } - private static boolean appLoaderRegisteredForName(Context context, String name, Class loaderClass) { - String cachedClassName = getSharedPreferences(context).getString(appLoaderKey(name), null); - return loaderClasses.containsKey(name) && loaderClass.getName().equals(cachedClassName); - } - + @SuppressWarnings("unchecked") private static void createLoader(String name, Context context) throws ClassNotFoundException, IllegalAccessException, InstantiationException, java.lang.reflect.InvocationTargetException, NoSuchMethodException { - Class loaderClass = loaderClasses.get(name); - if (loaderClass == null) { - String loaderClassName = getSharedPreferences(context) - .getString(appLoaderKey(name), null); + Class loaderClass; + try { + String loaderClassName = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData.getString("org.unimodules.core.AppLoader#" + name); if (loaderClassName != null) { - loaderClass = Class.forName(loaderClassName); + loaderClass = (Class)Class.forName(loaderClassName); + loaders.put(name, (HeadlessAppLoader) loaderClass.getDeclaredConstructor(Context.class).newInstance(context)); + } else { + throw new IllegalStateException("Unable to instantiate AppLoader!"); } + } catch (PackageManager.NameNotFoundException e) { + throw new IllegalStateException("Unable to instantiate AppLoader!", e); } - loaders.put(name, (HeadlessAppLoader) loaderClass.getDeclaredConstructor(Context.class).newInstance(context)); - } - - private static final String APP_LOADER_PREFERENCES_NAME = "appLoader_config"; - private static final String KEY_LOADER_PREFIX = "appLoader_"; - - private static String appLoaderKey(String appLoaderName) { - return KEY_LOADER_PREFIX + appLoaderName; - } - private static SharedPreferences getSharedPreferences(Context context) { - return context.getSharedPreferences(APP_LOADER_PREFERENCES_NAME, Context.MODE_PRIVATE); } public static abstract class Callback {