新增BadCase录包设置、AI数据采集,Badcase改版
This commit is contained in:
xuxinchao
2022-07-13 18:54:13 +08:00
parent 39b9d10162
commit 749c7b4a57
42 changed files with 1740 additions and 74 deletions

View File

@@ -315,6 +315,10 @@ class MoGoAutopilotProvider :
return AdasManager.getInstance().startRecordPackage(id, duration, type)
}
override fun recordPackage(type: Int, id: Int, duration: Int, bduration: Int): Boolean {
return AdasManager.getInstance().startRecordPackage(id,duration, type, bduration)
}
override fun stopRecord(type: Int, id: Int): Boolean {
return AdasManager.getInstance().stopRecordPackage(id, type)
}

View File

@@ -90,6 +90,7 @@ dependencies {
implementation rootProject.ext.dependencies.mogo_core_function_api
implementation rootProject.ext.dependencies.mogo_core_function_call
implementation rootProject.ext.dependencies.mogo_core_data
implementation rootProject.ext.dependencies.mogo_core_res
}else {
implementation project(':services:mogo-service-api')
implementation project(':modules:mogo-module-common')
@@ -98,6 +99,7 @@ dependencies {
implementation project(':core:mogo-core-function-api')
implementation project(':core:mogo-core-function-call')
implementation project(':core:mogo-core-data')
implementation project(':core:mogo-core-res')
}
}

View File

@@ -78,8 +78,8 @@ class DevaToolsProvider : IDevaToolsProvider {
sceneManager.updateSceneTAG(sceneTag)
}
override fun initBadCase(view: View, onShow: (() -> Unit)?, onHide: (() -> Unit)?) {
BadCaseManager.init(view, onShow, onHide)
override fun initBadCase(view: View) {
BadCaseManager.init(view)
}
override fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel) {
@@ -87,7 +87,7 @@ class DevaToolsProvider : IDevaToolsProvider {
}
override fun showFeedbackWindow(ctx: Context) {
FeedbackManager.showFeedbackWindow(ctx)
BadCaseManager.showBadCaseConfigWindow(ctx)
}
override fun getUpgradeVersionUrls(versionName: String) {

View File

@@ -1,9 +1,8 @@
package com.zhjt.mogo_core_function_devatools.badcase
import android.transition.AutoTransition
import android.transition.TransitionManager
import android.content.Context
import android.view.View
import android.view.ViewGroup
import android.view.WindowManager
import androidx.fragment.app.FragmentActivity
import androidx.lifecycle.Lifecycle.Event
@@ -15,24 +14,24 @@ import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotVehicleStateListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA
import com.mogo.eagle.core.utilcode.kotlin.PX
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.kotlin.lifecycleOwner
import com.mogo.eagle.core.utilcode.kotlin.onClick
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.reminder.Reminder
import com.mogo.eagle.core.utilcode.reminder.api.IReminder
import com.mogo.eagle.core.utilcode.reminder.api.IReminder.IGlobalStateChangeListener
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse.Reason
import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCasePresenter
import com.zhjt.mogo_core_function_devatools.badcase.biz.BadCaseView
import com.mogo.eagle.core.utilcode.util.ClickUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo_core_function_devatools.badcase.biz.*
import com.zhjt.mogo_core_function_devatools.badcase.repository.db.entity.AutoPilotRecord
import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse.Reason
import com.zhjt.mogo_core_function_devatools.ext.enqueuePop
import com.zhjt.mogo_core_function_devatools.ext.toast
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.Channel
import record_cache.RecordPanelOuterClass
import java.lang.IllegalStateException
import java.lang.ref.WeakReference
import java.util.concurrent.TimeUnit
@@ -46,9 +45,6 @@ internal object BadCaseManager : LifecycleEventObserver {
private val CASE_EXPIRE_DURATION: Long = TimeUnit.HOURS.toMillis(4)/* TimeUnit.SECONDS.toMillis(10) */
private var onShow: (() -> Unit)? = null
private var onHide: (() -> Unit)? = null
private var hideFloat: (() -> Unit)? = null
@Volatile
@@ -63,6 +59,9 @@ internal object BadCaseManager : LifecycleEventObserver {
@Volatile
private var feedbackFloatShow = false
private var aiDataCollectWindow: AIDataCollectWindow?=null //AI数据采集弹窗
private var initiativeBadCaseWindow: InitiativeBadCaseWindow?=null //主动采集BadCase弹窗
@OptIn(ExperimentalCoroutinesApi::class)
private var channel: Channel<AutoPilotRecord> = Channel(Channel.RENDEZVOUS)
get() = if (field.isClosedForReceive || field.isClosedForSend) {
@@ -85,19 +84,69 @@ internal object BadCaseManager : LifecycleEventObserver {
field
}
fun init(view: View, onShow: (() -> Unit)?, onHide: (() -> Unit)?) {
/**
* 展示BadCase配置页面
*/
fun showBadCaseConfigWindow(context: Context){
val badCaseConfigView = BadCaseConfigView(context)
badCaseConfigView.setClickListener(object: BadCaseConfigView.ClickListener{
override fun onClose() {
hideFloat?.invoke()
hideFloat = null
}
})
context.enqueuePop(badCaseConfigView,960.PX, WindowManager.LayoutParams.MATCH_PARENT, key = "BadCaseConfigView").also {
hideFloat = it
}
}
fun init(view: View) {
this.viewHolder = WeakReference(view)
view.lifecycleOwner.lifecycle.addObserver(this)
this.onShow = onShow
this.onHide = onHide
register()
recoverBadCase()
val badCaseToolsView = view as BadCaseToolsView
val activity = badCaseToolsView.context as? FragmentActivity ?: throw IllegalStateException("please ensure context is FragmentActivity.")
badCaseToolsView.ivAiCollectTools?.setOnClickListener {
if(ClickUtils.isFastClick()){
aiDataCollectWindow = AIDataCollectWindow(activity)
aiDataCollectWindow?.setClickListener(object: AIDataCollectWindow.ClickListener{
override fun closeWindow() {
aiDataCollectWindow?.hideFloatWindow()
}
})
aiDataCollectWindow?.showFloatWindow()
}else{
ToastUtils.showShort("请勿连续点击,稍后再试")
}
}
badCaseToolsView.ivBadCaseTools?.setOnClickListener {
if(ClickUtils.isFastClick()){
initiativeBadCaseWindow = InitiativeBadCaseWindow(activity)
initiativeBadCaseWindow?.setClickListener(object: InitiativeBadCaseWindow.ClickListener{
override fun closeWindow() {
initiativeBadCaseWindow?.hideFloatWindow()
}
})
initiativeBadCaseWindow?.showFloatWindow()
}else{
ToastUtils.showShort("请勿连续点击,稍后再试")
}
}
}
private fun showConfigFloat(){
}
@OptIn(ExperimentalCoroutinesApi::class)
private fun register() {
scope?.launch(Dispatchers.Default) {
while (true) {
showBadCaseInternal(AutoPilotRecord())
CallerLogger.d("$M_DEVA$TAG", "---- 开始监听BadCase事件 ----")
val old = record
if (old == null || old.consumed) {
@@ -131,12 +180,6 @@ internal object BadCaseManager : LifecycleEventObserver {
showBadCaseInternal(it)
}
}
} else {
CallerLogger.d("$M_DEVA$TAG", "record: [$old] hasn't been consumed~~~~")
withContext(Dispatchers.Main) {
showEntry()
}
delay(1000)
}
}
}
@@ -195,7 +238,7 @@ internal object BadCaseManager : LifecycleEventObserver {
private fun CoroutineScope.showBadCaseInternal(record: AutoPilotRecord) = launch {
viewHolder?.get()?.also { itx ->
presenter.updateLastModified(CallerAutopilotVehicleStateListenerManager.getAutopilotTimeStamp())
showEntry()
itx.onClick {
showBadCaseFloat(
onDismiss = {
@@ -221,7 +264,7 @@ internal object BadCaseManager : LifecycleEventObserver {
withContext(Dispatchers.IO) {
presenter.deleteRecord(record)
}
hideEntry()
hideFloat?.invoke()
hideFloat = null
}
@@ -235,7 +278,6 @@ internal object BadCaseManager : LifecycleEventObserver {
dismissJob?.takeIf { it.isActive }?.cancel()
return scope?.launch {
delay(CASE_EXPIRE_DURATION)
hideEntry()
record?.also {
it.consumed = true
withContext(Dispatchers.IO) {
@@ -245,20 +287,6 @@ internal object BadCaseManager : LifecycleEventObserver {
}
}
private fun showEntry() {
viewHolder?.get()?.takeIf { it.visibility != View.VISIBLE }?.also {
it.toggle(true)
onShow?.invoke()
}
}
private fun hideEntry() {
viewHolder?.get()?.takeIf { it.visibility == View.VISIBLE }?.also {
it.toggle(false)
onHide?.invoke()
}
}
private fun showBadCaseFloat(onDismiss: () -> Unit, onSelect:suspend (reason: Reason) -> Unit) {
val activity = viewHolder?.get()?.context as? FragmentActivity ?: throw IllegalStateException("please ensure context is FragmentActivity.")
BadCaseView(activity).also { itx ->
@@ -291,21 +319,12 @@ internal object BadCaseManager : LifecycleEventObserver {
if (event == ON_DESTROY) {
Reminder.unRegisterGlobalStateChangeListener(listener)
dismissJob?.takeIf { it.isActive }?.cancel()
onHide = null
onShow = null
hideFloat = null
}
}
}
fun <T : View> T.toggle(show: Boolean) {
val group = (parent as? ViewGroup) ?: return
val target = if (show) View.VISIBLE else View.GONE
takeIf { it.visibility != target }?.also {
TransitionManager.beginDelayedTransition(group, AutoTransition())
it.visibility = target
}
}
internal fun RecordPanelOuterClass.RecordPanel.toRecord(): AutoPilotRecord =
AutoPilotRecord().also {

View File

@@ -0,0 +1,316 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.PixelFormat
import android.os.SystemClock
import android.util.DisplayMetrics
import android.util.Log
import android.view.*
import android.widget.RadioButton
import android.widget.TextView
import com.mogo.cloud.passport.MoGoAiCloudClientConfig
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.launch
import java.lang.reflect.Field
import java.util.*
/**
* @author XuXinChao
* @description AI数据采集弹窗
* @since: 2022/7/12
*/
class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener{
private var mActivity: Activity = activity
private var mWindowParams: WindowManager.LayoutParams? = null
private var mWindowManager: WindowManager? = null
private lateinit var tvCollectNum: TextView //采集弹窗数量
private lateinit var tvCollectTime: TextView //采集时间
private lateinit var rbLargeCar: RadioButton //大型车
private lateinit var rbTrafficLight: RadioButton //交通灯
private lateinit var rbWater: RadioButton //积水
private lateinit var rbConstruction: RadioButton //施工
private lateinit var rbAccident: RadioButton //车祸路段
private lateinit var rbRain: RadioButton //中雨交通流
private lateinit var rbNightTraffic: RadioButton //夜间交通流
private lateinit var tvCollectReport: TextView //上报按钮
private lateinit var tvCollectCancel: TextView //取消按钮
private var collectReason: String = "大型车:大货、大巴、特种车辆"
private lateinit var mFloatLayout: View
private var mInViewX = 0f
private var mInViewY = 0f
private var mDownInScreenX = 0f
private var mDownInScreenY = 0f
private var mInScreenX = 0f
private var mInScreenY = 0f
private var clickListener: ClickListener? = null
init {
initFloatWindow();
}
private val presenter by lazy {
BadCasePresenter()
}
@SuppressLint("SetTextI18n")
private fun initFloatWindow(){
mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_ai_data_collect, null) as View
mFloatLayout.setOnTouchListener(this)
tvCollectNum = mFloatLayout.findViewById(R.id.tvCollectNum)
tvCollectTime = mFloatLayout.findViewById(R.id.tvCollectTime)
rbLargeCar = mFloatLayout.findViewById(R.id.rbLargeCar)
rbTrafficLight = mFloatLayout.findViewById(R.id.rbTrafficLight)
rbWater = mFloatLayout.findViewById(R.id.rbWater)
rbConstruction = mFloatLayout.findViewById(R.id.rbConstruction)
rbAccident = mFloatLayout.findViewById(R.id.rbAccident)
rbRain = mFloatLayout.findViewById(R.id.rbRain)
rbNightTraffic = mFloatLayout.findViewById(R.id.rbNightTraffic)
tvCollectReport = mFloatLayout.findViewById(R.id.tvCollectReport)
tvCollectCancel = mFloatLayout.findViewById(R.id.tvCollectCancel)
tvCollectTime.text ="时间:${TimeUtils.millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())}"
CallerAutoPilotManager.recordPackage(
99,
Random(SystemClock.elapsedRealtime()).nextInt(),
20,
12
)
//大型车
rbLargeCar.setOnClickListener{
setRadioButtonStatus(
largeCarStatus = true,
trafficLightStatus = false,
waterStatus = false,
constructionStatus = false,
accidentStatus = false,
rainStatus = false,
nightTrafficStatus = false
)
collectReason = "大型车:大货、大巴、特种车辆"
}
//交通灯
rbTrafficLight.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = true,
waterStatus = false,
constructionStatus = false,
accidentStatus = false,
rainStatus = false,
nightTrafficStatus = false
)
collectReason = "交通灯:水平、箭头、雨天交通灯"
}
//积水
rbWater.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = false,
waterStatus = true,
constructionStatus = false,
accidentStatus = false,
rainStatus = false,
nightTrafficStatus = false
)
collectReason = "积水距离10米内面积大于1平米"
}
//施工
rbConstruction.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = false,
waterStatus = false,
constructionStatus = true,
accidentStatus = false,
rainStatus = false,
nightTrafficStatus = false
)
collectReason = "施工:锥桶、路障"
}
//车祸路段
rbAccident.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = false,
waterStatus = false,
constructionStatus = false,
accidentStatus = true,
rainStatus = false,
nightTrafficStatus = false
)
collectReason = "车祸路段:有三角板"
}
//中雨交通流
rbRain.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = false,
waterStatus = false,
constructionStatus = false,
accidentStatus = false,
rainStatus = true,
nightTrafficStatus = false
)
collectReason = "中雨交通流"
}
//夜间交通流
rbNightTraffic.setOnClickListener {
setRadioButtonStatus(
largeCarStatus = false,
trafficLightStatus = false,
waterStatus = false,
constructionStatus = false,
accidentStatus = false,
rainStatus = false,
nightTrafficStatus = true
)
collectReason = "夜间交通流"
}
//上报
tvCollectReport.setOnClickListener {
GlobalScope.launch{
val uploadResult = presenter.upload(mutableMapOf<String, String>().also { itx ->
itx["carLicense"] = "DFD02313"
itx["filename"] = "/home/mogo/data/bags/badcase/20220706145143/20220706145143-265939904-rosmaster-XXXX000000.bag"
itx["filesize"] = "0"
itx["key"] = "265939904"
itx["reason"] = collectReason
itx["duration"] = "16"
itx["startTime"] = "20220706145203"
itx["channel"] = "AI"
itx["carSn"] = MoGoAiCloudClientConfig.getInstance().sn
itx["userRole"] = "安全员"
itx["audioUrl"] = "http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/CarPad/mogopadlog/deviceId/2022-07-07/AUDIO_myTest.wav"
itx["mapVersion"] = "MAP-taxi-hq_RoboTaxi_hq_H9_2.3.0.5_20220410"
itx["eyeVersion"] = "2.8.0"
itx["coordinate"] = ""
})
if (uploadResult == null || uploadResult.code != 200) {
Log.i("xuxinchao","上报失败")
} else {
Log.i("xuxinchao","上报成功")
}
}
}
//取消
tvCollectCancel.setOnClickListener {
clickListener?.closeWindow()
}
mWindowParams = WindowManager.LayoutParams()
mWindowManager = mActivity.windowManager
mWindowParams?.let {
it.format = PixelFormat.RGBA_8888
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
it.gravity = Gravity.START or Gravity.TOP
it.width = 924
it.height = 668
it.alpha = 0.9f
}
}
private fun setRadioButtonStatus(largeCarStatus: Boolean,trafficLightStatus: Boolean,waterStatus: Boolean,
constructionStatus: Boolean,accidentStatus: Boolean,rainStatus: Boolean,nightTrafficStatus: Boolean){
rbLargeCar.isChecked = largeCarStatus
rbTrafficLight.isChecked = trafficLightStatus
rbWater.isChecked = waterStatus
rbConstruction.isChecked = constructionStatus
rbAccident.isChecked = accidentStatus
rbRain.isChecked = rainStatus
rbNightTraffic.isChecked = nightTrafficStatus
}
override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean {
when (motionEvent?.action) {
MotionEvent.ACTION_DOWN -> {
// 获取相对View的坐标即以此View左上角为原点
mInViewX = motionEvent.x
mInViewY = motionEvent.y
// 获取相对屏幕的坐标,即以屏幕左上角为原点
mDownInScreenX = motionEvent.rawX
mDownInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
}
MotionEvent.ACTION_MOVE -> {
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置
mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams)
}
// MotionEvent.ACTION_UP -> // 如果手指离开屏幕时xDownInScreen和xInScreen相等且yDownInScreen和yInScreen相等则视为触发了单击事件。
// if (mDownInScreenX === mInScreenX && mDownInScreenY === mInScreenY) {
// }
}
return true
}
fun showFloatWindow() {
if (mFloatLayout.parent == null) {
val metrics = DisplayMetrics()
// 默认固定位置,靠屏幕右边缘的中间
mWindowManager!!.defaultDisplay.getMetrics(metrics)
mWindowParams!!.x = metrics.widthPixels
mWindowParams!!.y = metrics.heightPixels / 2 - getSysBarHeight(mActivity)
mWindowManager!!.addView(mFloatLayout, mWindowParams)
}
}
fun hideFloatWindow() {
if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout)
}
// 获取系统状态栏高度
private fun getSysBarHeight(activity: Activity): Int {
val c: Class<*>
val obj: Any
val field: Field
val x: Int
var sbar = 0
try {
c = Class.forName("com.android.internal.R\$dimen")
obj = c.newInstance()
field = c.getField("status_bar_height")
x = field.get(obj).toString().toInt()
sbar = activity.resources.getDimensionPixelSize(x)
} catch (e1: Exception) {
e1.printStackTrace()
}
return sbar
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener {
fun closeWindow()
}
}

View File

@@ -0,0 +1,252 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.content.Context
import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.RadioButton
import android.widget.RadioGroup
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager
import com.mogo.eagle.core.utilcode.util.SizeUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.ToastUtils
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import kotlinx.android.synthetic.main.layout_badcase_config.view.*
import mogo.telematics.pad.MessagePad
import java.lang.Exception
/**
* @author XuXinChao
* @description BadCase上报信息配置页面
* @since: 2022/7/5
*/
internal class BadCaseConfigView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMoGoAutopilotRecordListener {
companion object {
const val TAG = "BadCaseConfigView"
}
private var clickListener: ClickListener? = null
private var mIdentity = "安全员"
private var mPreviousDuration = 12
private var mBackDuration = 8
private var mType = 1
init{
LayoutInflater.from(context).inflate(R.layout.layout_badcase_config, this, true)
background = ColorDrawable(Color.parseColor("#F0151D41"))
initView()
}
private fun initView(){
//关闭BadCase配置窗口
ivConfigClose.setOnClickListener {
clickListener?.onClose()
}
//安全员选项
rbSafetyOfficer.setOnClickListener {
mIdentity = "安全员"
rbDeveloper.isChecked = false
rbProduct.isChecked = false
}
//QA、研发选项
rbDeveloper.setOnClickListener {
mIdentity = "QA、研发"
rbSafetyOfficer.isChecked = false
rbProduct.isChecked = false
}
//产品、运营、演示选项
rbProduct.setOnClickListener {
mIdentity = "产品、运营、演示"
rbSafetyOfficer.isChecked = false
rbDeveloper.isChecked = false
}
//保存配置按钮
tvConfigSave.setOnClickListener {
//判断、保存录制时间信息
val preTimeStr=etInitiativePreTime.text.toString()
val afterTimeStr=etInitiativeAfterTime.text.toString()
try {
if(preTimeStr.isEmpty()){
mPreviousDuration = 12
}else{
mPreviousDuration = preTimeStr.toInt()
}
if(afterTimeStr.isEmpty()){
mBackDuration = 8
}else{
mBackDuration = afterTimeStr.toInt()
}
if(mPreviousDuration<0 || mPreviousDuration>300){
ToastUtils.showLong("采集时长最长300S")
return@setOnClickListener
}
if(mBackDuration<0 || mBackDuration>300){
ToastUtils.showLong("采集时长最长300S")
return@setOnClickListener
}
if((mPreviousDuration+mBackDuration)<5){
ToastUtils.showLong("采集时长最短5S")
return@setOnClickListener
}
if((mPreviousDuration+mBackDuration)>300){
ToastUtils.showLong("采集时长最长300S")
return@setOnClickListener
}
BadCaseConfig.previousDuration = mPreviousDuration
BadCaseConfig.backDuration = mBackDuration
BadCaseConfig.totalDuration = BadCaseConfig.previousDuration + BadCaseConfig.backDuration
}catch (e: Exception){
ToastUtils.showLong("输入时间格式不合法,请重新输入")
etInitiativePreTime.text = null
etInitiativeAfterTime.text = null
return@setOnClickListener
}
//保存身份信息
BadCaseConfig.identity = mIdentity
//保存录制模板采集类型
BadCaseConfig.type = mType
//吐司提示保存成功
ToastUtils.showLong("保存成功")
//关闭配置窗口
clickListener?.onClose()
}
// val test1 = TestBean(1,"人工接管自动录制")
// val test2 = TestBean(2,"地图采集")
// val test3 = TestBean(3,"画龙问题排查")
// val test4 = TestBean(4,"误识别问题排查")
// val test5 = TestBean(5,"lidar+planning")
// val test6 = TestBean(6,"camera+planning")
// val test7 = TestBean(7,"bus lidar+planning")
// val test8 = TestBean(8,"bus camera+planning")
// val test99 = TestBean(99,"ai data")
//
// val list = ArrayList<TestBean>()
// list.add(test1)
// list.add(test2)
// list.add(test3)
// list.add(test4)
// list.add(test5)
// list.add(test6)
// list.add(test7)
// list.add(test8)
// list.add(test99)
// list.iterator().forEach {
// if(it.id!=99){
// val radioButton = RadioButton(context)
// val lp = RadioGroup.LayoutParams(
// RadioGroup.LayoutParams.WRAP_CONTENT,
// RadioGroup.LayoutParams.WRAP_CONTENT
// )
// //设置RadioButton边距 (int left, int top, int right, int bottom)
// lp.setMargins(
// SizeUtils.dp2px(0f),
// SizeUtils.dp2px(8f),
// SizeUtils.dp2px(10f),
// SizeUtils.dp2px(8f)
// )
// //设置RadioButton背景
// radioButton.setTextColor(Color.WHITE)
//
// radioButton.buttonDrawable = resources.getDrawable(R.drawable.badcase_radio_button_style)
// //设置文字距离四周的距离
// radioButton.setPadding(
// SizeUtils.dp2px(12f),
// SizeUtils.dp2px(5f),
// SizeUtils.dp2px(10f),
// SizeUtils.dp2px(5f)
// )
// radioButton.textSize = SizeUtils.sp2px(9f).toFloat()
// radioButton.id = it.id
// radioButton.isChecked = it.id == 1
// //设置文字
// radioButton.text = it.src
// //将radioButton添加到radioGroup中
// rgRecordConfig.addView(radioButton, lp)
// rgRecordConfig.setOnCheckedChangeListener { _, checkedId ->
// mType = checkedId
// }
// }
// }
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
override fun onAutopilotRecordConfig(config: MessagePad.RecordDataConfig) {
super.onAutopilotRecordConfig(config)
ThreadUtils.runOnUiThread{
config.recordTypesList.iterator().forEach {
if(it.id!=99){
val radioButton = RadioButton(context)
val lp = RadioGroup.LayoutParams(
RadioGroup.LayoutParams.WRAP_CONTENT,
RadioGroup.LayoutParams.WRAP_CONTENT
)
//设置RadioButton边距 (int left, int top, int right, int bottom)
lp.setMargins(
SizeUtils.dp2px(0f),
SizeUtils.dp2px(8f),
SizeUtils.dp2px(10f),
SizeUtils.dp2px(8f)
)
//设置RadioButton背景
radioButton.setTextColor(Color.WHITE)
radioButton.buttonDrawable = resources.getDrawable(R.drawable.badcase_radio_button_style)
//设置文字距离四周的距离
radioButton.setPadding(
SizeUtils.dp2px(12f),
SizeUtils.dp2px(5f),
SizeUtils.dp2px(10f),
SizeUtils.dp2px(5f)
)
radioButton.textSize = SizeUtils.sp2px(9f).toFloat()
radioButton.id = it.id
radioButton.isChecked = it.id == 1
//设置文字
radioButton.text = it.desc
//将radioButton添加到radioGroup中
rgRecordConfig.addView(radioButton, lp)
rgRecordConfig.setOnCheckedChangeListener { _, checkedId ->
mType = checkedId
}
}
}
}
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerAutopilotRecordListenerManager.addListener(TAG, this)
//获取数据采集录制模式配置列表
CallerAutoPilotManager.getBadCaseConfig()
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerAutopilotRecordListenerManager.removeListener(TAG)
}
interface ClickListener{
fun onClose()
}
}

View File

@@ -0,0 +1,38 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.zhjt.mogo_core_function_devatools.R
/**
* @author XuXinChao
* @description 录包工具及其相关配置入口
* @since: 2022/7/10
*/
class BadCaseToolsView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr){
companion object {
const val TAG = "BadCaseEntranceView"
}
var ivBadCaseTools: ImageView?=null
var ivAiCollectTools: ImageView?=null
init{
LayoutInflater.from(context).inflate(R.layout.view_entrance_badcase, this, true)
initView()
}
private fun initView(){
ivBadCaseTools = findViewById(R.id.ivBadCaseTools)
ivAiCollectTools = findViewById(R.id.ivAiCollectTools)
}
}

View File

@@ -0,0 +1,150 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz
import android.annotation.SuppressLint
import android.app.Activity
import android.graphics.PixelFormat
import android.os.SystemClock
import android.util.DisplayMetrics
import android.view.*
import android.widget.TextView
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager
import com.zhjt.mogo_core_function_devatools.R
import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig
import java.lang.reflect.Field
import java.util.*
/**
* @author XuXinChao
* @description BadCase主动录包
* @since: 2022/7/13
*/
class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchListener{
private var mActivity: Activity = activity
private var mWindowParams: WindowManager.LayoutParams? = null
private var mWindowManager: WindowManager? = null
private lateinit var mFloatLayout: View
private lateinit var tvInitiativeReport: TextView
private lateinit var tvInitiativeCancel: TextView
private var mInViewX = 0f
private var mInViewY = 0f
private var mDownInScreenX = 0f
private var mDownInScreenY = 0f
private var mInScreenX = 0f
private var mInScreenY = 0f
private var clickListener: ClickListener? = null
init {
initFloatWindow();
}
private val presenter by lazy {
BadCasePresenter()
}
@SuppressLint("SetTextI18n")
private fun initFloatWindow(){
mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_initiative_bad_case, null) as View
mFloatLayout.setOnTouchListener(this)
tvInitiativeReport = mFloatLayout.findViewById(R.id.tvInitiativeReport)
tvInitiativeCancel = mFloatLayout.findViewById(R.id.tvInitiativeCancel)
tvInitiativeReport.setOnClickListener {
CallerAutoPilotManager.recordPackage(BadCaseConfig.type,
Random(SystemClock.elapsedRealtime()).nextInt(),
BadCaseConfig.totalDuration,
BadCaseConfig.previousDuration
)
}
tvInitiativeCancel.setOnClickListener {
clickListener?.closeWindow()
}
mWindowParams = WindowManager.LayoutParams()
mWindowManager = mActivity.windowManager
mWindowParams?.let {
it.format = PixelFormat.RGBA_8888
it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
it.gravity = Gravity.START or Gravity.TOP
it.width = 924
it.height = 668
it.alpha = 0.9f
}
}
override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean {
when (motionEvent?.action) {
MotionEvent.ACTION_DOWN -> {
// 获取相对View的坐标即以此View左上角为原点
mInViewX = motionEvent.x
mInViewY = motionEvent.y
// 获取相对屏幕的坐标,即以屏幕左上角为原点
mDownInScreenX = motionEvent.rawX
mDownInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
}
MotionEvent.ACTION_MOVE -> {
// 更新浮动窗口位置参数
mInScreenX = motionEvent.rawX
mInScreenY = motionEvent.rawY - getSysBarHeight(mActivity)
mWindowParams!!.x = (mInScreenX - mInViewX).toInt()
mWindowParams!!.y = (mInScreenY - mInViewY).toInt()
// 手指移动的时候更新小悬浮窗的位置
mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams)
}
// MotionEvent.ACTION_UP -> // 如果手指离开屏幕时xDownInScreen和xInScreen相等且yDownInScreen和yInScreen相等则视为触发了单击事件。
// if (mDownInScreenX === mInScreenX && mDownInScreenY === mInScreenY) {
// }
}
return true
}
fun showFloatWindow() {
if (mFloatLayout.parent == null) {
val metrics = DisplayMetrics()
// 默认固定位置,靠屏幕右边缘的中间
mWindowManager!!.defaultDisplay.getMetrics(metrics)
mWindowParams!!.x = metrics.widthPixels
mWindowParams!!.y = metrics.heightPixels / 2 - getSysBarHeight(mActivity)
mWindowManager!!.addView(mFloatLayout, mWindowParams)
}
}
fun hideFloatWindow() {
if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout)
}
// 获取系统状态栏高度
private fun getSysBarHeight(activity: Activity): Int {
val c: Class<*>
val obj: Any
val field: Field
val x: Int
var sbar = 0
try {
c = Class.forName("com.android.internal.R\$dimen")
obj = c.newInstance()
field = c.getField("status_bar_height")
x = field.get(obj).toString().toInt()
sbar = activity.resources.getDimensionPixelSize(x)
} catch (e1: Exception) {
e1.printStackTrace()
}
return sbar
}
fun setClickListener(clickListener: ClickListener) {
this.clickListener = clickListener
}
interface ClickListener {
fun closeWindow()
}
}

View File

@@ -0,0 +1,13 @@
package com.zhjt.mogo_core_function_devatools.badcase.biz
/**
* @author xuxinchao
* @description
* @since: 2022/7/11
*/
data class TestBean(
var id: Int,
var src: String
) {
}

View File

@@ -0,0 +1,25 @@
package com.zhjt.mogo_core_function_devatools.badcase.consts
/**
* @author XuXinChao
* @description 录包配置参数
* @since: 2022/7/11
*/
object BadCaseConfig {
//身份安全员QA、研发产品、运营、演示默认身份是安全员
@JvmField
var identity: String = "安全员"
//录制前溯时长
@JvmField
var previousDuration: Int = 12
//录制后溯时长
@JvmField
var backDuration: Int = 8
//BadCase录制时长默认时长为20秒时长区间为大于等于5秒小于等于300秒
@JvmField
var totalDuration: Int = 20
//采集类型
@JvmField
var type: Int = 1
}

View File

@@ -4,5 +4,5 @@ import com.mogo.commons.debug.DebugConfig
internal object BadCaseHost {
fun getHost(): String = "http://dzt.zhidaozhixing.com"/*if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE) "http://dzt.zhidaozhixing.com" else "http://front.zdjs-private-test.myghost.zhidaoauto.com"*/
fun getHost(): String = "http://172.30.37.145:8111"/*if (DebugConfig.getNetMode() == DebugConfig.NET_MODE_RELEASE) "http://dzt.zhidaozhixing.com" else "http://front.zdjs-private-test.myghost.zhidaoauto.com"*/
}

View File

@@ -8,7 +8,7 @@ import retrofit2.http.*
internal interface BadCaseApi {
@FormUrlEncoded
@POST("/yycp-vehicle-management-service/tool/badcase/add")
@POST("/yycp-vehicle-management-service/tool/badcase/add/v2")
suspend fun post(@FieldMap map: Map<String, String>): Response<UploadResult>
@GET("/yycp-vehicle-management-service/tool/badcase/reasons")

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/icon_ai_select" android:state_focused="true" android:state_pressed="true" />
<item android:drawable="@drawable/icon_ai_select" android:state_focused="false" android:state_pressed="true" />
<item android:drawable="@drawable/icon_ai_select" android:state_selected="true" />
<item android:drawable="@drawable/icon_ai_select" android:state_focused="true" />
<item android:drawable="@drawable/icon_ai_normal" />
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#3A57C5"
android:endColor="#323C6F"
android:angle="0"
/>
<corners android:radius="40px" />
</shape>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#3A57C5"
android:endColor="#1E2E87"
android:angle="0"
/>
<corners android:radius="8px" />
</shape>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/icon_bad_case_select" android:state_focused="true" android:state_pressed="true" />
<item android:drawable="@drawable/icon_bad_case_select" android:state_focused="false" android:state_pressed="true" />
<item android:drawable="@drawable/icon_bad_case_select" android:state_selected="true" />
<item android:drawable="@drawable/icon_bad_case_select" android:state_focused="true" />
<item android:drawable="@drawable/icon_ai_normal" />
</selector>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_checked="false"
android:drawable="@drawable/icon_ap_badcase_default" />
<item
android:state_checked="true"
android:drawable="@drawable/icon_ap_badcase_check" />
</selector>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#263869" />
<corners android:radius="20px" />
<stroke
android:width="2dp"
android:color="#5EBFFF" />
</shape>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FF3B4577" />
<corners android:radius="8px" />
</shape>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#029DFF"
android:endColor="#0056FF"
android:angle="0"
/>
<corners android:radius="8px" />
</shape>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<gradient
android:startColor="#029DFF"
android:endColor="#0056FF"
android:angle="0"
/>
<corners android:radius="24px" />
</shape>

View File

@@ -0,0 +1,327 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:layout_width="960px"
tools:layout_height="match_parent"
android:background="#F0151D41"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<ImageView
android:id="@+id/ivConfigClose"
android:layout_width="107px"
android:layout_height="107px"
android:layout_marginTop="66px"
android:layout_marginEnd="40px"
android:src="@drawable/icon_close_nor"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
android:id="@+id/viewConfigTitleLine"
android:layout_width="14px"
android:layout_height="50px"
android:layout_marginStart="80px"
android:layout_marginTop="92px"
android:background="#2966EC"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/tvConfigTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Case上报"
android:textColor="#FFFFFFFF"
android:textSize="42px"
app:layout_constraintTop_toTopOf="@id/viewConfigTitleLine"
app:layout_constraintBottom_toBottomOf="@id/viewConfigTitleLine"
app:layout_constraintLeft_toLeftOf="@id/viewConfigTitleLine"
android:layout_marginStart="50px"
/>
<TextView
android:id="@+id/tvConfigSave"
android:layout_width="800px"
android:layout_height="126px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:text="保存"
android:textColor="#FFFFFFFF"
android:textSize="42px"
android:gravity="center"
android:background="@drawable/save_button_bg"
android:layout_marginBottom="100px"
/>
<ScrollView
android:layout_width="800px"
android:layout_height="0dp"
app:layout_constraintTop_toBottomOf="@id/viewConfigTitleLine"
app:layout_constraintBottom_toTopOf="@id/tvConfigSave"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="100px"
android:scrollbars="none"
>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toBottomOf="@id/viewConfigTitleLine"
app:layout_constraintLeft_toLeftOf="@id/viewConfigTitleLine"
>
<TextView
android:id="@+id/tvIdentityTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="身份"
android:textColor="#FFFFFFFF"
android:textSize="38px"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
<RadioButton
android:id="@+id/rbSafetyOfficer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="安全员"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:button="@null"
android:checked="true"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="30px"
android:paddingTop="@dimen/dp_30"
android:paddingBottom="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
app:layout_constraintTop_toBottomOf="@id/tvIdentityTitle"
app:layout_constraintLeft_toLeftOf="@id/tvIdentityTitle"
/>
<RadioButton
android:id="@+id/rbDeveloper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="QA、研发"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="30px"
android:paddingTop="@dimen/dp_30"
android:paddingBottom="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
android:layout_marginStart="@dimen/dp_200"
app:layout_constraintTop_toBottomOf="@id/tvIdentityTitle"
app:layout_constraintLeft_toRightOf="@id/rbSafetyOfficer"
/>
<RadioButton
android:id="@+id/rbProduct"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="产品、运营、演示"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="30px"
android:paddingTop="@dimen/dp_30"
android:paddingBottom="@dimen/dp_30"
android:paddingEnd="@dimen/dp_30"
app:layout_constraintTop_toBottomOf="@id/rbSafetyOfficer"
app:layout_constraintLeft_toLeftOf="@id/rbSafetyOfficer"
/>
<TextView
android:id="@+id/tvRecordTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="录制窗口"
android:textColor="#FFFFFFFF"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/rbProduct"
app:layout_constraintLeft_toLeftOf="@id/rbProduct"
android:layout_marginTop="@dimen/dp_80"
/>
<TextView
android:id="@+id/tvInitiativeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主动:"
android:textColor="#FFA7B6F0"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/tvRecordTitle"
app:layout_constraintLeft_toLeftOf="@id/tvRecordTitle"
android:layout_marginTop="@dimen/dp_30"
/>
<TextView
android:id="@+id/tvInitiativePre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="前:"
android:textColor="#FFFFFFFF"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeTitle"
app:layout_constraintLeft_toLeftOf="@id/tvInitiativeTitle"
android:layout_marginTop="@dimen/dp_50"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etInitiativePreTime"
android:layout_width="228px"
android:layout_height="84px"
app:layout_constraintTop_toTopOf="@id/tvInitiativePre"
app:layout_constraintBottom_toBottomOf="@id/tvInitiativePre"
app:layout_constraintLeft_toRightOf="@id/tvInitiativePre"
android:background="@drawable/badcase_record_edit_bg"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:hint="12s"
android:textColorHint="#FFFFFFFF"
android:gravity="center"
/>
<TextView
android:id="@+id/tvInitiativeAfter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="后:"
android:textColor="#FFFFFFFF"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/tvInitiativePre"
app:layout_constraintLeft_toLeftOf="@id/tvInitiativePre"
android:layout_marginTop="@dimen/dp_60"
/>
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etInitiativeAfterTime"
android:layout_width="228px"
android:layout_height="84px"
app:layout_constraintTop_toTopOf="@id/tvInitiativeAfter"
app:layout_constraintBottom_toBottomOf="@id/tvInitiativeAfter"
app:layout_constraintLeft_toRightOf="@id/tvInitiativeAfter"
android:background="@drawable/badcase_record_edit_bg"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:hint="8s"
android:textColorHint="#FFFFFFFF"
android:gravity="center"
/>
<TextView
android:id="@+id/tvPassiveTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="被动:"
android:textColor="#FFA7B6F0"
android:textSize="38px"
app:layout_constraintTop_toTopOf="@id/tvInitiativeTitle"
app:layout_constraintBottom_toBottomOf="@id/tvInitiativeTitle"
app:layout_constraintLeft_toRightOf="@id/tvInitiativeTitle"
android:layout_marginStart="@dimen/dp_300"
android:alpha="0.5"
/>
<TextView
android:id="@+id/tvPassivePre"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="前:"
android:textColor="#FFFFFF"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/tvPassiveTitle"
app:layout_constraintLeft_toLeftOf="@id/tvPassiveTitle"
android:layout_marginTop="@dimen/dp_50"
android:alpha="0.5"
/>
<TextView
android:id="@+id/etPassivePreTime"
android:layout_width="228px"
android:layout_height="84px"
app:layout_constraintTop_toTopOf="@id/tvPassivePre"
app:layout_constraintBottom_toBottomOf="@id/tvPassivePre"
app:layout_constraintLeft_toRightOf="@id/tvPassivePre"
android:background="@drawable/badcase_record_edit_bg"
android:alpha="0.5"
android:text="12s"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:gravity="center"
/>
<TextView
android:id="@+id/tvPassiveAfter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="后:"
android:textColor="#FFFFFFFF"
android:textSize="38px"
app:layout_constraintTop_toBottomOf="@id/tvPassivePre"
app:layout_constraintLeft_toLeftOf="@id/tvPassivePre"
android:layout_marginTop="@dimen/dp_60"
android:alpha="0.5"
/>
<TextView
android:id="@+id/etPassiveAfterTime"
android:layout_width="228px"
android:layout_height="84px"
app:layout_constraintTop_toTopOf="@id/tvPassiveAfter"
app:layout_constraintBottom_toBottomOf="@id/tvPassiveAfter"
app:layout_constraintLeft_toRightOf="@id/tvPassiveAfter"
android:background="@drawable/badcase_record_edit_bg"
android:alpha="0.5"
android:text="8s"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:gravity="center"
/>
<ImageView
android:id="@+id/ivRecordTemplate"
android:layout_width="19px"
android:layout_height="15px"
android:src="@drawable/icon_expand"
app:layout_constraintLeft_toLeftOf="@id/tvInitiativeAfter"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeAfter"
android:layout_marginTop="@dimen/dp_80"
/>
<TextView
android:id="@+id/tvRecordTemplate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="预置录制模板"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:gravity="center_vertical"
app:layout_constraintTop_toTopOf="@id/ivRecordTemplate"
app:layout_constraintBottom_toBottomOf="@id/ivRecordTemplate"
app:layout_constraintLeft_toRightOf="@id/ivRecordTemplate"
android:layout_marginStart="@dimen/dp_30"
/>
<RadioGroup
android:id="@+id/rgRecordConfig"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="@id/tvRecordTemplate"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvRecordTemplate"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_20"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
</ScrollView>
</merge>

View File

@@ -0,0 +1,182 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="924px"
android:layout_height="668px"
app:roundLayoutRadius="40px"
android:background="@color/module_switch_map_bg">
<View
android:layout_width="match_parent"
android:layout_height="113px"
android:background="@drawable/ai_collect_title_bg"
/>
<TextView
android:id="@+id/tvCollectNum"
android:layout_width="120px"
android:layout_height="113px"
android:background="@drawable/icon_num_bg"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="#FFFFFFFF"
android:textSize="46px"
android:gravity="center"
android:text="1"
/>
<TextView
android:id="@+id/tvCollectTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/tvCollectNum"
app:layout_constraintTop_toTopOf="@id/tvCollectNum"
app:layout_constraintBottom_toBottomOf="@id/tvCollectNum"
android:text="时间14:23:10"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:layout_marginStart="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbLargeCar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="大型车:大货、大巴、特种车辆"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvCollectNum"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbTrafficLight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="交通灯:水平、箭头、雨天交通灯"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbLargeCar"
app:layout_constraintLeft_toLeftOf="@id/rbLargeCar"
android:layout_marginTop="@dimen/dp_30"
/>
<RadioButton
android:id="@+id/rbWater"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="积水距离10米内面积大于1平米"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbTrafficLight"
app:layout_constraintLeft_toLeftOf="@id/rbTrafficLight"
android:layout_marginTop="@dimen/dp_30"
/>
<RadioButton
android:id="@+id/rbConstruction"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="施工:锥桶、路障"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbWater"
app:layout_constraintLeft_toLeftOf="@id/rbWater"
android:layout_marginTop="@dimen/dp_30"
/>
<RadioButton
android:id="@+id/rbAccident"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="车祸路段:有三角板"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toTopOf="@id/rbConstruction"
app:layout_constraintBottom_toBottomOf="@id/rbConstruction"
app:layout_constraintLeft_toRightOf="@id/rbConstruction"
android:layout_marginStart="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbRain"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="中雨交通流"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbConstruction"
app:layout_constraintLeft_toLeftOf="@id/rbConstruction"
android:layout_marginTop="@dimen/dp_30"
/>
<RadioButton
android:id="@+id/rbNightTraffic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="夜间交通流"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbAccident"
app:layout_constraintLeft_toLeftOf="@id/rbAccident"
android:layout_marginTop="@dimen/dp_30"
/>
<TextView
android:id="@+id/tvCollectReport"
android:layout_width="270px"
android:layout_height="70px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvCollectCancel"
android:background="@drawable/report_button_bg"
android:text="上报"
android:textColor="#FFFFFF"
android:textSize="30px"
android:gravity="center"
android:layout_marginBottom="@dimen/dp_40"
/>
<TextView
android:id="@+id/tvCollectCancel"
android:layout_width="270px"
android:layout_height="70px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@id/tvCollectReport"
android:text="取消"
android:textColor="#FFFFFF"
android:textSize="30px"
android:gravity="center"
android:background="@drawable/cancel_button_bg"
android:layout_marginBottom="@dimen/dp_40"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -0,0 +1,28 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<ImageView
android:id="@+id/ivBadCaseTools"
android:layout_width="120px"
android:layout_height="120px"
android:src="@drawable/bad_case_selector"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
/>
<ImageView
android:id="@+id/ivAiCollectTools"
android:layout_width="120px"
android:layout_height="120px"
android:src="@drawable/ai_collect_selector"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/ivBadCaseTools"
android:layout_marginStart="50px"
/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,192 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="924px"
android:layout_height="668px"
app:roundLayoutRadius="40px"
android:background="@color/module_switch_map_bg">
<View
android:layout_width="match_parent"
android:layout_height="113px"
android:background="@drawable/ai_collect_title_bg"
/>
<TextView
android:id="@+id/tvInitiativeNum"
android:layout_width="120px"
android:layout_height="113px"
android:background="@drawable/icon_num_bg"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:textColor="#FFFFFFFF"
android:textSize="46px"
android:gravity="center"
android:text="1"
/>
<TextView
android:id="@+id/tvInitiativeTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toRightOf="@id/tvInitiativeNum"
app:layout_constraintTop_toTopOf="@id/tvInitiativeNum"
app:layout_constraintBottom_toBottomOf="@id/tvInitiativeNum"
android:text="时间14:23:10"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:layout_marginStart="@dimen/dp_50"
/>
<TextView
android:id="@+id/tvInitiativeIdentity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tvInitiativeNum"
app:layout_constraintBottom_toBottomOf="@id/tvInitiativeNum"
app:layout_constraintRight_toRightOf="parent"
android:text="身份QA"
android:textColor="#FFFFFFFF"
android:textSize="38px"
android:layout_marginEnd="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbOne"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="严重画龙"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeNum"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbTwo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点刹、顿挫"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeNum"
app:layout_constraintLeft_toRightOf="@id/rbOne"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbThree"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="速度过慢"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/tvInitiativeNum"
app:layout_constraintLeft_toRightOf="@id/rbTwo"
android:layout_marginStart="@dimen/dp_50"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbFour"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="速度过快"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbOne"
app:layout_constraintLeft_toLeftOf="@id/rbOne"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbFive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="存在碰撞风险"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbTwo"
app:layout_constraintLeft_toLeftOf="@id/rbTwo"
android:layout_marginTop="@dimen/dp_50"
/>
<RadioButton
android:id="@+id/rbSix"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="感知、定位、地图等其他"
android:textColor="#FFFFFFFF"
android:textSize="34px"
android:button="@null"
android:drawableLeft="@drawable/badcase_radio_button_style"
android:drawablePadding="@dimen/dp_20"
app:layout_constraintTop_toBottomOf="@id/rbThree"
app:layout_constraintLeft_toLeftOf="@id/rbThree"
android:layout_marginTop="@dimen/dp_50"
/>
<TextView
android:id="@+id/tvInitiativeReport"
android:layout_width="270px"
android:layout_height="70px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toLeftOf="@id/tvInitiativeCancel"
android:background="@drawable/report_button_bg"
android:text="上报"
android:textColor="#FFFFFF"
android:textSize="30px"
android:gravity="center"
android:layout_marginBottom="@dimen/dp_40"
/>
<TextView
android:id="@+id/tvInitiativeCancel"
android:layout_width="270px"
android:layout_height="70px"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toRightOf="@id/tvInitiativeReport"
android:text="取消"
android:textColor="#FFFFFF"
android:textSize="30px"
android:gravity="center"
android:background="@drawable/cancel_button_bg"
android:layout_marginBottom="@dimen/dp_40"
/>
<View
android:id="@+id/viewAudioBg"
android:layout_width="824px"
android:layout_height="174px"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@id/tvInitiativeReport"
android:background="@drawable/bad_case_audio_bg"
android:layout_marginBottom="@dimen/dp_40"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -391,7 +391,7 @@ import kotlin.collections.ArrayList
// 控制 BadCase 按钮展示
if (HmiBuildConfig.isShowBadCaseView) {
CallerDevaToolsManager.initBadCase(vsBadCaseToolsView)
CallerDevaToolsManager.initBadCase(badCaseToolsView)
}
// 控制 红绿灯 展示

View File

@@ -108,17 +108,16 @@
app:layout_goneMarginStart="50px" />
<!--问题反馈-->
<ImageView
android:id="@+id/vsBadCaseToolsView"
android:layout_width="@dimen/module_hmi_check_size"
android:layout_height="@dimen/module_hmi_check_size"
android:layout_marginStart="25px"
<com.zhjt.mogo_core_function_devatools.badcase.biz.BadCaseToolsView
android:id="@+id/badCaseToolsView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="50px"
android:layout_marginBottom="40px"
android:background="@drawable/icon_car_ap_badcase_entrance"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/ivToolsIcon"
app:layout_goneMarginStart="50px" />
app:layout_goneMarginStart="50px"
/>
<View
android:id="@+id/viewUpgradeTips"

View File

@@ -21,7 +21,7 @@
<string name="check_vehicle_detection">车辆检测</string>
<string name="debug_panel">调试面板</string>
<string name="debug_panel_fb">反馈</string>
<string name="debug_panel_fb">录包设置</string>
<string name="check_vehicle_speed_setting">车速设置</string>
<string name="check_system_operation">系统运行</string>
<string name="check_system_shut_down">关机</string>

View File

@@ -78,6 +78,16 @@ interface IMoGoAutopilotProvider : IMoGoFunctionServerProvider {
*/
fun stopRecord(type: Int, id: Int): Boolean
/**
* 开启域控制器录制bag包
* @param type 录制类型 1: badcase 2:map 3:rests
* @param id 指令/任务 ID
* @param duration 录制时长
* @param bduration 录制前溯时长
* @return true-成功,false-失败
*/
fun recordPackage(type: Int,id: Int,duration: Int,bduration: Int): Boolean
/**
* Log 是否显示
*

View File

@@ -1,5 +1,6 @@
package com.mogo.eagle.core.function.api.autopilot
import mogo.telematics.pad.MessagePad
import record_cache.RecordPanelOuterClass
/**
@@ -14,4 +15,9 @@ interface IMoGoAutopilotRecordListener {
*/
fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) {}
/**
* 数据采集配置应答
*/
fun onAutopilotRecordConfig(config: MessagePad.RecordDataConfig){}
}

View File

@@ -74,11 +74,8 @@ interface IDevaToolsProvider : IProvider {
/**
* 初始化BadCase入口
* @param view: 展示入口
* @param onShow: BadCase入口展示时回调
* @param onHide: BadCase入口隐藏时回调
* 注: 此方法必须在[recoverBadCase]和[onReceiveBadCaseRecord]之前调用
*/
fun initBadCase(view: View, onShow: (() -> Unit)? = null, onHide: (() -> Unit)? = null)
fun initBadCase(view: View)
/**
* 当工控机回调时调用
@@ -86,7 +83,7 @@ interface IDevaToolsProvider : IProvider {
fun onReceiveBadCaseRecord(record: RecordPanelOuterClass.RecordPanel)
/**
* 展示反馈页面
* 展示录包配置
*/
fun showFeedbackWindow(ctx: Context)

View File

@@ -105,6 +105,10 @@ object CallerAutoPilotManager {
providerApi?.recordPackage(type, id, duration)
}
fun recordPackage(type: Int, id: Int, duration: Int,bduration: Int){
providerApi?.recordPackage(type, id, duration, bduration)
}
/**
* 停止录制bag包
*/

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.call.autopilot
import androidx.annotation.Nullable
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener
import com.mogo.eagle.core.function.call.base.CallerBase
import mogo.telematics.pad.MessagePad
import record_cache.RecordPanelOuterClass
import java.util.concurrent.ConcurrentHashMap
@@ -66,5 +67,16 @@ object CallerAutopilotRecordListenerManager : CallerBase() {
}
}
/**
* 数据采集配置应答
*/
fun invokeAutopilotRecordConfig(config: MessagePad.RecordDataConfig){
M_AUTOPILOT_RECORD_LISTENERS.forEach{
val tag = it.key
val listener = it.value
listener.onAutopilotRecordConfig(config)
}
}
}

View File

@@ -105,8 +105,8 @@ object CallerDevaToolsManager {
/**
* 初始化BadCase相关配置
*/
fun initBadCase(view: View, onShow: (() -> Unit)? = null, onHide: (() -> Unit)? = null) {
devaToolsProviderApi?.initBadCase(view, onShow, onHide)
fun initBadCase(view: View) {
devaToolsProviderApi?.initBadCase(view)
}
/**
@@ -117,7 +117,7 @@ object CallerDevaToolsManager {
}
/**
* 展示反馈界
* 展示录包配置页
*/
fun showFeedbackView(ctx: Context) {
devaToolsProviderApi?.showFeedbackWindow(ctx)

View File

@@ -524,6 +524,20 @@ public class ClickUtils {
}
}
// 两次点击按钮之间的点击间隔不能少于1000毫秒
private static final int MIN_CLICK_DELAY_TIME = 1000;
private static long lastClickTime;
public static boolean isFastClick() {
boolean flag = false;
long curClickTime = System.currentTimeMillis();
if ((curClickTime - lastClickTime) >= MIN_CLICK_DELAY_TIME) {
flag = true;
}
lastClickTime = curClickTime;
return flag;
}
private static class OnUtilsTouchListener implements View.OnTouchListener {
public static OnUtilsTouchListener getInstance() {

View File

@@ -60,7 +60,7 @@ HOOK_LOG_VERSION=1.6.1
SERVICE_CHAIN_VERSION=1.1.0
################ 外部依赖引用 ################
# loglib
LOGLIB_VERSION=1.3.2
LOGLIB_VERSION=1.3.3
######## MogoAiCloudSDK Version ########
# 网络请求LOGLIB_VERSION
MOGO_NETWORK_VERSION=1.4.3.7