[2.13.0-arch-opt] move binding car to deva tools

This commit is contained in:
zhongchao
2023-01-12 10:11:23 +08:00
parent 8ceced4bcf
commit d8728fe8c9
57 changed files with 522 additions and 1240 deletions

View File

@@ -1 +0,0 @@
/build

View File

@@ -76,6 +76,7 @@ dependencies {
implementation rootProject.ext.dependencies.androidx_datastore
implementation rootProject.ext.dependencies.androidxroomruntime
kapt rootProject.ext.dependencies.androidxroomcompiler
implementation rootProject.ext.dependencies.rxandroid
implementation rootProject.ext.dependencies.androidxroomktx
implementation rootProject.ext.dependencies.protobuf_java
implementation rootProject.ext.dependencies.androidxappcompat

View File

@@ -1,10 +1,11 @@
package com.zhjt.mogo_core_function_devatools
import android.annotation.SuppressLint
import android.app.Activity
import android.content.Context
import android.view.*
import android.view.View
import android.view.ViewGroup
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
import com.mogo.eagle.core.data.constants.MogoServicePaths
import com.mogo.eagle.core.data.deva.chain.ChainLogParam
import com.mogo.eagle.core.data.deva.scene.SceneModule
@@ -12,24 +13,24 @@ import com.mogo.eagle.core.data.deva.scene.SceneTAG
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.function.api.devatools.IDevaToolsProvider
import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager
import com.zhjt.mogo_core_function_devatools.binding.BindingCarManager.Companion.bindingCarManager
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigCenter.Companion.bizConfigCenter
import com.zhjt.mogo_core_function_devatools.funcconfig.FuncConfigImpl
import com.zhjt.mogo_core_function_devatools.logcatch.MogoLogCatchManager
import com.zhjt.mogo_core_function_devatools.mofang.MoFangManager
import com.zhjt.mogo_core_function_devatools.mofang.MoFangManager.Companion.moFangManager
import com.zhjt.mogo_core_function_devatools.monitor.MonitorManager
import com.zhjt.mogo_core_function_devatools.report.IPCReportManager
import com.zhjt.mogo_core_function_devatools.report.IPCReportManager.Companion.iPCReportManager
import com.zhjt.mogo_core_function_devatools.scene.SceneManager.Companion.sceneManager
import com.zhjt.mogo_core_function_devatools.status.*
import com.zhjt.mogo_core_function_devatools.status.StatusManager
import com.zhjt.mogo_core_function_devatools.trace.TraceManager.Companion.traceManager
import com.zhjt.mogo_core_function_devatools.tts.TtsManager.Companion.ttsManager
import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeManager.Companion.upgradeManager
import record_cache.RecordPanelOuterClass
@Route(path = MogoServicePaths.PATH_DEVA_TOOLS)
class DevaToolsProvider : IDevaToolsProvider {
companion object {
const val MODULE_NAME = "DevaToolsProvider"
const val TAG = "DevaToolsProvider"
}
private var mContext: Context? = null
@@ -39,14 +40,17 @@ class DevaToolsProvider : IDevaToolsProvider {
}
override fun initBiz() {
ttsManager.initTts(mContext!!)
ttsManager.initTts(mContext!!) //todo
//链路相关
traceManager.init(mContext!!)
bizConfigCenter.init(mContext!!)
FuncConfigImpl.init()
//开启工控机监控节点上报服务
IPCReportManager.INSTANCE.initServer()
MogoLogCatchManager.init(mContext!!)
MoFangManager.INSTANCE.init(mContext!!)
//升级(鹰眼/工控)与监控服务
iPCReportManager.initServer()
moFangManager.init(mContext!!)
bindingCarManager.init(mContext!!)
}
override fun startLogCatch() {
@@ -73,7 +77,6 @@ class DevaToolsProvider : IDevaToolsProvider {
return traceManager.getTraceInfo()
}
@SuppressLint("NewApi")
override fun refreshTraceInfo(map: HashMap<Int, ChainLogParam>) {
traceManager.refreshTraceInfo(map)
}
@@ -102,20 +105,20 @@ class DevaToolsProvider : IDevaToolsProvider {
BadCaseManager.initAiCollect(view)
}
override fun onReceiveBadCaseRecord(msgBoxBean: MsgBoxBean,activity: Activity,countdown: Boolean) {
BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity,countdown)
override fun onReceiveBadCaseRecord(
msgBoxBean: MsgBoxBean,
activity: Activity,
countdown: Boolean
) {
BadCaseManager.onReceiveBadCaseRecord(msgBoxBean, activity, countdown)
}
override fun showFeedbackWindow(ctx: Context) {
BadCaseManager.showBadCaseConfigWindow(ctx)
}
override fun getUpgradeVersionUrls(versionName: String) {
upgradeManager.getPackageUrls(versionName)
}
override fun downLoadPackage(downloadKey: String,downloadUrl: String) {
upgradeManager.downLoadPackage(mContext!!, downloadKey,downloadUrl)
override fun downLoadPackage(downloadKey: String, downloadUrl: String) {
upgradeManager.downLoadPackage(mContext!!, downloadKey, downloadUrl)
}
override fun showStatusBar(ctx: Context, container: ViewGroup) {
@@ -138,4 +141,25 @@ class DevaToolsProvider : IDevaToolsProvider {
override fun syncConfig() {
traceManager.syncConfig()
}
override fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit) {
bindingCarManager.modifyCarInfo(callBack)
}
override fun getBindingCarInfo(macAddress: String, widevineIDWithMd5: String) {
bindingCarManager.getBindingCarInfo(macAddress, widevineIDWithMd5)
}
override fun upgradeConfirm(images: List<String>, padSn: String, releaseId: String) {
bindingCarManager.upgradeConfirm(images, padSn, releaseId)
}
override fun queryContainers(padSn: String, dockerVersion: String) {
bindingCarManager.queryContainers(padSn, dockerVersion)
}
override fun queryAppUpgrade() {
bindingCarManager.queryAppUpgrade()
}
}

View File

@@ -0,0 +1,36 @@
package com.zhjt.mogo_core_function_devatools.binding;
import com.mogo.eagle.core.data.bindingcar.BindingcarInfo;
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
/**
* @author lixiaopeng
* @description 绑定车辆
* @since: 10/28/21
*/
public interface BindingCarApiService {
/**
* 获取绑定车辆的信息
*
* @return {@link BindingcarInfo}
*/
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("eagleEye-mis/cmdbapi/pad/selectPadByMac")
Observable<BindingcarInfo> getBindingCarInfo(/*@Header("access_token") String access_token,*/ @Body RequestBody requestBody);
/**
* 绑定和修改绑定车机
*
* @return {@link ModifyBindingcarInfo}
*/
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("eagleEye-mis/cmdbapi/pad/v2/updatePadByMac")
Observable<ModifyBindingcarInfo> modifyBindingCarInfo(/*@Header("access_token") String access_token,*/ @Body RequestBody requestBody);
}

View File

@@ -0,0 +1,163 @@
package com.zhjt.mogo_core_function_devatools.binding
import android.content.Context
import android.text.TextUtils
import android.util.Log
import com.elegant.utils.UiThreadHandler
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.data.app.AppConfigInfo.role
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.config.HmiBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isDriver
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils.isPassenger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.zhjt.mogo_core_function_devatools.upgrade.IPCUpgradeManager.Companion.ipcUpgradeManager
import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeAppNetWorkManager
import mogo.telematics.pad.MessagePad
class BindingCarManager : IMoGoAutopilotCarConfigListener {
companion object {
private const val TAG = "BindingCarManager"
val bindingCarManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
BindingCarManager()
}
}
private var mContext: Context? = null
@Volatile
private var mAddress: String? = null
@Volatile
private var mWidevineIDWithMd5 //google 数字版权
: String? = null
fun init(context: Context) {
mContext = context
CallerAutopilotCarConfigListenerManager.addListener(TAG, this)
ipcUpgradeManager.init(context)
UiThreadHandler.postDelayed({ queryAppUpgrade() }, 10_000)
}
fun onDestroy() {
CallerAutopilotCarConfigListenerManager.removeListener(TAG)
ipcUpgradeManager.destroy()
}
override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) {
if (carConfigResp != null && !TextUtils.isEmpty(carConfigResp.macAddress)) {
Log.d("Upgrade", "MoGoHandAdasMsgManager address = " + carConfigResp.macAddress)
getBindingCarInfo(carConfigResp.macAddress, MoGoAiCloudClientConfig.getInstance().sn)
}
}
/**
* 获取macaddress,每次连接请求一次
*
* @param macAddress
*/
fun getBindingCarInfo(macAddress: String, widevineIDWithMd5: String) {
CallerLogger.d(
"$M_DEVA$TAG",
"getBindingcarInfo macAddress = $macAddress--widevineIDWithMd5 = $widevineIDWithMd5"
)
mAddress = macAddress
mWidevineIDWithMd5 = widevineIDWithMd5
if (screenType == 1) { //司机屏
driverScreen(macAddress, widevineIDWithMd5)
} else if (screenType == 2) { //乘客屏
passengerScreen(macAddress, widevineIDWithMd5)
}
}
/**
* 确认升级工控机docker版本
*
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
fun upgradeConfirm(images: List<String>, padSn: String, releaseId: String) {
ipcUpgradeManager.upgradeConfirm(images, padSn, releaseId)
}
/**
* 获取新工控机docker版本
*
* @param padSn SN
* @param dockerVersion 当前工控机版本
*/
fun queryContainers(padSn: String, dockerVersion: String) {
ipcUpgradeManager.queryContainers(padSn, dockerVersion)
}
fun modifyCarInfo(callBack: (ModifyBindingcarInfo) -> Unit) {
BindingCarNetWorkManager.instance.modifyBindingcar(mAddress, mWidevineIDWithMd5, callBack, screenType)
}
private fun driverScreen(macAddress: String, widevineIDWithMd5: String) {
val currentHour = System.currentTimeMillis() / (1000 * 60)
val oldHour = SharedPrefsMgr.getInstance(
mContext!!
).getLong("typeDriver", 0)
//如果2分钟内频繁调需要拦截业务导致的会多次请求工控机信息
if (HmiBuildConfig.isShowSnBindingView) {
if (currentHour - oldHour > 1) {
SharedPrefsMgr.getInstance(mContext!!)
.putLong("typeDriver", System.currentTimeMillis() / (1000 * 60))
BindingCarNetWorkManager.instance
.getBindingcarInfo(mContext, macAddress, widevineIDWithMd5, screenType)
}
}
}
private fun passengerScreen(macAddress: String, widevineIDWithMd5: String) {
val currentHour = System.currentTimeMillis() / (1000 * 60)
val oldHour = SharedPrefsMgr.getInstance(
mContext!!
).getLong("typePassenger", 0)
//如果2分钟内频繁调需要拦截业务导致的会多次请求工控机信息
if (HmiBuildConfig.isShowSnBindingView) {
if (currentHour - oldHour > 1) {
SharedPrefsMgr.getInstance(mContext!!)
.putLong("typePassenger", System.currentTimeMillis() / (1000 * 60))
BindingCarNetWorkManager.instance
.getBindingcarInfo(mContext, macAddress, widevineIDWithMd5, screenType)
}
}
}//乘客屏//司机屏
/**
* 以后可能废弃
*
* @return
*/
private val screenType: Int
get() {
var screenType = -1
if (isDriver(FunctionBuildConfig.appIdentityMode)) {
screenType = 1 //司机屏
}
if (isPassenger(FunctionBuildConfig.appIdentityMode)) {
screenType = 2 //乘客屏
}
return screenType
}
/**
* 查询app是否需要升级
*/
fun queryAppUpgrade() {
UpgradeAppNetWorkManager.getInstance()
.getAppUpgradeInfo(mContext, mAddress, role.toString() + "")
}
}

View File

@@ -0,0 +1,169 @@
package com.zhjt.mogo_core_function_devatools.binding
import android.content.Context
import com.mogo.commons.constants.HostConst
import com.mogo.commons.constants.SharedPrefsConstants
import com.mogo.eagle.core.data.bindingcar.BindingcarInfo
import com.mogo.eagle.core.data.bindingcar.BindingcarRequest
import com.mogo.eagle.core.data.bindingcar.ModifyBindingcarInfo
import com.mogo.eagle.core.data.config.HdMapBuildConfig
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showBindingcarDialog
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager.showModifyBindingcarDialog
import com.mogo.eagle.core.function.call.map.CallerHDMapManager.changeCurrentIcon
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.utils.GsonUtil
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e
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.mogo.toast.TipToast
import com.mogo.eagle.core.utilcode.util.GsonUtils
import com.zhjt.mogo_core_function_devatools.R
import io.reactivex.Observer
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
import okhttp3.MediaType
import okhttp3.RequestBody
/**
* @author lixiaopeng
* @description 绑定车机网络请求
* @since: 3/25/22
*/
class BindingCarNetWorkManager private constructor() {
companion object {
private const val TAG = "BindingCarNetManager"
val instance: BindingCarNetWorkManager by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
BindingCarNetWorkManager()
}
}
private val mBindingCarApiService: BindingCarApiService = MoGoRetrofitFactory.getInstance(HostConst.getHost())
.create(BindingCarApiService::class.java)
/**
* 获取绑定的车辆信息
*
* @param macAddress mac地址
*/
fun getBindingcarInfo(
context: Context?,
macAddress: String?,
widevineIDWithMd5: String?,
screenType: Int
) {
// String macAddress1 = "48:b0:2d:4d:33:40";
// String sn = "X2020220417KA94QIN";
val request = BindingcarRequest(macAddress, widevineIDWithMd5, screenType)
val requestBody = RequestBody.create(
MediaType.get("application/json;charset=UTF-8"),
GsonUtil.jsonFromObject(request)
)
mBindingCarApiService.getBindingCarInfo(requestBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<BindingcarInfo> {
override fun onSubscribe(d: Disposable) {}
override fun onNext(info: BindingcarInfo) {
if (info != null && info.getData() != null) {
d(
SceneConstant.M_BINDING + TAG,
"getBindingcarInfo onNext info.getData() =" + info.getData().toString()
)
//根据车辆类型切换不同的车辆模型,只针对红旗做处理
updateCarVrIconRes(info.getData().brandId)
when (info.getData().compare) {
"0" -> showBindingcarDialog()
"3" -> showModifyBindingcarDialog()
"null" -> TipToast.shortTip("当前工控机没有入库")
}
SharedPrefsMgr.getInstance(context!!).putString(
SharedPrefsConstants.CAR_INFO,
GsonUtils.toJson(info.getData())
)
}
}
override fun onError(e: Throwable) {
e(
SceneConstant.M_BINDING + TAG,
"getBindingcarInfo onError e = " + e.toString() + "---e.getMessage = " + e.message
)
}
override fun onComplete() {}
})
}
/**
* 绑定和修改绑定车辆
* mac: 48:b0:2d:3a:9c:19
*/
fun modifyBindingcar(
macAddress: String?,
widevineIDWithMd5: String?,
callBack: (ModifyBindingcarInfo) -> Unit,
screenType: Int
) {
// String macAddress1 = "48:b0:2d:4d:33:40";
// String sn = "X2020220417KA94QIN";
val request = BindingcarRequest(macAddress, widevineIDWithMd5, screenType)
val requestBody = RequestBody.create(
MediaType.get("application/json;charset=UTF-8"),
GsonUtil.jsonFromObject(request)
)
mBindingCarApiService.modifyBindingCarInfo(requestBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : Observer<ModifyBindingcarInfo> {
override fun onSubscribe(d: Disposable) {}
override fun onNext(info: ModifyBindingcarInfo) {
if (info != null) {
callBack.invoke(info)
d(
SceneConstant.M_BINDING + TAG,
"modifyBindingcar onNext code = " + info.code + "---msg = " + info.msg + "--info.toString() = " + info.toString()
)
updateCarVrIconRes(info.data.brandId)
}
}
override fun onError(e: Throwable) {
e(
SceneConstant.M_BINDING + TAG,
"modifyBindingcar onError e = " + e.toString() + "---e.getMessage = " + e.message
)
}
override fun onComplete() {}
})
}
private fun updateCarVrIconRes(brandId: String?) {
if (brandId == null || brandId.isEmpty()) {
return
}
d(SceneConstant.M_BINDING + TAG, "updateCarVrIconRes : $brandId")
when (brandId) {
"1" -> {
changeCurrentIcon(R.raw.chuzuche)
HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche
}
"2" -> {
changeCurrentIcon(R.raw.hq_h9)
HdMapBuildConfig.currentCarVrIconRes = R.raw.hq_h9
}
"3" -> {
changeCurrentIcon(R.raw.xiaobache)
HdMapBuildConfig.currentCarVrIconRes = R.raw.xiaobache
}
else -> {
changeCurrentIcon(R.raw.chuzuche)
HdMapBuildConfig.currentCarVrIconRes = R.raw.chuzuche
}
}
}
}

View File

@@ -21,7 +21,7 @@ import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
class MoFangManager private constructor() {
companion object {
val INSTANCE: MoFangManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
val moFangManager: MoFangManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
MoFangManager()
}
}

View File

@@ -6,7 +6,6 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.report.ReportEntity
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.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils
@@ -24,7 +23,7 @@ class IPCReportManager : IMoGoAutopilotStatusListener {
companion object{
const val TAG ="IPCReportManager"
val INSTANCE: IPCReportManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
val iPCReportManager: IPCReportManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED) {
IPCReportManager()
}
//Warning

View File

@@ -0,0 +1,35 @@
package com.zhjt.mogo_core_function_devatools.upgrade
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.Response
import okhttp3.RequestBody
import retrofit2.http.*
/**
* @author XuXinChao
* @description 工控机升级网络请求接口
* @since: 2022/5/17
*/
interface IPCUpgradeApiService {
/**
* 确认升级工控机docker版本
* @param imageName docker域名
* @param imageVersion docker版本
* @param padSn SN
* @param releaseId 任务ID
*/
@Headers(
"Content-Type:application/json",
"Accept: application/json"
)
@POST("/api/pushServer/confirm")
suspend fun upgradeConfirm(@Body requestBody: RequestBody): BaseResponse<Any>
/**
* 获取新工控机docker版本
* @param padSn SN
*/
@GET("/api/pushServer/queryContainers")
suspend fun queryContainers(@Query("padSn") padSn: String): Response<Any>
}

View File

@@ -0,0 +1,153 @@
package com.zhjt.mogo_core_function_devatools.upgrade
import android.content.Context
import com.mogo.aicloud.services.socket.IMogoOnMessageListener
import com.mogo.aicloud.services.socket.MogoAiCloudSocketManager
import com.mogo.cloud.passport.MoGoAiCloudClient
import com.mogo.eagle.core.data.autopilot.AutopilotStatusInfo
import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo
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.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import org.json.JSONObject
/**
* @author XuXinChao
* @description 工控机镜像版本升级管理
* @since: 2022/5/12
*/
class IPCUpgradeManager: IMogoOnMessageListener<IPCUpgradeStateInfo> ,
IMoGoAutopilotStatusListener {
companion object{
const val TAG ="IPCUpgradeManager"
const val IPC_UPGRADE_MSG_TYPE = 50000
val ipcUpgradeManager: IPCUpgradeManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){
IPCUpgradeManager()
}
}
private var mContext: Context? = null
private val ipcUpgradeNetWorkModel = IPCUpgradeNetWorkModel()
private var autopilotStatus: Int? = null //自动驾驶状态 0代表不可自动驾驶,1代表可自动驾驶,2代表自动驾驶中
private var hasIPCUpgradeTask = false //是否有工控机升级任务,默认没有该任务
private var ipcUpgradeStateInfoTask: IPCUpgradeStateInfo?=null
fun init(context: Context){
mContext = context
//添加长链接监听
MogoAiCloudSocketManager.getInstance(context)
.registerOnMessageListener(IPC_UPGRADE_MSG_TYPE, this)
// 添加 ADAS状态 监听
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
}
override fun target(): Class<IPCUpgradeStateInfo> {
return IPCUpgradeStateInfo::class.java
}
override fun onMsgReceived(ipcUpgradeStateInfo: IPCUpgradeStateInfo?) {
CallerLogger.i(TAG,"IPCUpgradeManager received msg${ipcUpgradeStateInfo}")
ipcUpgradeStateInfo?.let {
if(it.status.isEmpty() || it.status == "0"){
if(autopilotStatus == 2){
//当前处于自动驾驶状态时,不弹窗提示,结束自动驾驶时弹窗
hasIPCUpgradeTask = true
ipcUpgradeStateInfoTask=it
}else{
var releaseId=""
if(it.releaseId!=null){
releaseId = it.releaseId.toString()
}
//弹窗提示,确认是否进行工控机升级
CallerHmiManager.showAdUpgradeDialog(
it.images,
MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,
releaseId)
}
}else{
//更新下载or升级状态
CallerHmiManager.showAdUpgradeStatus(it)
}
}
}
/**
* 自动驾驶状态信息
* @param autoPilotStatusInfo 状态信息
*/
override fun onAutopilotStatusResponse(autoPilotStatusInfo: AutopilotStatusInfo) {
autopilotStatus = autoPilotStatusInfo.state
//有升级任务,且不处于自动驾驶状态,进行升级提示
if(hasIPCUpgradeTask && autopilotStatus!=2){
ipcUpgradeStateInfoTask?.let {
var releaseId=""
if(it.releaseId!=null){
releaseId = it.releaseId.toString()
}
CallerHmiManager.showAdUpgradeDialog(
it.images,
MoGoAiCloudClient.getInstance().aiCloudClientConfig.sn,
releaseId)
//将升级任务置为false
hasIPCUpgradeTask = false
}
}
}
/**
* 确认升级工控机docker版本
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
fun upgradeConfirm(images: List<String>,padSn: String,releaseId: String){
ipcUpgradeNetWorkModel.upgradeConfirm(images,padSn,releaseId,
onSuccess = {
CallerDevaToolsListenerManager.invokePushServerConfirm()
},
onError = {
})
}
/**
* 获取新工控机docker版本
* @param padSn SN
* @param dockerVersion 当前工控机版本
*/
fun queryContainers(padSn: String,dockerVersion: String){
ipcUpgradeNetWorkModel.queryContainers(padSn,
onSuccess = {
val jsonObject = JSONObject(it)
val images = jsonObject.getJSONArray("images")
val dockerList = ArrayList<String>()
for(i in 0 until images.length()){
if(!images[i].toString().contains(dockerVersion)){
dockerList.add(images[i].toString())
}
}
//将数组结果回调
CallerDevaToolsListenerManager.invokeQueryContainersResponse(dockerList)
},
onError = {
})
}
fun destroy(){
//注销长链接监听
MogoAiCloudSocketManager.getInstance(mContext)
.unregisterLifecycleListener(IPC_UPGRADE_MSG_TYPE)
// 移除 ADAS状态 监听
CallerAutoPilotStatusListenerManager.removeListener(TAG)
mContext = null
}
}

View File

@@ -0,0 +1,95 @@
package com.zhjt.mogo_core_function_devatools.upgrade
import com.mogo.eagle.core.data.BaseResponse
import com.mogo.eagle.core.data.Response
import com.zhjt.mogo_core_function_devatools.upgrade.UpgradeHostConst.Companion.getBaseUrl
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiCall
import com.mogo.eagle.core.network.apiResponseCall
import com.mogo.eagle.core.network.request
import com.mogo.eagle.core.utilcode.util.GsonUtils
import okhttp3.MediaType
import okhttp3.RequestBody
import org.json.JSONArray
import org.json.JSONObject
/**
* @author XuXinChao
* @description 工控机升级网络请求
* @since: 2022/5/17
*/
class IPCUpgradeNetWorkModel {
private fun getNetWorkApi(baseUrl: String =getBaseUrl()): IPCUpgradeApiService {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(IPCUpgradeApiService::class.java)
}
/**
* 确认升级工控机docker版本
* @param images docker列表
* @param padSn SN
* @param releaseId 任务ID
*/
fun upgradeConfirm(images: List<String>,padSn: String,releaseId: String,
onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){
request<BaseResponse<Any?>> {
val requestJson = JSONObject()
val imagesJsonArray = JSONArray()
images.iterator().forEach {
imagesJsonArray.put(it)
}
requestJson.put("images",imagesJsonArray)
requestJson.put("padSn",padSn)
requestJson.put("releaseId",releaseId)
val requestBody:RequestBody= RequestBody.create(
MediaType.parse("application/json; charset=utf-8"),
requestJson.toString()
)
loader{
apiCall{
getNetWorkApi(getBaseUrl()).upgradeConfirm(requestBody)
}
}
onSuccess{
onSuccess.invoke("")
}
onError {
onError.invoke("")
}
}
}
/**
* 获取新工控机docker版本
* @param padSn SN
*/
fun queryContainers(padSn: String,onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){
request<Response<Any?>>{
loader {
apiResponseCall{
getNetWorkApi(getBaseUrl()).queryContainers(padSn)
}
}
onSuccess{
if(it.msg == "success"){
onSuccess.invoke(GsonUtils.toJson(it.data))
}else{
onError.invoke("query Containers fail")
}
}
onError {
if(it.message!=null){
onError.invoke(it.message!!)
}
}
}
}
}

View File

@@ -0,0 +1,28 @@
package com.zhjt.mogo_core_function_devatools.upgrade;
import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo;
import io.reactivex.Observable;
import okhttp3.RequestBody;
import retrofit2.http.Body;
import retrofit2.http.Headers;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* @author lixiaopeng
* @description 升级
* @since: 6/20/22
*/
public interface UpgradeApiService {
/**
* 获取升级信息
* , @Query("resources") String i
* @return {@link UpgradeAppInfo}
*/
@Headers("Content-Type:application/json;charset=UTF-8")
@POST("eagleEye-mis/config/versionInfo")
// Observable<UpgradeAppInfo> getUpgradeInfo(@Query("resources") String res, @Body RequestBody requestBody);
Observable<UpgradeAppInfo> getUpgradeInfo(@Body RequestBody requestBody);
}

View File

@@ -0,0 +1,93 @@
package com.zhjt.mogo_core_function_devatools.upgrade;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_BINDING;
import android.content.Context;
import com.mogo.cloud.passport.MoGoAiCloudClientConfig;
import com.mogo.commons.constants.HostConst;
import com.mogo.eagle.core.data.bindingcar.UpgradeAppInfo;
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager;
import com.mogo.eagle.core.network.MoGoRetrofitFactory;
import com.mogo.eagle.core.network.utils.GsonUtil;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import com.mogo.eagle.core.utilcode.util.AppUtils;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;
import io.reactivex.schedulers.Schedulers;
import okhttp3.MediaType;
import okhttp3.RequestBody;
/**
* @author lixiaopeng
* @description 获取升级信息
* @since: 3/25/22
*/
public class UpgradeAppNetWorkManager {
private static volatile UpgradeAppNetWorkManager requestNoticeManager;
private final UpgradeApiService mUpgradeApiService;
private static final String TAG = "Upgrade";
private UpgradeAppNetWorkManager() {
mUpgradeApiService = MoGoRetrofitFactory.getInstance(HostConst.getHost())
.create(UpgradeApiService.class);
}
public static UpgradeAppNetWorkManager getInstance() {
if (requestNoticeManager == null) {
synchronized (UpgradeAppNetWorkManager.class) {
if (requestNoticeManager == null) {
requestNoticeManager = new UpgradeAppNetWorkManager();
}
}
}
return requestNoticeManager;
}
/**
* 获取app升级信息
*/
public void getAppUpgradeInfo(Context context, String mac, String screenType) {
// String sn = "X20202203105S688HZ";
// String mac = "48:b0:2d:3a:bc:78";
String sn = MoGoAiCloudClientConfig.getInstance().getSn();
int versionCode = AppUtils.getAppVersionCode();
CallerLogger.INSTANCE.d(M_BINDING + TAG, "getAppUpgradeInfo mac = " + mac + "---type = " + screenType + "---sn = " + sn + "---versionCode =" + versionCode);
UpgradeAppRequest request = new UpgradeAppRequest(sn, mac, screenType);
RequestBody requestBody = RequestBody.create(MediaType.get("application/json;charset=UTF-8"), GsonUtil.jsonFromObject(request));
mUpgradeApiService.getUpgradeInfo(requestBody)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<UpgradeAppInfo>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
}
@Override
public void onNext(@NonNull UpgradeAppInfo info) {
if (info != null && info.result != null) {
CallerLogger.INSTANCE.d(M_BINDING + TAG, "UpgradeAppInfo url = " + info.result.getAppUrl() + "----code = " + info.result.getVersionCode() + "--versionCode =" + versionCode + "--info.result = " + info.result);
if (info.result.getVersionCode() > versionCode) {
CallerHmiManager.INSTANCE.showUpgradeDialog(info.result.getAppUrl().substring(info.result.getAppUrl().lastIndexOf("/")+1), info.result.getAppUrl(), info.result.getInstallTitle(), info.result.getInstallContent(), info.result.getInstallType());
}
} else {
CallerLogger.INSTANCE.d(M_BINDING + TAG, "UpgradeAppInfo onNext info == null");
}
}
@Override
public void onError(Throwable e) {
}
@Override
public void onComplete() {
}
});
}
}

View File

@@ -0,0 +1,44 @@
package com.zhjt.mogo_core_function_devatools.upgrade;
/**
* @author lixiaopeng
* @description 获取app升级信息
* @since: 11/15/21
*/
public class UpgradeAppRequest {
private String mac;
private String sn;
private String screenType;
public UpgradeAppRequest( String sn, String mac, String screenType) {
this.sn = sn;
this.mac = mac;
this.screenType = screenType;
}
public String getSn() {
return sn;
}
public void setSn(String sn) {
this.sn = sn;
}
public String getMac() {
return mac;
}
public void setMac(String mac) {
this.mac = mac;
}
public String getScreenType() {
return screenType;
}
public void setScreenType(String screenType) {
this.screenType = screenType;
}
}

View File

@@ -1,12 +1,18 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
package com.zhjt.mogo_core_function_devatools.upgrade
import com.mogo.commons.debug.DebugConfig
class HostConst {
/**
* @author XuXinChao
* @description 工控机升级域名管理
* @since: 2022/5/17
*/
class UpgradeHostConst {
companion object {
private const val HOST_DEV = "http://myflow.ee-private-dev.myghost.zhidaoauto.com"
private const val HOST_RELEASE = "https://myflow.zhidaoauto.com"
companion object{
private const val HOST_DEV = "http://mysunflower-qa.zhidaoauto.com"
private const val HOST_RELEASE = "http://mysunflower.zhidaoauto.com"
fun getBaseUrl(): String {
return when (DebugConfig.getNetMode()) {

View File

@@ -1,18 +1,14 @@
package com.zhjt.mogo_core_function_devatools.upgrade
import android.content.Context
import android.util.Log
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsUpgradeListenerManager
import com.mogo.eagle.core.utilcode.breakpoint.Config
import com.mogo.eagle.core.utilcode.breakpoint.Config.DOWN_LOAD_TAG
import com.mogo.eagle.core.utilcode.breakpoint.bean.ThreadBean
import com.mogo.eagle.core.utilcode.breakpoint.callback.IDownload
import com.mogo.eagle.core.utilcode.breakpoint.utils.DownloadUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.util.AppUtils
import com.zhjt.mogo_core_function_devatools.upgrade.network.UpgradeVersionNetWorkModel
class UpgradeManager : IDownload {
@@ -25,23 +21,9 @@ class UpgradeManager : IDownload {
}
}
private val upgradeVersionNetWorkModel = UpgradeVersionNetWorkModel()
private var map: Map<String, String>? = null
private var version: String? = null
fun getPackageUrls(version: String) {
this.version = version
upgradeVersionNetWorkModel.requestUpgradeVersionUrls(version, onSuccess = {
map = it
CallerDevaToolsListenerManager.invokeDevaToolsUpgradeVersionUrls(map)
}, onError = {
CallerLogger.e("$M_DEVA$TAG", " getPackageUrls error: $it")
})
}
fun downLoadPackage(context: Context, downloadKey: String,downloadUrl: String) {
// val downLoadUrl = map?.get(downLoadKey)
// downLoadUrl?.let {
DownloadUtils.downLoad(
context,
downloadUrl,
@@ -50,7 +32,6 @@ class UpgradeManager : IDownload {
5,
this
)
// }
}
override fun onStart(downloadUrl: String?) {

View File

@@ -1,12 +0,0 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
import com.mogo.eagle.core.data.Response
import retrofit2.http.GET
import retrofit2.http.Query
interface UpgradeVersionApiService {
@GET("/backend/app/getApkInfo")
suspend fun getUpgradeVersion(@Query("fileName") versionName: String): Response<Any>
}

View File

@@ -1,47 +0,0 @@
package com.zhjt.mogo_core_function_devatools.upgrade.network
import com.mogo.eagle.core.data.Response
import com.mogo.eagle.core.network.MoGoRetrofitFactory
import com.mogo.eagle.core.network.apiResponseCall
import com.mogo.eagle.core.network.request
class UpgradeVersionNetWorkModel {
private fun getNetWorkApi(baseUrl: String = HostConst.getBaseUrl()): UpgradeVersionApiService {
return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl)
.create(UpgradeVersionApiService::class.java)
}
fun requestUpgradeVersionUrls(
versionName: String,
onSuccess: ((Map<String, String>) -> Unit),
onError: ((String) -> Unit)
) {
request<Response<Any?>> {
loader {
apiResponseCall {
getNetWorkApi().getUpgradeVersion(
versionName
)
}
}
onSuccess {
if (it.data != null) {
val jsonData = it.data.toString()
val map = mutableMapOf<String, String>()
jsonData.split(",").forEach { data ->
val array = data.split("=")
map[array[0]] = array[1]
}
onSuccess.invoke(map)
} else {
onError.invoke("没有获取到最新版本信息")
}
}
onError {
onError.invoke(it.message ?: "获取最新版本信息失败")
}
}
}
}