From 56f8c969b85b0c19b8554f3356831267a95ed744 Mon Sep 17 00:00:00 2001 From: chenfufeng Date: Wed, 11 May 2022 18:25:49 +0800 Subject: [PATCH] =?UTF-8?q?[Update]=E5=90=AF=E5=8A=A8=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 +- app/src/main/AndroidManifest.xml | 12 + .../com/mogo/launcher/MogoApplication.java | 115 -------- .../mogo/launcher/stageone/ARouterStartUp.kt | 34 +++ .../mogo/launcher/stageone/ConfigStartUp.kt | 104 +++++++ .../mogo/launcher/stageone/HttpDnsStartUp.kt | 276 ++++++++++++++++++ .../stageone/MogoStartupProviderConfig.kt | 26 ++ config.gradle | 2 +- .../mogo-core-function-hmi/build.gradle | 2 +- .../core/function/main/ConnInfoAdapter.java | 70 +++++ .../core/function/main/MainActivity.java | 87 +++++- .../function/main/MainMoGoApplication.java | 238 +-------------- .../core/function/main/MainPresenter.java | 33 +-- .../function/main/stagetwo/APMStartup.java | 33 +++ .../main/stagetwo/AutopilotStartup.java | 40 +++ .../function/main/stagetwo/MapStartup.java | 38 +++ .../layout/autopilot_connect_status_item.xml | 21 ++ .../res/layout/module_main_activity_main.xml | 6 + .../data/autopilot/AutopilotStatusInfo.kt | 8 +- .../com/mogo/commons/AbsMogoApplication.java | 97 +----- 20 files changed, 771 insertions(+), 473 deletions(-) create mode 100644 app/src/main/java/com/mogo/launcher/stageone/ARouterStartUp.kt create mode 100644 app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt create mode 100644 app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt create mode 100644 app/src/main/java/com/mogo/launcher/stageone/MogoStartupProviderConfig.kt create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/ConnInfoAdapter.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/APMStartup.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/AutopilotStartup.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/MapStartup.java create mode 100644 core/function-impl/mogo-core-function-hmi/src/main/res/layout/autopilot_connect_status_item.xml diff --git a/app/build.gradle b/app/build.gradle index 14008b885a..87b0e55e97 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -238,7 +238,7 @@ dependencies { debugImplementation rootProject.ext.dependencies.debugleakcanary releaseImplementation rootProject.ext.dependencies.releaseleakcanary - + implementation rootProject.ext.dependencies.android_start_up if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { implementation rootProject.ext.dependencies.ttspad implementation rootProject.ext.dependencies.mogo_core_function_hmi diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 93042f91d2..6b757d0af8 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -19,6 +19,18 @@ android:usesCleartextTraffic="true" tools:replace="android:label"> + + + + + () { + override fun callCreateOnMainThread() = true + + override fun create(context: Context): String { + try { + if (DebugConfig.isDebug()) { + ARouter.openDebug() + ARouter.openLog() + } + // 初始化 arouter + ARouter.init(context as Application?) + } catch (e: Exception) { + e.printStackTrace() + // 由于ARouter会在SP_AROUTER_CACHE.xml缓存路由表,如果出现了被删除的情况会报错,这里清除下就好了 + CleanUtils.cleanInternalSp() + // 重启应用 + AppUtils.relaunchApp() + } + return this.javaClass.simpleName + } + + override fun waitOnMainThread() = false +} \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt new file mode 100644 index 0000000000..4664e49779 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/stageone/ConfigStartUp.kt @@ -0,0 +1,104 @@ +package com.mogo.launcher.stageone + +import android.content.Context +import com.mogo.commons.debug.DebugConfig +import com.mogo.eagle.core.data.app.AppConfigInfo.workingBranchHash +import com.mogo.eagle.core.data.app.AppConfigInfo.workingBranchName +import com.mogo.eagle.core.data.constants.MoGoConfig +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.rousetime.android_startup.AndroidStartup +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.config.HdMapBuildConfig +import com.mogo.eagle.core.data.config.HmiBuildConfig +import com.mogo.test.crashreport.CrashReportConstants +import com.mogo.launcher.BuildConfig +import com.mogo.launcher.R + +class ConfigStartUp : AndroidStartup() { + + override fun callCreateOnMainThread() = true + + override fun waitOnMainThread() = false + + override fun create(context: Context): Boolean { + initDebugConfig(context) + initBuildConfig() + initOtherConfig(context) + return true + } + + private fun initBuildConfig() { + // 初始化构建APP的时候的分支及提交HASH,用于辅助定位问题 + workingBranchName = BuildConfig.WORKING_BRANCH_NAME + workingBranchHash = BuildConfig.WORKING_BRANCH_HASH + // 使用与渠道配置一样的gps提供者提供的数据,app/productFlavors/fPadLenovo.gradle GPS_PROVIDER 0-Android系统,1-工控机,2-OBU + FunctionBuildConfig.gpsProvider = BuildConfig.GPS_PROVIDER + // 演示模式,上一次勾选的数据 + FunctionBuildConfig.isDemoMode = BuildConfig.IS_DEMO_MODE + // app安装的身份信息 + FunctionBuildConfig.appIdentityMode = BuildConfig.APP_IDENTITY_MODE + // 不同身份对应不同的IP地址 + FunctionBuildConfig.adasConnectIP = BuildConfig.ADAS_CONNECT_IP + } + + private fun initDebugConfig(context: Context) { + DebugConfig.setNetMode(BuildConfig.NET_ENV) + DebugConfig.setDebug(BuildConfig.DEBUG) + DebugConfig.setLaunchLocationService(BuildConfig.LAUNCH_LOCATION_SERVICE) + DebugConfig.setLauncher(BuildConfig.IS_LAUNCHER) + DebugConfig.setUseMockObuData(false) + DebugConfig.setCarMachineType(BuildConfig.CAR_MACHINE_TYPE) + DebugConfig.setProductFlavor(BuildConfig.FLAVOR_product) + DebugConfig.setSocketAppId(BuildConfig.SOCKET_APP_ID) + DebugConfig.setScheduleCalculateNotHomeCompanyDistanceForPush(BuildConfig.IS_SUPPORT_SCHEDULE_CALCULATE_NOT_HOME_COMPANY_DISTANCE_FOR_PUSH) + DebugConfig.setNeedUploadCoordinatesInTime(BuildConfig.IS_NEED_UPLOAD_COORDINATES_IN_TIME) + DebugConfig.setObuType( + SharedPrefsMgr.getInstance(context).getInt("OBU_TYPE", DebugConfig.OBU_TYPE_CIDI) + ) + } + + private fun initOtherConfig(context: Context) { + // 配置BuglyAppID:MoGoEagleEye + CrashReportConstants.buglyAppID = "ac71228f85" + + if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") { + //控制HMI展示元素 将不用手动调用setXXXXXViewVisibility + HmiBuildConfig.isShowSpeedView = false + HmiBuildConfig.isShowAutopilotStatusView = false + HmiBuildConfig.isShowPerspectiveSwitchView = false + HmiBuildConfig.isShowToolsView = false + HmiBuildConfig.isShowBadCaseView = false + HmiBuildConfig.isShowUpgradeTipsView = false + } + + if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger") { + HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche + } else if (DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") { + HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache + HmiBuildConfig.isShowBrakeLightView = false + HmiBuildConfig.isShowTurnLightView = false + } + + if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger") { + //是否显示 红绿等 + HmiBuildConfig.isShowTrafficLightView = false + //是否显示 限速UI + HmiBuildConfig.isShowLimitingVelocityView = false + //是否显示 路侧监控 + HmiBuildConfig.isShowCameraView = false + } else if (DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") { + //是否显示 红绿等 + HmiBuildConfig.isShowTrafficLightView = false + //是否显示 限速UI + HmiBuildConfig.isShowLimitingVelocityView = false + //是否显示 路侧监控 + HmiBuildConfig.isShowCameraView = false + //白天模式 + FunctionBuildConfig.skinMode = 1 + } + + // 是否是演示(美化)模式,会存在SP中,方便做现场恢复 + FunctionBuildConfig.isDemoMode = + SharedPrefsMgr.getInstance(context).getBoolean(MoGoConfig.IS_DEMO_MODE, false) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt new file mode 100644 index 0000000000..7aa1fe54f4 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/stageone/HttpDnsStartUp.kt @@ -0,0 +1,276 @@ +package com.mogo.launcher.stageone + +import android.content.Context +import com.mogo.aicloud.services.httpdns.HttpDnsConst +import com.mogo.aicloud.services.httpdns.IMogoHttpDns +import com.mogo.aicloud.services.httpdns.MogoHttpDnsHandler +import com.mogo.aicloud.services.locationinfo.MogoLocationInfoServices +import com.mogo.aicloud.services.socket.IMogoLifecycleListener +import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager +import com.mogo.cloud.httpdns.MogoHttpDnsConfig +import com.mogo.cloud.httpdns.bean.HttpDnsSimpleLocation +import com.mogo.cloud.httpdns.listener.IHttpDnsCurrentLocation +import com.mogo.cloud.httpdns.listener.OnAddressChangedListener +import com.mogo.cloud.passport.IMoGoTokenCallback +import com.mogo.cloud.passport.MoGoAiCloudClient +import com.mogo.cloud.passport.MoGoAiCloudClientConfig +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.constants.SharedPrefsConstants +import com.mogo.commons.debug.DebugConfig +import com.mogo.commons.device.Devices +import com.mogo.commons.network.NetConfigUtils +import com.mogo.commons.network.Utils +import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.function.call.analytics.AnalyticsManager +import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant +import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr +import com.mogo.eagle.core.utilcode.util.ProcessUtils +import com.mogo.eagle.core.utilcode.util.ThreadPoolService +import com.mogo.module.common.constants.HostConst +import com.rousetime.android_startup.AndroidStartup +import java.lang.NumberFormatException + +class HttpDnsStartUp : AndroidStartup() { + + private val TAG = "MogoApplication" + + // 配置云服务API + private val clientConfig by lazy { + MoGoAiCloudClientConfig.getInstance() + } + + // 缓存IP地址 + private var cacheIp: String? = null + + private lateinit var mogoHttpDns: IMogoHttpDns + + private var context: Context? = null + + override fun callCreateOnMainThread() = true + + override fun waitOnMainThread() = false + + override fun dependenciesByName(): List { + return listOf("com.mogo.launcher.stageone.ARouterStartUp", "com.mogo.launcher.stageone.ConfigStartUp") + } + + override fun create(context: Context): Boolean { + this.context = context + if (ProcessUtils.isMainProcess(context)) { + initHttpDns() + initCloudClientConfig() + } + return true + } + + /** + * 初始化 HttpDNS ,这里会通过一个接口获取所有鹰眼中使用的微服务域名以及端口号 + * 后续的网络请求会通过 HttpDnsInterceptor 进行拦截替换 + */ + private fun initHttpDns() { + mogoHttpDns = MogoHttpDnsHandler.getHttpDnsApi() + preparePassportEnvironment() + } + + private fun preparePassportEnvironment() { + // 设置网络环境:HTTP_DNS_ENV_QA、HTTP_DNS_ENV_RELEASE、HTTP_DNS_ENV_DEV + when (DebugConfig.getNetMode()) { + DebugConfig.NET_MODE_DEV -> clientConfig.netMode = MogoHttpDnsConfig.HTTP_DNS_ENV_DEV + DebugConfig.NET_MODE_QA -> clientConfig.netMode = MogoHttpDnsConfig.HTTP_DNS_ENV_QA + DebugConfig.NET_MODE_DEMO -> clientConfig.netMode = MogoHttpDnsConfig.HTTP_DNS_ENV_DEMO + else -> clientConfig.netMode = MogoHttpDnsConfig.HTTP_DNS_ENV_RELEASE + } + // 设置是否是第三APP登录 + clientConfig.isThirdLogin = + DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE + // 设置是否输出日志 + clientConfig.isShowDebugLog = true + // 设置是否输出网络日志 + clientConfig.isShowNetDebugLog = false + // 设置是否是直播推流的主播 + clientConfig.isAnchor = true + when (DebugConfig.getCarMachineType()) { + DebugConfig.CAR_MACHINE_TYPE_BYD -> clientConfig.thirdPartyAppKey = "bydauto" + DebugConfig.CAR_MACHINE_TYPE_LENOVO -> clientConfig.thirdPartyAppKey = "pfieouqg" + else -> clientConfig.thirdPartyAppKey = "wbvpzgar" + } + // 设置应用服务AppId 长链、鉴权 + if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE) { + clientConfig.serviceAppId = "com_mogo_launcher" + } else { + clientConfig.serviceAppId = "com.mogo.launcher" + } + // 设置AI云平台分配给三方应用的签名密钥,需要从AI云平台申请 + // 设置车机设备的唯一标识(这些表识必须是通过后台录入的设备) + clientConfig.thirdPartyDeviceId = Utils.getDevicesId() + // 设置循环检测间隔时间(每隔2小时loop一次httpDnsConfig) + clientConfig.loopCheckDelay = (60 * 60 * 2 * 1000).toLong() + //设置长链接的secretKey //todo 通过SHA1和包名找中台服务生成,后续包名分渠道,需要做对应操作 + clientConfig.secretKey = "YMj2VFDFxJ3Q4gNoZceJ" + +// todo 使用旧链路 +// clientConfig.setUseOriginSocket(true); + clientConfig.iHttpDnsCurrentLocation = object : IHttpDnsCurrentLocation { + override fun getCurrentLocation(): HttpDnsSimpleLocation? { + var mogoLocation: MogoLocation? = null + val locationClient = + CallerMapUIServiceManager.getSingletonLocationClient(AbsMogoApplication.getApp()) + if (locationClient != null) { + mogoLocation = locationClient.lastKnowLocation + } + val httpDnsSimpleLocation = + if (mogoLocation != null && mogoLocation.latitude != 0.0 && mogoLocation.longitude != 0.0 + ) { + HttpDnsSimpleLocation( + mogoLocation.cityCode, + mogoLocation.latitude, + mogoLocation.longitude + ) + } else { + val ciyCode = + SharedPrefsMgr.getInstance( + AbsMogoApplication.getApp() + ) + .getString(SharedPrefsConstants.LOCATION_CITY_CODE) + val latitude = + SharedPrefsMgr.getInstance( + AbsMogoApplication.getApp() + ) + .getString(SharedPrefsConstants.LOCATION_LATITUDE) + val longitude = + SharedPrefsMgr.getInstance( + AbsMogoApplication.getApp() + ) + .getString(SharedPrefsConstants.LOCATION_LONGITUDE) + try { + HttpDnsSimpleLocation( + ciyCode, latitude.toDouble(), longitude.toDouble() + ) + } catch (e: NumberFormatException) { + // e.printStackTrace(); + HttpDnsSimpleLocation("010", 1.0, 1.0) + } + //CallerLogger.INSTANCE.d(M_HMI + TAG, "使用缓存GPS信息:" + httpDnsSimpleLocation); + } + return httpDnsSimpleLocation + } + } + initAiCloudSDK() + } + + private fun initAiCloudSDK() { + // 初始化SDK,可以设置状态回调来监听 + MoGoAiCloudClient.getInstance().init(context, clientConfig).addTokenCallbacks( + object : IMoGoTokenCallback { + override fun onTokenGot(token: String, sn: String) { + CallerLogger.d(SceneConstant.M_HMI + TAG, "onTokenGot ") + clientConfig.token = token + // 异步初始化NetConfig + asyncInit() + // HttpDns ttl回调 --- socketTTL + registerSocketHttpDnsTTL(HostConst.SOCKET_CENTER_DOMAIN) + // 开启每5s/次定位上报 + uploadLocPerFiveSecond() + } + + override fun onError(code: Int, msg: String) { + CallerLogger.d( + SceneConstant.M_HMI + TAG, + "初始化MogoAiCloudSdk failed ,reason : $msg , 未能开启长链服务和初始化Modules服务" + ) + } + } + ) + } + + /** + * 异步初始化 + */ + private fun asyncInit() { + ThreadPoolService.execute { + if (DebugConfig.getCarMachineType() == DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { + Devices.init(AbsMogoApplication.getApp()) + Devices.checkBindState() + } + //初始化网络配置 + NetConfigUtils.init() + + // 初始化埋点 + AnalyticsManager.init(context, DebugConfig.isDebug()) + } + } + + /** + * 请求获取最新的 DNS 微服务 域名信息 + */ + private fun registerSocketHttpDnsTTL(host: String?) { + mogoHttpDns.addressChangedListener(object : OnAddressChangedListener { + override fun onAddressChanged(address: Map?) { + val dnsCacheIp = mogoHttpDns.getCachedHttpDnsIps( + host, + HttpDnsConst.HTTP_DNS_ADDRESS_TYPE_HTTP + ) ?: return + if (dnsCacheIp != cacheIp) { + CallerLogger.d("TEST_SOCKET", "获取缓存Dns IP : $dnsCacheIp , 原缓存 IP : $cacheIp") + startSocketService() + cacheIp = dnsCacheIp + } + } + }) + } + + /** + * 上传自车位置信息到云端 + */ + private fun uploadLocPerFiveSecond() { + if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { + context?.let { + MogoLocationInfoServices.getInstance().init(it) + MogoLocationInfoServices.getInstance().start() + val locationClient = CallerMapUIServiceManager.getSingletonLocationClient(it) + locationClient?.addLocationListener { location: MogoLocation? -> + MogoLocationInfoServices.getInstance().provideLocation(location) + } + } + } + } + + private fun startSocketService() { + CallerLogger.d(SceneConstant.M_HMI + TAG, "startSocketService") + val location = CallerMapUIServiceManager.getSingletonLocationClient(AbsMogoApplication.getApp())!! + .lastKnowLocation + // 关闭长链服务 + MogoAiCloudSocketManager.getInstance(context).destroy() + MogoAiCloudSocketManager.getInstance(context) + .registerLifecycleListener(10020, object : IMogoLifecycleListener { + override fun onConnectFailure() { + CallerLogger.d(SceneConstant.M_HMI + TAG, "socket-onConnectFailure") + DebugConfig.setDownloadSnapshot(false) + } + + override fun onConnectSuccess() { + CallerLogger.d(SceneConstant.M_HMI + TAG, "socket-onConnectSuccess") + DebugConfig.setDownloadSnapshot(true) + } + + override fun onConnectLost() { + CallerLogger.d(SceneConstant.M_HMI + TAG, "socket-onConnectLost") + DebugConfig.setDownloadSnapshot(false) + } + }) + // 开启Socket长链服务 + val lat = location.latitude + val lon = location.longitude + MogoAiCloudSocketManager.getInstance(context) + .init(context, DebugConfig.getSocketAppId(), lat, lon) + } + + private fun initCloudClientConfig() { + // 使用旧Socket链路 true = 旧链路,false = 新链路 + if (DebugConfig.getProductFlavor() == "fPadLenovoOchTaxi" || DebugConfig.getProductFlavor() == "fPadLenovoOchBus" || DebugConfig.getProductFlavor() == "fPadLenovoOchTaxiPassenger" || DebugConfig.getProductFlavor() == "fPadLenovoOchBusPassenger") { + clientConfig.isUseOriginSocket = true + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mogo/launcher/stageone/MogoStartupProviderConfig.kt b/app/src/main/java/com/mogo/launcher/stageone/MogoStartupProviderConfig.kt new file mode 100644 index 0000000000..2c29c23537 --- /dev/null +++ b/app/src/main/java/com/mogo/launcher/stageone/MogoStartupProviderConfig.kt @@ -0,0 +1,26 @@ +package com.mogo.launcher.stageone + +import com.mogo.launcher.BuildConfig +import com.rousetime.android_startup.model.LoggerLevel +import com.rousetime.android_startup.model.StartupConfig +import com.rousetime.android_startup.provider.StartupProviderConfig + +class MogoStartupProviderConfig: StartupProviderConfig { + override fun getConfig(): StartupConfig { + return when { + BuildConfig.DEBUG -> { + StartupConfig.Builder() + .setLoggerLevel(LoggerLevel.DEBUG) + .setOpenStatistics(true) + .build() + } + else -> { + StartupConfig.Builder() + .setLoggerLevel(LoggerLevel.NONE) + .setOpenStatistics(false) + .setAwaitTimeout(10000L) + .build() + } + } + } +} \ No newline at end of file diff --git a/config.gradle b/config.gradle index 2a88f175e8..9ea50df71e 100644 --- a/config.gradle +++ b/config.gradle @@ -238,7 +238,7 @@ ext { //========================= DataStore ====================== androidx_datastore_preferences : "androidx.datastore:datastore-preferences:1.0.0", androidx_datastore : "androidx.datastore:datastore:1.0.0", - + android_start_up : "io.github.idisfkj:android-startup:1.1.0" ] } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/build.gradle b/core/function-impl/mogo-core-function-hmi/build.gradle index 8515dbefae..f005c52cc1 100644 --- a/core/function-impl/mogo-core-function-hmi/build.gradle +++ b/core/function-impl/mogo-core-function-hmi/build.gradle @@ -74,7 +74,7 @@ dependencies { implementation rootProject.ext.dependencies.mogoami implementation rootProject.ext.dependencies.mogochainbase - + implementation rootProject.ext.dependencies.android_start_up if (Boolean.valueOf(USE_MAVEN_PACKAGE)) { api rootProject.ext.dependencies.mogoaicloudservicesdk api rootProject.ext.dependencies.mogocommons diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/ConnInfoAdapter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/ConnInfoAdapter.java new file mode 100644 index 0000000000..ac3c08c5f0 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/ConnInfoAdapter.java @@ -0,0 +1,70 @@ +package com.mogo.eagle.core.function.main; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.graphics.Color; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; +import com.mogo.eagle.core.function.hmi.R; + +import java.util.List; + +public class ConnInfoAdapter extends RecyclerView.Adapter { + + private List data; + private Context context; + + public ConnInfoAdapter(Context context, List data) { + this.data = data; + this.context = context; + } + + public void updateData(AutopilotStatusInfo statusInfo) { + if (data.size() > 999) { + data.clear(); + } + data.add(statusInfo); + notifyDataSetChanged(); + } + + @NonNull + @Override + public ConnInfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + View view = LayoutInflater.from(context).inflate(R.layout.autopilot_connect_status_item, parent, false); + return new ConnInfoViewHolder(view); + } + + @SuppressLint("ResourceAsColor") + @Override + public void onBindViewHolder(@NonNull ConnInfoViewHolder holder, int position) { + AutopilotStatusInfo statusInfo = data.get(position); + if (statusInfo.getConnectStatus()) { + holder.mContentView.setTextColor(Color.parseColor("#FFFFFF")); + } else { + holder.mContentView.setTextColor(Color.parseColor("#FF4040")); + } + holder.mContentView.setText(statusInfo.toString()); + } + + @Override + public int getItemCount() { + return data != null ? data.size() : 0; + } + + public static class ConnInfoViewHolder extends RecyclerView.ViewHolder { + + private TextView mContentView; + + public ConnInfoViewHolder(@NonNull View itemView) { + super(itemView); + mContentView = itemView.findViewById(R.id.tvStatusInfo); + } + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java index 9f78069018..312ac1a5be 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainActivity.java @@ -15,18 +15,26 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.cloud.commons.BuildConfig; import com.mogo.commons.context.ContextHolderUtil; import com.mogo.commons.mvp.BaseFragment; import com.mogo.commons.mvp.MvpActivity; import com.mogo.commons.mvp.MvpFragment; +import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo; import com.mogo.eagle.core.data.constants.MoGoFragmentPaths; import com.mogo.eagle.core.data.map.MogoLocation; +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener; +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager; import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.hmi.R; import com.mogo.eagle.core.function.main.cards.MogoModulesManager; import com.mogo.eagle.core.function.main.service.MogoMainService; +import com.mogo.eagle.core.function.main.stagetwo.APMStartup; +import com.mogo.eagle.core.function.main.stagetwo.AutopilotStartup; import com.mogo.eagle.core.function.main.utils.DisplayEffectsHelper; import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler; import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; @@ -44,10 +52,18 @@ import com.mogo.module.common.MogoApisHandler; import com.mogo.service.IMogoServiceApis; import com.mogo.service.fragmentmanager.FragmentStackTransactionListener; import com.mogo.service.statusmanager.IMogoStatusManager; +import com.rousetime.android_startup.StartupManager; +import com.rousetime.android_startup.model.LoggerLevel; +import com.rousetime.android_startup.model.StartupConfig; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; +import mogo.telematics.pad.MessagePad; +import mogo_msg.MogoReportMsg; + /** * @author congtaowang * @since 2019-12-23 @@ -56,7 +72,8 @@ import java.util.Map; */ public class MainActivity extends MvpActivity implements MainView, IMogoLocationListener, - FragmentStackTransactionListener { + FragmentStackTransactionListener, + IMoGoAutopilotStatusListener { protected static final String TAG = "MainActivity"; private static final int REQUEST_CODE_DIALOG = 100; @@ -71,6 +88,11 @@ public class MainActivity extends MvpActivity implement private boolean isFirst = false; + private RecyclerView mConnectInfoRV; + private ConnInfoAdapter mConnAdapter; + private List dataList = new ArrayList<>(); + private boolean isFloatingLayerHidden = false; + @Override protected int getLayoutId() { return R.layout.module_main_activity_main; @@ -89,10 +111,10 @@ public class MainActivity extends MvpActivity implement mCoverUpLayout = findViewById(R.id.module_main_id_cover_up); clSpecialEffect = findViewById(R.id.cl_special_effect); - + mConnectInfoRV = findViewById(R.id.rvConnectInfo); + initConnectInfoRV(); FloatingViewHandler.init(mFloatingLayout); - //申请悬浮窗权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // 检查是否有悬浮窗权限 @@ -118,6 +140,9 @@ public class MainActivity extends MvpActivity implement super.onCreate(savedInstanceState); calculateStartTime(); ContextHolderUtil.holdContext(this); + // 监听工控机连接信息 + CallerAutoPilotStatusListenerManager.INSTANCE.addListener(TAG, this); + startUpInStage2(); // 加载模块 mPresenter.postLoadModuleMsg(); // 监听网络状态 @@ -171,6 +196,32 @@ public class MainActivity extends MvpActivity implement mMogoStatusManager.setMainPageLaunchedStatus(TAG, true); } + private void initConnectInfoRV() { + mConnAdapter = new ConnInfoAdapter(this, dataList); + mConnectInfoRV.setLayoutManager(new LinearLayoutManager(this)); + mConnectInfoRV.setAdapter(mConnAdapter); + } + + /** + * 第二阶段初始化,第一阶段初始化可查看:{@link com.mogo.launcher.stageone} + */ + public void startUpInStage2() { + StartupConfig config = null; + if (BuildConfig.DEBUG) { + config = new StartupConfig.Builder() + .setLoggerLevel(LoggerLevel.DEBUG) + .setOpenStatistics(true) + .build(); + } + new StartupManager.Builder() + .addStartup(new AutopilotStartup()) + .addStartup(new APMStartup()) + .setConfig(config) + .build(this) + .start() + .await(); + } + @Override public void loadModules() { final long start = System.currentTimeMillis(); @@ -186,7 +237,7 @@ public class MainActivity extends MvpActivity implement EventDispatchCenter.getInstance().setMapLoadedCallback(() -> { CallerLogger.INSTANCE.d(M_HMI + TAG, "map loaded." + Thread.currentThread().getName()); // 延时加载其他模块 - getWindow().getDecorView().postDelayed(() -> { + getWindow().getDecorView().post(() -> { loadOthersModules(); loadFunctionFragment(); @@ -194,7 +245,7 @@ public class MainActivity extends MvpActivity implement MogoApisHandler.getInstance().getApis().getStatusManagerApi().setVrMode(TAG, true); // 设置地图样式 MogoMapListenerHandler.getInstance().onMapModeChanged(EnumMapUI.MAP_STYLE_DAY_VR); - }, 1000); + }); CallerLogger.INSTANCE.i(M_HMI + TAG, "App launch timer cost " + (System.currentTimeMillis() - start) + "ms"); }); @@ -239,8 +290,10 @@ public class MainActivity extends MvpActivity implement @Override public void hideCoverUpLayout() { + mConnectInfoRV.setVisibility(View.GONE); getWindow().setBackgroundDrawable(null); mCoverUpLayout.setVisibility(View.GONE); + isFloatingLayerHidden = true; } @Override @@ -317,9 +370,33 @@ public class MainActivity extends MvpActivity implement return mServiceApis; } + @Override + public void onAutopilotStatusResponse(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { + mConnectInfoRV.post(() -> updateConnectInfoView(autoPilotStatusInfo)); + } + + @Override + public void onAutopilotArriveAtStation(@Nullable MessagePad.ArrivalNotification arrivalNotification) {} + + @Override + public void onAutopilotGuardian(@Nullable MogoReportMsg.MogoReportMessage guardianInfo) {} + + @Override + public void onAutopilotSNRequest() {} + + private void updateConnectInfoView(@NonNull AutopilotStatusInfo autoPilotStatusInfo) { + if (!isFloatingLayerHidden) {// 遮罩层显示的时候 + mConnAdapter.updateData(autoPilotStatusInfo); + mConnectInfoRV.scrollToPosition(mConnAdapter.getItemCount() - 1); + } else {// 遮罩层隐藏的时候 + CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(TAG); + } + } + @Override protected void onDestroy() { super.onDestroy(); + CallerAutoPilotStatusListenerManager.INSTANCE.removeListener(TAG); IMogoHosListenerRegister listenerRegister = CallerMapUIServiceManager.INSTANCE.getHostListenerRegister(); if (listenerRegister != null) { listenerRegister.unregisterMarkerClickListener(); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 400843f40f..0ce8578500 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -6,25 +6,14 @@ import android.content.Context; import android.os.Process; import com.bytedance.boost_multidex.BoostMultiDex; -import com.mogo.aicloud.services.locationinfo.MogoLocationInfoServices; -import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager; -import com.mogo.cloud.httpdns.MogoHttpDnsConfig; -import com.mogo.cloud.httpdns.bean.HttpDnsSimpleLocation; -import com.mogo.cloud.passport.IMoGoTokenCallback; -import com.mogo.cloud.passport.MoGoAiCloudClient; import com.mogo.cloud.passport.MoGoAiCloudClientConfig; import com.mogo.cloud.socket.SocketBuildConfig; import com.mogo.commons.AbsMogoApplication; -import com.mogo.commons.constants.SharedPrefsConstants; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.commons.network.Utils; import com.mogo.eagle.core.data.config.FunctionBuildConfig; import com.mogo.eagle.core.data.constants.MoGoConfig; import com.mogo.eagle.core.data.constants.MogoServicePaths; -import com.mogo.eagle.core.data.map.MogoLocation; import com.mogo.eagle.core.function.api.chat.biz.ChatConsts; import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; -import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager; import com.mogo.eagle.core.function.notice.PushUIConstants; import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils; import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils; @@ -32,16 +21,10 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr; import com.mogo.eagle.core.utilcode.util.ProcessUtils; import com.mogo.map.MapApiPath; -import com.mogo.map.location.IMogoLocationClient; import com.mogo.module.common.MogoModule; import com.mogo.module.common.MogoModulePaths; -import com.mogo.module.common.constants.HostConst; import com.mogo.module.service.ServiceConst; -import com.mogo.aicloud.services.socket.IMogoLifecycleListener; -import com.mogo.test.crashreport.CrashReportConstants; -import com.mogo.test.crashreport.upgrade.UpgradeReportConstants; import com.zhidao.support.obu.ami.AmiClientManager; -import com.zhjt.mogo_core_function_devatools.DevaToolsProvider; import java.lang.reflect.Field; @@ -57,19 +40,17 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { @Override public void onCreate() { - initBuildConfig(); - initConfigWithSP(); super.onCreate(); if (!shouldInit()) { return; } start = System.currentTimeMillis(); + connectAmiIp(); // Crash 日志收集 initCrashConfig(); initLogConfig(); initTipToast(); initModules(); - initCloudClientConfig(); } @Override @@ -78,26 +59,11 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { return ProcessUtils.isMainProcess(this); } - /** - * BuildConfig中渠道配置赋值 - */ - protected abstract void initBuildConfig(); - - /** - * 从SP本地设置中恢复数据 - */ - protected abstract void initConfigWithSP(); - /** * 初始化异常采集配置 */ protected abstract void initCrashConfig(); - /** - * 初始化异常采集配置 - */ - protected abstract void initAnalyticsConfig(); - /** * 初始化日志 */ @@ -115,149 +81,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { CallerDevaToolsManager.INSTANCE.init(this); } - - /** - * 初始化 MoGoAiCloudClientConfig - */ - protected abstract void initCloudClientConfig(); - - - @Override - protected void asyncInitImpl() { - super.asyncInitImpl(); - initAnalyticsConfig(); - } - - @Override - protected void initHttpDns() { - super.initHttpDns(); - prepareBaseService(); - } - - /** - * 基础服务:passport、location、socket - */ - private void prepareBaseService() { - // 第三方平台的sn是由AI云SDK中服务调用通过服务端生成的 - preparePassportEnvironment(); - } - - private void preparePassportEnvironment() { - - // 设置网络环境:HTTP_DNS_ENV_QA、HTTP_DNS_ENV_RELEASE、HTTP_DNS_ENV_DEV - switch (DebugConfig.getNetMode()) { - case DebugConfig.NET_MODE_DEV: - clientConfig.setNetMode(MogoHttpDnsConfig.HTTP_DNS_ENV_DEV); - break; - case DebugConfig.NET_MODE_QA: - clientConfig.setNetMode(MogoHttpDnsConfig.HTTP_DNS_ENV_QA); - break; - case DebugConfig.NET_MODE_DEMO: - clientConfig.setNetMode(MogoHttpDnsConfig.HTTP_DNS_ENV_DEMO); - break; - default: - clientConfig.setNetMode(MogoHttpDnsConfig.HTTP_DNS_ENV_RELEASE); - } - // 设置是否是第三APP登录 - clientConfig.setThirdLogin(DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE); - // 设置是否输出日志 - clientConfig.setShowDebugLog(true); - // 设置是否输出网络日志 - clientConfig.setShowNetDebugLog(false); - // 设置是否是直播推流的主播 - clientConfig.setAnchor(true); - // 设置从蘑菇AI开放平台获取的APPKey - switch (DebugConfig.getCarMachineType()) { - // 比亚迪 - case DebugConfig.CAR_MACHINE_TYPE_BYD: - clientConfig.setThirdPartyAppKey("bydauto"); - break; - // 衡阳-鹰眼项目 - case DebugConfig.CAR_MACHINE_TYPE_LENOVO: - clientConfig.setThirdPartyAppKey("pfieouqg"); - break; - // 自研车机 - default: - clientConfig.setThirdPartyAppKey("wbvpzgar"); - break; - } - // 设置应用服务AppId 长链、鉴权 - if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE) { - clientConfig.setServiceAppId("com_mogo_launcher"); - } else { - clientConfig.setServiceAppId("com.mogo.launcher"); - } - // 设置AI云平台分配给三方应用的签名密钥,需要从AI云平台申请 - // 设置车机设备的唯一标识(这些表识必须是通过后台录入的设备) - clientConfig.setThirdPartyDeviceId(Utils.getDevicesId()); - // 设置循环检测间隔时间(每隔2小时loop一次httpDnsConfig) - clientConfig.setLoopCheckDelay(60 * 60 * 2 * 1000); - //设置长链接的secretKey //todo 通过SHA1和包名找中台服务生成,后续包名分渠道,需要做对应操作 - clientConfig.setSecretKey("YMj2VFDFxJ3Q4gNoZceJ"); - //连接ami - connectAmiIp(); - -// todo 使用旧链路 -// clientConfig.setUseOriginSocket(true); - - clientConfig.setIHttpDnsCurrentLocation(() -> { - MogoLocation mogoLocation = null; - IMogoLocationClient locationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getApp()); - if (locationClient != null) { - mogoLocation = locationClient.getLastKnowLocation(); - } - HttpDnsSimpleLocation httpDnsSimpleLocation; - if (mogoLocation != null - && mogoLocation.getLatitude() != 0 - && mogoLocation.getLongitude() != 0) { - httpDnsSimpleLocation = new HttpDnsSimpleLocation( - mogoLocation.getCityCode(), - mogoLocation.getLatitude(), - mogoLocation.getLongitude()); - } else { - String ciyCode = SharedPrefsMgr.getInstance(getApp()) - .getString(SharedPrefsConstants.LOCATION_CITY_CODE); - String latitude = SharedPrefsMgr.getInstance(getApp()) - .getString(SharedPrefsConstants.LOCATION_LATITUDE); - String longitude = SharedPrefsMgr.getInstance(getApp()) - .getString(SharedPrefsConstants.LOCATION_LONGITUDE); - try { - httpDnsSimpleLocation = new HttpDnsSimpleLocation( - ciyCode, - Double.parseDouble(latitude), - Double.parseDouble(longitude)); - } catch (NumberFormatException e) { - // e.printStackTrace(); - httpDnsSimpleLocation = new HttpDnsSimpleLocation("010", 1, 1); - } - //CallerLogger.INSTANCE.d(M_HMI + TAG, "使用缓存GPS信息:" + httpDnsSimpleLocation); - } - return httpDnsSimpleLocation; - }); - - // 初始化SDK,可以设置状态回调来监听 - MoGoAiCloudClient.getInstance().init(this, clientConfig).addTokenCallbacks( - new IMoGoTokenCallback() { - @Override - public void onTokenGot(String token, String sn) { - CallerLogger.INSTANCE.d(M_HMI + TAG, "onTokenGot "); - clientConfig.setToken(token); - // 异步初始化NetConfig - asyncInit(); - // HttpDns ttl回调 --- socketTTL - registerSocketHttpDnsTTL(HostConst.SOCKET_CENTER_DOMAIN); - // 开启每5s/次定位上报 - uploadLocPerFiveSecond(); - } - - @Override - public void onError(int code, String msg) { - CallerLogger.INSTANCE.d(M_HMI + TAG, "初始化MogoAiCloudSdk failed ,reason : " + msg + " , 未能开启长链服务和初始化Modules服务"); - } - } - ); - } - /** * 连接ami */ @@ -266,69 +89,15 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { AmiClientManager.getInstance().setObuIp(ipAddress); } - /** - * 上传自车位置信息到云端 - */ - private void uploadLocPerFiveSecond() { - if (DebugConfig.getCarMachineType() != DebugConfig.CAR_MACHINE_TYPE_SELF_INNOVATE) { - MogoLocationInfoServices.getInstance().init(getApplicationContext()); - MogoLocationInfoServices.getInstance().start(); - IMogoLocationClient locationClient = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getApplicationContext()); - if (locationClient != null) { - locationClient.addLocationListener(location -> MogoLocationInfoServices.getInstance().provideLocation(location)); - } - } - } - - private void startSocketService() { - CallerLogger.INSTANCE.d(M_HMI + TAG, "startSocketService"); - MogoLocation location = CallerMapUIServiceManager.INSTANCE.getSingletonLocationClient(getApp()).getLastKnowLocation(); - // 关闭长链服务 - MogoAiCloudSocketManager.getInstance(getApplicationContext()).destroy(); - MogoAiCloudSocketManager.getInstance(getApplicationContext()).registerLifecycleListener(10020, new IMogoLifecycleListener() { - @Override - public void onConnectFailure() { - CallerLogger.INSTANCE.d(M_HMI + TAG, "socket-onConnectFailure"); - DebugConfig.setDownloadSnapshot(false); - } - - @Override - public void onConnectSuccess() { - CallerLogger.INSTANCE.d(M_HMI + TAG, "socket-onConnectSuccess"); - DebugConfig.setDownloadSnapshot(true); - } - - @Override - public void onConnectLost() { - CallerLogger.INSTANCE.d(M_HMI + TAG, "socket-onConnectLost"); - DebugConfig.setDownloadSnapshot(false); - } - }); - // 开启Socket长链服务 - double lat = location.getLatitude(); - double lon = location.getLongitude(); - MogoAiCloudSocketManager.getInstance(getApplicationContext()).init(getApplicationContext(), DebugConfig.getSocketAppId(), lat, lon); - } - - @Override - protected void socketTTL() { - // 鉴权成功后开启socket长链服务 - startSocketService(); - } - private void initModules() { CallerLogger.INSTANCE.d(M_HMI + TAG, "initModules"); - // 初始化 bugly 升级 - MogoModulePaths.addBaseModule(new MogoModule(UpgradeReportConstants.PATH, UpgradeReportConstants.NAME)); - // 初始化 apm 日志采集 - MogoModulePaths.addBaseModule(new MogoModule(CrashReportConstants.PATH, CrashReportConstants.NAME)); + //och模块 + MogoModulePaths.addModuleFunction(new MogoModule("/och/api", "IMoGoFunctionProvider")); MogoModulePaths.addBaseModule(new MogoModule(MapApiPath.PATH, "CustomMapApiBuilder")); MogoModulePaths.addBaseModule(new MogoModule(ServiceConst.PATH_REFRESH_STRATEGY, ServiceConst.PATH_REFRESH_STRATEGY)); // MogoModulePaths.addBaseModule(new MogoModule(V2XConst.PATH_V2X_UI, V2XConst.MODULE_NAME)); - // 域控制器模块(新) - MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_AUTO_PILOT, "IMoGoAutoPilotProvider")); // OBU 模块 MogoModulePaths.addModuleFunctionServer(new MogoModule(MogoServicePaths.PATH_V2X_OBU_MOGO, "IMoGoObuProvider")); // 超视距,路测、行车记录仪监控 @@ -365,5 +134,6 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { AppLaunchTimeUtils.beginTimeCalculate(AppLaunchTimeUtils.COLD_START); } BoostMultiDex.install(base); + AbsMogoApplication.sApp = this; } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainPresenter.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainPresenter.java index 937089b897..4880a355a2 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainPresenter.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainPresenter.java @@ -22,13 +22,13 @@ import com.mogo.eagle.core.function.main.constants.MainConstants; *

* 描述 */ -public class MainPresenter extends Presenter< MainView > { +public class MainPresenter extends Presenter { - private Handler mMsgHandler = new Handler( Looper.getMainLooper() ) { + private Handler mMsgHandler = new Handler(Looper.getMainLooper()) { @Override - public void handleMessage( Message msg ) { - super.handleMessage( msg ); - switch ( msg.what ) { + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what) { case MainConstants.MSG_HIDE_MAP_COVER_FRAME: mView.hideCoverUpLayout(); break; @@ -41,14 +41,14 @@ public class MainPresenter extends Presenter< MainView > { public static final int MOGO_PERMISSION_REQUEST_CODE = 10000; - public MainPresenter( MainView view ) { - super( view ); - SchemeIntent.getInstance().init( getContext(), mView.getApis() ); + public MainPresenter(MainView view) { + super(view); + SchemeIntent.getInstance().init(getContext(), mView.getApis()); } @Override - public void onCreate( @NonNull LifecycleOwner owner ) { - super.onCreate( owner ); + public void onCreate(@NonNull LifecycleOwner owner) { + super.onCreate(owner); } public void checkPermission(Activity activity) { @@ -96,25 +96,20 @@ public class MainPresenter extends Presenter< MainView > { return true; } - /** * 延时操作 */ public void delayOperations() { - mMsgHandler.sendEmptyMessageDelayed( MainConstants.MSG_HIDE_MAP_COVER_FRAME, 150L ); + mMsgHandler.sendEmptyMessage(MainConstants.MSG_HIDE_MAP_COVER_FRAME); } public void postLoadModuleMsg() { Message msg = Message.obtain(); msg.what = MainConstants.MSG_LOAD_MODULES; - mMsgHandler.sendMessageDelayed( msg, 500 ); + mMsgHandler.sendMessage(msg); } - public void handleSchemeIntent( Intent intent, boolean isOnNewIntent ) { - SchemeIntent.getInstance().handle( intent, isOnNewIntent ); - } - - public void initADAS(){ - + public void handleSchemeIntent(Intent intent, boolean isOnNewIntent) { + SchemeIntent.getInstance().handle(intent, isOnNewIntent); } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/APMStartup.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/APMStartup.java new file mode 100644 index 0000000000..0a90bd5125 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/APMStartup.java @@ -0,0 +1,33 @@ +package com.mogo.eagle.core.function.main.stagetwo; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.test.crashreport.CrashReportConstants; +import com.mogo.test.crashreport.upgrade.UpgradeReportConstants; +import com.rousetime.android_startup.AndroidStartup; + +public class APMStartup extends AndroidStartup { + @Nullable + @Override + public Boolean create(@NonNull Context context) { + // bugly + ARouter.getInstance().build(UpgradeReportConstants.PATH).navigation(); + // apm + ARouter.getInstance().build(CrashReportConstants.PATH).navigation(); + return true; + } + + @Override + public boolean callCreateOnMainThread() { + return true; + } + + @Override + public boolean waitOnMainThread() { + return false; + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/AutopilotStartup.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/AutopilotStartup.java new file mode 100644 index 0000000000..98695aef95 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/AutopilotStartup.java @@ -0,0 +1,40 @@ +package com.mogo.eagle.core.function.main.stagetwo; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.alibaba.android.arouter.launcher.ARouter; +import com.mogo.eagle.core.data.constants.MogoServicePaths; +import com.rousetime.android_startup.AndroidStartup; + +import java.util.ArrayList; +import java.util.List; + +public class AutopilotStartup extends AndroidStartup { + @Nullable + @Override + public Boolean create(@NonNull Context context) { + ARouter.getInstance().build(MogoServicePaths.PATH_AUTO_PILOT).navigation(); + return true; + } + + @Override + public boolean callCreateOnMainThread() { + return true; + } + + @Override + public boolean waitOnMainThread() { + return false; + } + + @Nullable + @Override + public List dependenciesByName() { + List deps = new ArrayList<>(); + deps.add("com.mogo.eagle.core.function.main.stagetwo.APMStartup"); + return deps; + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/MapStartup.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/MapStartup.java new file mode 100644 index 0000000000..6df7c488d4 --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/stagetwo/MapStartup.java @@ -0,0 +1,38 @@ +package com.mogo.eagle.core.function.main.stagetwo; + +import android.content.Context; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.rousetime.android_startup.AndroidStartup; + +import java.util.ArrayList; +import java.util.List; + +public class MapStartup extends AndroidStartup { + @Nullable + @Override + public Boolean create(@NonNull Context context) { + // TODO:暂不支持分步加载 + return true; + } + + @Override + public boolean callCreateOnMainThread() { + return true; + } + + @Override + public boolean waitOnMainThread() { + return false; + } + + @Nullable + @Override + public List dependenciesByName() { + List deps = new ArrayList<>(); + deps.add("com.mogo.eagle.core.function.main.stagetwo.APMStartup"); + return deps; + } +} diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/autopilot_connect_status_item.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/autopilot_connect_status_item.xml new file mode 100644 index 0000000000..8b32eb14ee --- /dev/null +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/autopilot_connect_status_item.xml @@ -0,0 +1,21 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml index df6c845ce0..7cc2f8956f 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/module_main_activity_main.xml @@ -87,4 +87,10 @@ app:layout_constraintTop_toTopOf="parent" /> + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt index bc280b0987..ccadc635e1 100644 --- a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/autopilot/AutopilotStatusInfo.kt @@ -74,5 +74,11 @@ class AutopilotStatusInfo : Serializable { */ var pilotmode = 0 - + override fun toString(): String { + return "AutopilotStatusInfo(connectIP=$connectIP, connectPort=$connectPort, " + + "connectStatus=$connectStatus, connectDescribe=$connectStatusDescribe, version=$version, dockVersion=$dockVersion," + + " locationStatus=$locationStatus), locationLat=$locationLat, locationLon=$locationLon," + + " satelliteTime=$satelliteTime, speed=$speed, state=$state, reason=$reason, camera=$camera," + + " radar=$radar, rtk=$rtk, pilotmode=$pilotmode)" + } } \ No newline at end of file diff --git a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java index d2a3bfaf6f..f8a0228209 100644 --- a/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java +++ b/foudations/mogo-commons/src/main/java/com/mogo/commons/AbsMogoApplication.java @@ -1,8 +1,5 @@ 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; @@ -12,20 +9,11 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; -import com.alibaba.android.arouter.launcher.ARouter; -import com.mogo.aicloud.services.httpdns.IMogoHttpDns; -import com.mogo.aicloud.services.httpdns.MogoHttpDnsHandler; import com.mogo.commons.crash.FinalizeCrashFixer; -import com.mogo.commons.debug.DebugConfig; -import com.mogo.commons.device.Devices; -import com.mogo.commons.network.NetConfigUtils; import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger; import com.mogo.eagle.core.utilcode.mogo.toast.TipDrawable; import com.mogo.eagle.core.utilcode.mogo.toast.TipToast; import com.mogo.eagle.core.utilcode.util.AppStateManager; -import com.mogo.eagle.core.utilcode.util.AppUtils; -import com.mogo.eagle.core.utilcode.util.CleanUtils; -import com.mogo.eagle.core.utilcode.util.ThreadPoolService; import com.mogo.eagle.core.utilcode.util.Utils; import io.reactivex.plugins.RxJavaPlugins; @@ -40,27 +28,19 @@ public abstract class AbsMogoApplication extends Application { private static final String TAG = "AbsMogoApplication"; - private static Application sApp; + protected static Application sApp; public static Application getApp() { return sApp; } - private static IMogoHttpDns sApis; - @Override public void onCreate() { super.onCreate(); AppStateManager.INSTANCE.init(this); initRxJavaErrorHandler(); - sApp = this; FinalizeCrashFixer.fix(); - initARouter(); Utils.init(this); - if (shouldInit()) { - initHttpDns(); - } - } private void initRxJavaErrorHandler() { @@ -69,40 +49,10 @@ public abstract class AbsMogoApplication extends Application { }); } - /** - * 初始化跨模块框架 ARouter - */ - private void initARouter() { - try { - if (DebugConfig.isDebug()) { - ARouter.openDebug(); - ARouter.openLog(); - } - // 初始化 arouter - ARouter.init(sApp); - } catch (Exception e) { - e.printStackTrace(); - // 由于ARouter会在SP_AROUTER_CACHE.xml缓存路由表,如果出现了被删除的情况会报错,这里清除下就好了 - CleanUtils.cleanInternalSp(); - // 重启应用 - AppUtils.relaunchApp(); - } - } - protected boolean shouldInit() { return true; } - /** - * 初始化 HttpDNS ,这里会通过一个接口获取所有鹰眼中使用的微服务域名以及端口号 - * 后续的网络请求会通过 HttpDnsInterceptor 进行拦截替换 - */ - protected void initHttpDns() { - if (sApis == null) { - sApis = MogoHttpDnsHandler.getHttpDnsApi(); - } - } - /** * 初始化 自定义样式e饿 */ @@ -143,49 +93,4 @@ public abstract class AbsMogoApplication extends Application { } return contentView; } - - /** - * 异步初始化 - */ - protected void asyncInit() { - ThreadPoolService.execute(() -> { - if (DebugConfig.getCarMachineType() == CAR_MACHINE_TYPE_SELF_INNOVATE) { - Devices.init(getApp()); - Devices.checkBindState(); - } - //初始化网络配置 - NetConfigUtils.init(); - asyncInitImpl(); - }); - } - - /** - * 异步厨初始化 - */ - protected void asyncInitImpl() { - - } - - - // 缓存IP地址 - private String cacheIp = null; - - /** - * 请求获取最新的 DNS 微服务 域名信息 - */ - protected void registerSocketHttpDnsTTL(String host) { - sApis.addressChangedListener(map -> { - String dnsCacheIp = sApis.getCachedHttpDnsIps(host, HTTP_DNS_ADDRESS_TYPE_HTTP); - if (dnsCacheIp == null) { - return; - } - if (!dnsCacheIp.equals(cacheIp)) { - CallerLogger.INSTANCE.d("TEST_SOCKET", "获取缓存Dns IP : " + dnsCacheIp + " , 原缓存 IP : " + cacheIp); - socketTTL(); - this.cacheIp = dnsCacheIp; - } - }); - } - - protected abstract void socketTTL(); }