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