BadCase
新增BadCase录包设置、AI数据采集,Badcase改版
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
) {
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
}
|
||||
@@ -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"*/
|
||||
}
|
||||
@@ -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 |
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -391,7 +391,7 @@ import kotlin.collections.ArrayList
|
||||
|
||||
// 控制 BadCase 按钮展示
|
||||
if (HmiBuildConfig.isShowBadCaseView) {
|
||||
CallerDevaToolsManager.initBadCase(vsBadCaseToolsView)
|
||||
CallerDevaToolsManager.initBadCase(badCaseToolsView)
|
||||
}
|
||||
|
||||
// 控制 红绿灯 展示
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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 是否显示
|
||||
*
|
||||
|
||||
@@ -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){}
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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包
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user