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 Glide
* @author Jenly
*/
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 parse() {
Timber.d("Loading MVVMFrame modules");
List 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;
}
}