package com.mogo.commons; import static com.mogo.aicloud.services.httpdns.HttpDnsConst.HTTP_DNS_ADDRESS_TYPE_HTTP; import static com.mogo.commons.debug.DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE; import android.app.Application; import android.content.Context; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.alibaba.android.arouter.launcher.ARouter; import com.amap.api.navi.AMapNaviView; import com.mogo.aicloud.services.httpdns.IMogoHttpDns; import com.mogo.aicloud.services.httpdns.MogoHttpDnsHandler; import com.mogo.commons.analytics.AnalyticsUtils; import com.mogo.commons.debug.DebugConfig; import com.mogo.commons.device.Devices; import com.mogo.commons.network.AllAllowedHostnameVerifier; import com.mogo.commons.network.Constants; import com.mogo.commons.network.ParamsUtil; import com.mogo.commons.network.X509TrustManagerImpl; import com.mogo.commons.storage.SpStorage; import com.mogo.utils.ThreadPoolService; import com.mogo.utils.TipDrawable; import com.mogo.utils.TipToast; import com.mogo.utils.logger.Logger; import com.mogo.utils.network.NetConfig; import java.security.SecureRandom; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import okhttp3.Request; /** * @author congtaowang * @since 2019-12-23 *
* 描述 */ public abstract class AbsMogoApplication extends Application { private static final String TAG = "AbsMogoApplication"; private static Application sApp; public static Application getApp() { return sApp; } public static AMapNaviView aMapNaviView; public static AMapNaviView getMapNaviView() { return aMapNaviView; } private static IMogoHttpDns sApis; @Override public void onCreate() { super.onCreate(); aMapNaviView = new AMapNaviView(this); aMapNaviView.onCreate(null); sApp = this; initARouter(); if ( shouldInit() ) { init(); } } private void initARouter() { ARouter.init(sApp); // 初始化 arouter if (DebugConfig.isDebug()) { ARouter.openDebug(); ARouter.openLog(); } } protected boolean shouldInit() { return true; } protected void init() { if (sApis == null) { sApis = MogoHttpDnsHandler.getHttpDnsApi(); } } protected void initTipToast() { TipToast.init(this, ((context, message, tipDrawable) -> { if (TextUtils.isEmpty(message)) { return null; } try { View contentView = generateToastView(context, message, tipDrawable); return contentView; } catch (Exception e) { e.printStackTrace(); } return null; })); } private View generateToastView(Context context, String message, TipDrawable tipDrawable) { View contentView; if (tipDrawable == null) { contentView = LayoutInflater.from(context).inflate(R.layout.module_commons_layout_toast, null); TextView txt = contentView.findViewById(R.id.module_commons_toast_msg); txt.setText(message); } else { // 有图片,使用带图片的布局,当前只实现了左侧图片 contentView = LayoutInflater.from(context).inflate(R.layout.module_commons_layout_toast_with_left_drawable, null); TextView txt = contentView.findViewById(R.id.module_commons_toast_msg); ImageView img = contentView.findViewById(R.id.module_commons_toast_left_drawable); img.setImageDrawable(tipDrawable.getDrawable()); ViewGroup.LayoutParams params = img.getLayoutParams(); params.width = tipDrawable.getWidth(); params.height = tipDrawable.getHeight(); txt.setText(message); } return contentView; } /** * 忽略 https 验证 * * @return {@link SSLContext} * @throws Exception */ private static SSLContext getSslContext() throws Exception { SSLContext sc = null; sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[]{new X509TrustManagerImpl()}, new SecureRandom()); return sc; } protected void asyncInit() { ThreadPoolService.execute(() -> { initNetConfig(); // 初始化埋点 AnalyticsUtils.init(sApp); if (DebugConfig.getCarMachineType() == CAR_MACHINE_TYPE_SELF_INNOVATE) { Devices.init(getApp()); Devices.checkBindState(); } asyncInitImpl(); }); } protected void asyncInitImpl() { } private static void initNetConfig() { try { SSLContext sc = getSslContext(); NetConfig.instance().setSslContext(sc); } catch (Exception e) { e.printStackTrace(); } NetConfig.instance().setSignaturePrefix(Constants.SIGN_PREFIX) .setPublicParams(ParamsUtil.getStaticParams()) .setHostnameVerifier(new AllAllowedHostnameVerifier()) .addNetworkInterceptor(chain -> { Request original = chain.request(); Request request = original.newBuilder() .header("token", SpStorage.getTicket()) .method(original.method(), original.body()) .build(); return chain.proceed(request); }) // 增加域名->域名的转换方式,暂时去掉httpdns方式 .addInterceptor(chain -> { Request request = chain.request(); String path = request.url().encodedPath(); String host = "http://" + sApis.syncGetHttpDns(request.url().host().replace("http://", "").replace("https://", ""), HTTP_DNS_ADDRESS_TYPE_HTTP, true); String url = host + path; Logger.d("DomainExchange", "oriHost: " + request.url().host() + " newHost: " + host + " \r\n newUrl: " + url); return chain.proceed(request.newBuilder().url(url).build()); }) .setHttpDns(null) .setLoggable(DebugConfig.isDebug()); } private String cacheIp = null; protected void registerSocketHttpDnsTTL(String host) { sApis.addressChangedListener(map -> { Logger.d("TEST-SOCKET", "ttl callBack ,ready to getCache Dns IP"); String dnsCacheIp = sApis.getCachedHttpDnsIps(host, HTTP_DNS_ADDRESS_TYPE_HTTP); if (dnsCacheIp == null) { return; } Logger.d("TEST-SOCKET", "获取缓存Dns IP : " + dnsCacheIp + " , 原缓存 IP : " + cacheIp); if (!dnsCacheIp.equals(cacheIp)) { socketTTL(); this.cacheIp = dnsCacheIp; } }); } protected abstract void socketTTL(); }