package com.antfortune.freeline;
import android.app.Application;
import android.content.Context;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import android.util.Log;
import com.antfortune.freeline.util.ReflectUtil;
import java.lang.reflect.Constructor;
/**
* Created by huangyong on 16/9/14.
*/
public class FreelineApplication extends Application {
protected static final String TAG = "FreelineApplication";
private Class freelineConfigClazz;
private Application realApplication;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "FreelineApplication#onCreate()");
initFreelineConfig();
createRealApplication();
FreelineCore.init(this, realApplication);
startRealApplication();
}
@Override
public Context createPackageContext(String packageName, int flags) throws PackageManager.NameNotFoundException {
Context c = realApplication.createPackageContext(packageName, flags);
return c == null ? realApplication : c;
}
private void startRealApplication() {
if (realApplication != null) {
try {
ReflectUtil.invokeMethod(Application.class, realApplication, "attach", new Class[]{Context.class}, new Object[]{getBaseContext()});
Log.d(TAG, "realApplication#attach(Context)");
} catch (Exception e) {
FreelineCore.printStackTrace(e);
Log.e(TAG, "attach with realApplication error");
}
realApplication.onCreate();
Log.d(TAG, "realApplication#onCreate()");
}
}
private void initFreelineConfig() {
try {
freelineConfigClazz = Class.forName("com.antfortune.freeline.FreelineConfig");
} catch (Exception e) {
FreelineCore.printStackTrace(e);
Log.e(TAG, "initFreelineConfig error");
}
}
private String getConfigValue(String fieldName) {
try {
return ReflectUtil.getStaticFieldValue(freelineConfigClazz, fieldName).toString();
} catch (Exception e) {
FreelineCore.printStackTrace(e);
Log.e(TAG, "get config value error");
return "";
}
}
private void createRealApplication() {
String applicationClass = getConfigValue("applicationClass");
if (TextUtils.isEmpty(applicationClass)) {
realApplication = new Application();
Log.d(TAG, "create empty application.");
} else {
try {
Class realClass = Class.forName(applicationClass);
Constructor<? extends Application> constructor = realClass.getConstructor();
this.realApplication = constructor.newInstance();
Log.d(TAG, "create application: " + applicationClass);
} catch (Exception e) {
FreelineCore.printStackTrace(e);
Log.e(TAG, "create real application error");
}
}
}
}