1 package expo.modules.apploader; 2 3 import android.content.Context; 4 import android.content.pm.PackageManager; 5 import android.util.Log; 6 7 import java.util.HashMap; 8 import java.util.Map; 9 10 public class AppLoaderProvider { 11 12 private static Map<String, HeadlessAppLoader> loaders = new HashMap<>(); 13 getLoader(String name, Context context)14 public static HeadlessAppLoader getLoader(String name, Context context) { 15 if (!loaders.containsKey(name)) { 16 try { 17 createLoader(name, context); 18 } catch (Exception e) { 19 Log.e("Expo", "Cannot initialize app loader. " + e.getMessage()); 20 e.printStackTrace(); 21 return null; 22 } 23 } 24 return loaders.get(name); 25 } 26 27 @SuppressWarnings("unchecked") createLoader(String name, Context context)28 private static void createLoader(String name, Context context) throws ClassNotFoundException, IllegalAccessException, InstantiationException, java.lang.reflect.InvocationTargetException, NoSuchMethodException { 29 Class<? extends HeadlessAppLoader> loaderClass; 30 try { 31 String loaderClassName = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA).metaData.getString("org.unimodules.core.AppLoader#" + name); 32 if (loaderClassName != null) { 33 loaderClass = (Class<? extends HeadlessAppLoader>)Class.forName(loaderClassName); 34 loaders.put(name, (HeadlessAppLoader) loaderClass.getDeclaredConstructor(Context.class).newInstance(context)); 35 } else { 36 throw new IllegalStateException("Unable to instantiate AppLoader!"); 37 } 38 } catch (PackageManager.NameNotFoundException e) { 39 throw new IllegalStateException("Unable to instantiate AppLoader!", e); 40 } 41 42 } 43 44 public static abstract class Callback { 45 onComplete(boolean success, Exception exception)46 public void onComplete(boolean success, Exception exception) { 47 // nothing 48 } 49 } 50 } 51