package com.dl7.mvp;
import android.annotation.TargetApi;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.support.multidex.MultiDex;
import com.dl7.downloaderlib.DownloadConfig;
import com.dl7.downloaderlib.FileDownloader;
import com.dl7.mvp.api.RetrofitService;
import com.dl7.mvp.engine.DownloaderWrapper;
import com.dl7.mvp.injector.components.ApplicationComponent;
import com.dl7.mvp.injector.components.DaggerApplicationComponent;
import com.dl7.mvp.injector.modules.ApplicationModule;
import com.dl7.mvp.local.dao.NewsTypeDao;
import com.dl7.mvp.local.table.DaoMaster;
import com.dl7.mvp.local.table.DaoSession;
import com.dl7.mvp.rxbus.RxBus;
import com.dl7.mvp.utils.CrashHandler;
import com.dl7.mvp.utils.DownloadUtils;
import com.dl7.mvp.utils.PreferencesUtils;
import com.dl7.mvp.utils.ToastUtils;
import com.dl7.tinkerlib.Log.MyLogImp;
import com.dl7.tinkerlib.util.TinkerManager;
import com.orhanobut.logger.Logger;
import com.squareup.leakcanary.LeakCanary;
import com.tencent.tinker.anno.DefaultLifeCycle;
import com.tencent.tinker.lib.tinker.Tinker;
import com.tencent.tinker.lib.tinker.TinkerInstaller;
import com.tencent.tinker.loader.app.DefaultApplicationLike;
import com.tencent.tinker.loader.shareutil.ShareConstants;
import org.greenrobot.greendao.database.Database;
import java.io.File;
/**
* Created by long on 2016/8/19.
* Application
*/
@SuppressWarnings("unused")
@DefaultLifeCycle(application = "com.dl7.mvp.MvpApplication",
flags = ShareConstants.TINKER_ENABLE_ALL,
loadVerifyFlag = false)
public class AndroidApplication extends DefaultApplicationLike {
private static final String DB_NAME = "news-db";
private static ApplicationComponent sAppComponent;
private static Context sContext;
private DaoSession mDaoSession;
// 因为下载那边需要用,这里在外面实例化在通过 ApplicationModule 设置
private RxBus mRxBus = new RxBus();
public AndroidApplication(Application application, int tinkerFlags, boolean tinkerLoadVerifyFlag, long applicationStartElapsedTime, long applicationStartMillisTime, Intent tinkerResultIntent) {
super(application, tinkerFlags, tinkerLoadVerifyFlag, applicationStartElapsedTime, applicationStartMillisTime, tinkerResultIntent);
}
/**
* install multiDex before install tinker
* so we don't need to put the tinker lib classes in the main dex
*
* @param base
*/
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
@Override
public void onBaseContextAttached(Context base) {
super.onBaseContextAttached(base);
sContext = getApplication();
//you must install multiDex whatever tinker is installed!
MultiDex.install(base);
TinkerManager.setTinkerApplicationLike(this);
TinkerManager.initFastCrashProtect();
//should set before tinker is installed
TinkerManager.setUpgradeRetryEnable(true);
//optional set logIml, or you can use default debug log
TinkerInstaller.setLogIml(new MyLogImp());
//installTinker after load multiDex
//or you can put com.tencent.tinker.** to main dex
TinkerManager.installTinker(this);
Tinker tinker = Tinker.with(getApplication());
}
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH)
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
getApplication().registerActivityLifecycleCallbacks(callback);
}
@Override
public void onCreate() {
super.onCreate();
_initDatabase();
_initInjector();
_initConfig();
}
/**
* 使用Tinker生成Application,这里改成静态调用
* @return
*/
public static ApplicationComponent getAppComponent() {
return sAppComponent;
}
public static Context getContext() {
return sContext;
}
/**
* 初始化注射器
*/
private void _initInjector() {
// 这里不做注入操作,只提供一些全局单例数据
sAppComponent = DaggerApplicationComponent.builder()
.applicationModule(new ApplicationModule(this, mDaoSession, mRxBus))
.build();
}
/**
* 初始化数据库
*/
private void _initDatabase() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(getApplication(), DB_NAME);
Database database = helper.getWritableDb();
mDaoSession = new DaoMaster(database).newSession();
NewsTypeDao.updateLocalData(getApplication(), mDaoSession);
DownloadUtils.init(mDaoSession.getBeautyPhotoInfoDao());
}
/**
* 初始化配置
*/
private void _initConfig() {
if (BuildConfig.DEBUG) {
LeakCanary.install(getApplication());
Logger.init("LogTAG");
}
CrashHandler.getInstance().init(getApplication());
RetrofitService.init();
ToastUtils.init(getApplication());
DownloaderWrapper.init(mRxBus, mDaoSession.getVideoInfoDao());
FileDownloader.init(getApplication());
DownloadConfig config = new DownloadConfig.Builder()
.setDownloadDir(PreferencesUtils.getSavePath(getApplication()) + File.separator + "video/").build();
FileDownloader.setConfig(config);
}
}