| package com.doumee.lib_coremodel.config; | 
|   | 
| import android.content.Context; | 
| import android.content.pm.ApplicationInfo; | 
| import android.content.pm.PackageManager; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.List; | 
|   | 
| import timber.log.Timber; | 
|   | 
| /** | 
|  * @see <a href="https://github.com/bumptech/glide/blob/f7d860412f061e059aa84a42f2563a01ac8c303b/library/src/main/java/com/bumptech/glide/module/ManifestParser.java">Glide</a> | 
|  * @author <a href="mailto:jenly1314@gmail.com">Jenly</a> | 
|  */ | 
| public final class ManifestParser { | 
|     private static final String CONFIG_MODULE_VALUE = "FrameConfigModule"; | 
|   | 
|     private final Context context; | 
|   | 
|     public ManifestParser(Context context) { | 
|         this.context = context; | 
|     } | 
|   | 
|     @SuppressWarnings("deprecation") | 
|     public List<FrameConfigModule> parse() { | 
|         Timber.d("Loading MVVMFrame modules"); | 
|         List<FrameConfigModule> modules = new ArrayList<>(); | 
|         try { | 
|             ApplicationInfo appInfo = context.getPackageManager() | 
|                     .getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA); | 
|             if (appInfo.metaData == null) { | 
|                     Timber.d( "Got null app info metadata"); | 
|                 return modules; | 
|             } | 
|             Timber.v("Got app info metadata: " + appInfo.metaData); | 
|             for (String key : appInfo.metaData.keySet()) { | 
|                 if (CONFIG_MODULE_VALUE.equals(appInfo.metaData.get(key))) { | 
|                     modules.add(parseModule(key)); | 
|                     Timber.d( "Loaded MVVMFrame module: " + key); | 
|                 } | 
|             } | 
|         } catch (PackageManager.NameNotFoundException e) { | 
|             throw new RuntimeException("Unable to find metadata to parse FrameConfigModules", e); | 
|         } | 
|         Timber.d( "Finished loading MVVMFrame modules"); | 
|   | 
|         return modules; | 
|     } | 
|   | 
|     private static FrameConfigModule parseModule(String className) { | 
|         Class<?> clazz; | 
|         try { | 
|             clazz = Class.forName(className); | 
|         } catch (ClassNotFoundException e) { | 
|             throw new IllegalArgumentException("Unable to find FrameConfigModule implementation", e); | 
|         } | 
|   | 
|         Object module; | 
|         try { | 
|             module = clazz.newInstance(); | 
|         } catch (InstantiationException e) { | 
|             throw new RuntimeException("Unable to instantiate FrameConfigModule implementation for " + clazz, | 
|                     e); | 
|             // These can't be combined until API minimum is 19. | 
|         } catch (IllegalAccessException e) { | 
|             throw new RuntimeException("Unable to instantiate FrameConfigModule implementation for " + clazz, | 
|                     e); | 
|         } | 
|   | 
|         if (!(module instanceof FrameConfigModule)) { | 
|             throw new RuntimeException("Expected instanceof FrameConfigModule, but found: " + module); | 
|         } | 
|         return (FrameConfigModule) module; | 
|     } | 
| } |