package org.cuieney.videolife; import android.app.Activity; import android.app.Application; import android.content.Context; import android.support.multidex.MultiDex; import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; import com.github.moduth.blockcanary.BlockCanary; import com.github.moduth.blockcanary.BlockCanaryContext; import com.github.moduth.blockcanary.internal.BlockInfo; import com.squareup.leakcanary.LeakCanary; import com.zhy.autolayout.config.AutoLayoutConifg; import org.cuieney.videolife.common.utils.PreferenceUtil; import org.cuieney.videolife.di.component.AppComponent; import org.cuieney.videolife.di.component.DaggerAppComponent; import org.cuieney.videolife.di.module.AppModule; import org.cuieney.videolife.di.module.RetrofitModule; import org.json.JSONArray; import org.json.JSONException; import java.io.File; import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; /** * Created by cuieney on 17/2/21. */ public class App extends Application { private AppComponent appConponent; private static App app; private Set<Activity> allActivities; public static int SCREEN_WIDTH = -1; public static int SCREEN_HEIGHT = -1; public static float DIMEN_RATE = -1.0F; public static int DIMEN_DPI = -1; public static App getInstance() { return app; } @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } public void addActivity(Activity act) { if (allActivities == null) { allActivities = new HashSet<>(); } allActivities.add(act); } public void removeActivity(Activity act) { if (allActivities != null) { allActivities.remove(act); } } public void exitApp() { if (allActivities != null) { synchronized (allActivities) { for (Activity act : allActivities) { act.finish(); } } } android.os.Process.killProcess(android.os.Process.myPid()); System.exit(0); } public void getScreenSize() { WindowManager windowManager = (WindowManager)this.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics dm = new DisplayMetrics(); Display display = windowManager.getDefaultDisplay(); display.getMetrics(dm); DIMEN_RATE = dm.density / 1.0F; DIMEN_DPI = dm.densityDpi; SCREEN_WIDTH = dm.widthPixels; SCREEN_HEIGHT = dm.heightPixels; if(SCREEN_WIDTH > SCREEN_HEIGHT) { int t = SCREEN_HEIGHT; SCREEN_HEIGHT = SCREEN_WIDTH; SCREEN_WIDTH = t; } } @Override public void onCreate() { super.onCreate(); app = this; initAppComponent(); // AutoLayoutConifg.getInstance().useDeviceSize(); // getScreenSize(); // //内存泄漏检测 // if (LeakCanary.isInAnalyzerProcess(this)) { // return; // } // LeakCanary.install(this); // BlockCanary.install(this, new AppBlockCanaryContext()).start(); // CrashHandler.getInstance().initCrashHandler(this); } public AppComponent getAppComponent() { return appConponent; } private void initAppComponent() { appConponent = DaggerAppComponent.builder() .appModule(new AppModule(this)) .retrofitModule(new RetrofitModule(this)) .build(); } public class AppBlockCanaryContext extends BlockCanaryContext { // 实现各种上下文,包括应用标示符,用户uid,网络类型,卡慢判断阙值,Log保存位置等 /** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */ public String provideQualifier() { return "unknown"; } /** * Implement in your project. * * @return user id */ public String provideUid() { return "uid"; } /** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */ public String provideNetworkType() { return "unknown"; } /** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */ public int provideMonitorDuration() { return -1; } /** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */ public int provideBlockThreshold() { return 1000; } /** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */ public int provideDumpInterval() { return provideBlockThreshold(); } /** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */ public String providePath() { return "/blockcanary/"; } /** * If need notification to notice block. * * @return true if need, else if not need. */ public boolean displayNotification() { return true; } /** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */ public boolean zip(File[] src, File dest) { return false; } /** * Implement in your project, bundled log files. * * @param zippedFile zipped file */ public void upload(File zippedFile) { throw new UnsupportedOperationException(); } /** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */ public List<String> concernPackages() { return null; } /** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */ public boolean filterNonConcernStack() { return false; } /** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */ public List<String> provideWhiteList() { LinkedList<String> whiteList = new LinkedList<>(); whiteList.add("org.chromium"); return whiteList; } /** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */ public boolean deleteFilesInWhiteList() { return true; } /** * Block interceptor, developer may provide their own actions. */ public void onBlock(Context context, BlockInfo blockInfo) { } } }