|
|
|
|
|
package com.rehome.zhdcoa;
|
|
|
|
|
|
|
|
|
|
|
|
import android.content.Context;
|
|
|
|
|
|
import android.content.pm.ApplicationInfo;
|
|
|
|
|
|
import android.content.pm.PackageManager;
|
|
|
|
|
|
import android.os.Build;
|
|
|
|
|
|
import android.text.TextUtils;
|
|
|
|
|
|
import android.util.Log;
|
|
|
|
|
|
import android.widget.Toast;
|
|
|
|
|
|
|
|
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
|
|
import androidx.emoji.bundled.BundledEmojiCompatConfig;
|
|
|
|
|
|
import androidx.emoji.text.EmojiCompat;
|
|
|
|
|
|
import androidx.multidex.MultiDex;
|
|
|
|
|
|
|
|
|
|
|
|
//import com.blankj.utilcode.util.Utils;
|
|
|
|
|
|
import com.github.mikephil.charting.utils.Utils;
|
|
|
|
|
|
//import com.hjq.http.EasyConfig;
|
|
|
|
|
|
//import com.hjq.http.config.IRequestInterceptor;
|
|
|
|
|
|
//import com.hjq.http.config.IRequestServer;
|
|
|
|
|
|
//import com.hjq.http.model.HttpHeaders;
|
|
|
|
|
|
//import com.hjq.http.model.HttpParams;
|
|
|
|
|
|
import com.rehome.zhdcoa.bean.UserInfoBean;
|
|
|
|
|
|
import com.rehome.zhdcoa.ui.activity.VpnAuthActivity;
|
|
|
|
|
|
import com.rehome.zhdcoa.utils.DpPxSpTransformUtil;
|
|
|
|
|
|
import com.rehome.zhdcoa.utils.SPUtils;
|
|
|
|
|
|
//import com.squareup.leakcanary.LeakCanary;
|
|
|
|
|
|
//import com.squareup.leakcanary.RefWatcher;
|
|
|
|
|
|
import com.rehome.zhdcoa.vpn.GlobalListenerManager;
|
|
|
|
|
|
import com.sangfor.sdk.SFUemSDK;
|
|
|
|
|
|
import com.sangfor.sdk.base.SFBaseMessage;
|
|
|
|
|
|
import com.sangfor.sdk.base.SFSDKExtras;
|
|
|
|
|
|
import com.sangfor.sdk.base.SFSDKFlags;
|
|
|
|
|
|
import com.sangfor.sdk.base.SFSDKMode;
|
|
|
|
|
|
import com.sangfor.sdk.base.SFSetSpaConfigListener;
|
|
|
|
|
|
import com.sangfor.sdk.utils.SFLogN;
|
|
|
|
|
|
import com.tencent.bugly.crashreport.CrashReport;
|
|
|
|
|
|
import com.xuexiang.xui.XUI;
|
|
|
|
|
|
import com.yolanda.nohttp.NoHttp;
|
|
|
|
|
|
import com.zhy.autolayout.config.AutoLayoutConifg;
|
|
|
|
|
|
|
|
|
|
|
|
import org.litepal.LitePalApplication;
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.HashMap;
|
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
|
|
|
|
|
|
|
public class App extends LitePalApplication {
|
|
|
|
|
|
|
|
|
|
|
|
private UserInfoBean.UserInfo userInfo;
|
|
|
|
|
|
|
|
|
|
|
|
private String DateSave;
|
|
|
|
|
|
|
|
|
|
|
|
public String getDateSave() {
|
|
|
|
|
|
return DateSave;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void setDateSave(String dateSave) {
|
|
|
|
|
|
DateSave = dateSave;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private static App mInstance;
|
|
|
|
|
|
//public static boolean mIsInitTBSSuccess = false;
|
|
|
|
|
|
public static boolean mqttIsInit = false;
|
|
|
|
|
|
private int activityAount = 0;
|
|
|
|
|
|
private boolean isForeground = false;
|
|
|
|
|
|
|
|
|
|
|
|
public static Context mContext;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static App getInstance() {
|
|
|
|
|
|
return mInstance;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//private RefWatcher refWatcher;
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void onCreate() {
|
|
|
|
|
|
super.onCreate();
|
|
|
|
|
|
|
|
|
|
|
|
mInstance = this;
|
|
|
|
|
|
|
|
|
|
|
|
// if (LeakCanary.isInAnalyzerProcess(this)) { //1
|
|
|
|
|
|
// // This process is dedicated to LeakCanary for heap analysis.
|
|
|
|
|
|
// // You should not init your app in this process.
|
|
|
|
|
|
// return;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
//refWatcher = LeakCanary.install(this);
|
|
|
|
|
|
|
|
|
|
|
|
NoHttp.initialize(this);
|
|
|
|
|
|
MultiDex.install(this);
|
|
|
|
|
|
NoHttp.setDefaultConnectTimeout(6 * 1000);
|
|
|
|
|
|
NoHttp.setDefaultReadTimeout(60 * 1000);
|
|
|
|
|
|
initUser();
|
|
|
|
|
|
AutoLayoutConifg.getInstance().useDeviceSize();
|
|
|
|
|
|
Utils.init(this);
|
|
|
|
|
|
XUI.init(this); //初始化UI框架
|
|
|
|
|
|
|
|
|
|
|
|
CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
|
|
|
|
|
|
// 通过UserStrategy设置
|
|
|
|
|
|
strategy.setDeviceModel(Build.MODEL);
|
|
|
|
|
|
|
|
|
|
|
|
CrashReport.initCrashReport(getApplicationContext(), "13d735012a", true, strategy);
|
|
|
|
|
|
loadEmojiFromBundled();
|
|
|
|
|
|
//BuildConfig.DEBUG
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 网络请求框架初始化
|
|
|
|
|
|
// IRequestServer server;
|
|
|
|
|
|
// if (BuildConfig.DEBUG) {
|
|
|
|
|
|
// server = new TestServer();
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// server = new ReleaseServer();
|
|
|
|
|
|
// }
|
|
|
|
|
|
//
|
|
|
|
|
|
// OkHttpClient okHttpClient = new OkHttpClient.Builder()
|
|
|
|
|
|
// .build();
|
|
|
|
|
|
//
|
|
|
|
|
|
// EasyConfig.with(okHttpClient)
|
|
|
|
|
|
// // 是否打印日志
|
|
|
|
|
|
// //.setLogEnabled(BuildConfig.DEBUG)
|
|
|
|
|
|
// // 设置服务器配置
|
|
|
|
|
|
// .setServer(server)
|
|
|
|
|
|
// // 设置请求处理策略
|
|
|
|
|
|
// .setHandler(new RequestHandler(this))
|
|
|
|
|
|
// // 设置请求参数拦截器
|
|
|
|
|
|
// .setInterceptor(new IRequestInterceptor() {
|
|
|
|
|
|
// @Override
|
|
|
|
|
|
// public void intercept(String url, String tag, HttpParams params, HttpHeaders headers) {
|
|
|
|
|
|
// headers.put("timestamp", String.valueOf(System.currentTimeMillis()));
|
|
|
|
|
|
// }
|
|
|
|
|
|
// })
|
|
|
|
|
|
// // 设置请求重试次数
|
|
|
|
|
|
// .setRetryCount(1)
|
|
|
|
|
|
// // 设置请求重试时间
|
|
|
|
|
|
// .setRetryTime(1000)
|
|
|
|
|
|
// // 添加全局请求参数
|
|
|
|
|
|
// .addParam("token", "6666666")
|
|
|
|
|
|
// // 添加全局请求头
|
|
|
|
|
|
// //.addHeader("time", "20191030")
|
|
|
|
|
|
// .into();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void initUser() {
|
|
|
|
|
|
this.userInfo = SPUtils.getUser(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public UserInfoBean.UserInfo getUserInfo() {
|
|
|
|
|
|
return userInfo;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void setUserInfo(UserInfoBean.UserInfo userInfo) {
|
|
|
|
|
|
this.userInfo = userInfo;
|
|
|
|
|
|
SPUtils.putUser(this, userInfo);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
protected void attachBaseContext(Context base) {
|
|
|
|
|
|
super.attachBaseContext(base);
|
|
|
|
|
|
MultiDex.install(this);
|
|
|
|
|
|
mContext = base;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 初始化深信服sdk,推荐在attachBaseContext中调用,因为sdk延后初始化会导致多进程场景下,子进程无法拥有sdk的能力
|
|
|
|
|
|
* 初始化深信服注销监听回调
|
|
|
|
|
|
* 初始化深信服dp,sp转px的工具类
|
|
|
|
|
|
*/
|
|
|
|
|
|
if (isApkInDebug(base)) {
|
|
|
|
|
|
showLog("attachBaseContext base");
|
|
|
|
|
|
initSdk(base);
|
|
|
|
|
|
GlobalListenerManager.getInstance().init(base);
|
|
|
|
|
|
DpPxSpTransformUtil.init(getResources().getDisplayMetrics().density);
|
|
|
|
|
|
// String config = "{\"loginAddress\":\"https://vpn.zhp.geg.com.cn:55420\", \"spaSecret\":\"7FFQ-rWE5-V6xX\"}";
|
|
|
|
|
|
// SFUemSDK.setSpaConfig(config, new SFSetSpaConfigListener() {
|
|
|
|
|
|
// @Override
|
|
|
|
|
|
// public void onSetSpaConfig(String result, SFBaseMessage error) {
|
|
|
|
|
|
// SFLogN.info("app", "spa result:"+ result + ", error:" + error);
|
|
|
|
|
|
// Log.i("app", "spa result:"+ result + ", error:" + error);
|
|
|
|
|
|
// if (error.mErrCode != 0) {
|
|
|
|
|
|
// Toast.makeText(mContext,
|
|
|
|
|
|
// "SPA设置失败"+ ", Error Message:" + error.toString(),
|
|
|
|
|
|
// Toast.LENGTH_SHORT)
|
|
|
|
|
|
// .show();
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// Toast.makeText(mContext, "SPA设置成功, result:" + result,
|
|
|
|
|
|
// Toast.LENGTH_SHORT)
|
|
|
|
|
|
// .show();
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
// });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void clearUser() {
|
|
|
|
|
|
this.userInfo = null;
|
|
|
|
|
|
SPUtils.clearUser(this);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void loadEmojiFromBundled() {
|
|
|
|
|
|
EmojiCompat.Config config = new BundledEmojiCompatConfig(getApplicationContext());
|
|
|
|
|
|
|
|
|
|
|
|
config.setReplaceAll(true)
|
|
|
|
|
|
.registerInitCallback(new EmojiCompat.InitCallback()
|
|
|
|
|
|
{
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void onInitialized()
|
|
|
|
|
|
{
|
|
|
|
|
|
//Log.i("app", "loadEmojiFromBundled()->onInitialized()");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
|
public void onFailed(@Nullable Throwable throwable)
|
|
|
|
|
|
{
|
|
|
|
|
|
//Log.e("app", "loadEmojiFromBundled()->onFailed()", throwable);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
EmojiCompat.init(config);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// public static RefWatcher getRefWatcher(Context context) {
|
|
|
|
|
|
// App application = (App) context.getApplicationContext();
|
|
|
|
|
|
// return application.refWatcher;
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* 判断当前应用是否是debug状态
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
public static boolean isApkInDebug(Context context) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
ApplicationInfo info = context.getApplicationInfo();
|
|
|
|
|
|
return (info.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
|
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public static String getApplicationId(Context context) {
|
|
|
|
|
|
PackageManager packageManager = context.getPackageManager();
|
|
|
|
|
|
String packageName = context.getPackageName();
|
|
|
|
|
|
try {
|
|
|
|
|
|
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, 0);
|
|
|
|
|
|
return applicationInfo.packageName;
|
|
|
|
|
|
} catch (PackageManager.NameNotFoundException e) {
|
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void showLog(String logText) {
|
|
|
|
|
|
if (isApkInDebug(mContext)) {
|
|
|
|
|
|
if (TextUtils.isEmpty(logText)) {
|
|
|
|
|
|
Log.i("app", "logText is null");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
Log.i("app", logText);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void initSdk(Context context) {
|
|
|
|
|
|
Map<SFSDKExtras, String> extra = new HashMap<>();
|
|
|
|
|
|
SFSDKMode sdkMode = SFSDKMode.MODE_SUPPORT_MUTABLE; // 表明启用可变授权功能,详情参考集成指导文档
|
|
|
|
|
|
switch (sdkMode) {
|
|
|
|
|
|
case MODE_SUPPORT_MUTABLE:{
|
|
|
|
|
|
int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION; //表明是单应用或者是主应用
|
|
|
|
|
|
sdkFlags |= SFSDKFlags.FLAGS_VPN_MODE_TCP; //表明使用VPN功能中的TCP模式
|
|
|
|
|
|
SFUemSDK.getInstance().initSDK(this, sdkMode,sdkFlags,extra);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case MODE_VPN: { //只使用VPN功能场景
|
|
|
|
|
|
int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION; //表明是单应用或者是主应用
|
|
|
|
|
|
sdkFlags |= SFSDKFlags.FLAGS_VPN_MODE_TCP; //表明使用VPN功能中的TCP模式
|
|
|
|
|
|
SFUemSDK.getInstance().initSDK(this, sdkMode,sdkFlags,null);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case MODE_SANDBOX: { //只使用安全沙箱功能场景
|
|
|
|
|
|
int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION; //表明是单应用或者是主应用
|
|
|
|
|
|
SFUemSDK.getInstance().initSDK(this, sdkMode,sdkFlags,null);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
case MODE_VPN_SANDBOX: { //同时使用VPN功能+安全沙箱功能场景
|
|
|
|
|
|
int sdkFlags = SFSDKFlags.FLAGS_HOST_APPLICATION; //表明是单应用或者是主应用
|
|
|
|
|
|
sdkFlags |= SFSDKFlags.FLAGS_VPN_MODE_TCP; //表明使用VPN功能中的TCP模式
|
|
|
|
|
|
SFUemSDK.getInstance().initSDK(this, sdkMode,sdkFlags,null);
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
default: {
|
|
|
|
|
|
Toast.makeText(context, "SDK模式错误", Toast.LENGTH_LONG).show();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|