diff --git a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt index 2ba17285d1..1b8df636d8 100644 --- a/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt +++ b/core/function-impl/mogo-core-function-autopilot/src/main/java/com/mogo/eagle/core/function/autopilot/MoGoAutopilotProvider.kt @@ -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) } diff --git a/core/function-impl/mogo-core-function-devatools/build.gradle b/core/function-impl/mogo-core-function-devatools/build.gradle index 4e2d49d083..8022c1db15 100644 --- a/core/function-impl/mogo-core-function-devatools/build.gradle +++ b/core/function-impl/mogo-core-function-devatools/build.gradle @@ -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') } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index 955ee6414c..97d47fb65b 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -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) { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index f7d9efc4ed..5612b4a52e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -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 = 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.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 { diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt new file mode 100644 index 0000000000..b00dbcac5a --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt @@ -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().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() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseConfigView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseConfigView.kt new file mode 100644 index 0000000000..d4223e7944 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseConfigView.kt @@ -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() +// 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() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseToolsView.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseToolsView.kt new file mode 100644 index 0000000000..75c3c14055 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseToolsView.kt @@ -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) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt new file mode 100644 index 0000000000..ef2e5c00ca --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt @@ -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() + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/TestBean.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/TestBean.kt new file mode 100644 index 0000000000..43274f6d4a --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/TestBean.kt @@ -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 +) { + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt new file mode 100644 index 0000000000..b13e943a08 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt @@ -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 + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseHost.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseHost.kt index 12519ab771..d4a5574e03 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseHost.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseHost.kt @@ -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"*/ } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt index 44cfad5226..18a9d7d7cd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseApi.kt @@ -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): Response @GET("/yycp-vehicle-management-service/tool/badcase/reasons") diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_normal.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_normal.png new file mode 100644 index 0000000000..f9ed275c13 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_normal.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_select.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_select.png new file mode 100644 index 0000000000..5d0ed862f3 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_select.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_audio.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_audio.png new file mode 100644 index 0000000000..2d9fde3655 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_audio.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_bad_case_select.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_bad_case_select.png new file mode 100644 index 0000000000..89a6eaa5dc Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_bad_case_select.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_expand.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_expand.png new file mode 100644 index 0000000000..91cd5e3fa6 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_expand.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_num_bg.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_num_bg.png new file mode 100644 index 0000000000..c65c78d418 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_num_bg.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_selector.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_selector.xml new file mode 100644 index 0000000000..a1211f3c47 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_title_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_title_bg.xml new file mode 100644 index 0000000000..2683bf5e3b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_title_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_audio_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_audio_bg.xml new file mode 100644 index 0000000000..7435bac1f2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_audio_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_selector.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_selector.xml new file mode 100644 index 0000000000..11a43b059b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_radio_button_style.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_radio_button_style.xml new file mode 100644 index 0000000000..79a363b597 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_radio_button_style.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_record_edit_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_record_edit_bg.xml new file mode 100644 index 0000000000..37827cc2b1 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_record_edit_bg.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_button_bg.xml new file mode 100644 index 0000000000..612a3e5afe --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_button_bg.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/report_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/report_button_bg.xml new file mode 100644 index 0000000000..15a6a5f307 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/report_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/save_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/save_button_bg.xml new file mode 100644 index 0000000000..e08d1fa939 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/save_button_bg.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_config.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_config.xml new file mode 100644 index 0000000000..f7fc0a4109 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_config.xml @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_ai_data_collect.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_ai_data_collect.xml new file mode 100644 index 0000000000..74d2449475 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_ai_data_collect.xml @@ -0,0 +1,182 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_entrance_badcase.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_entrance_badcase.xml new file mode 100644 index 0000000000..8e82d72ec7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_entrance_badcase.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml new file mode 100644 index 0000000000..866963cee6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index c677c5d8be..16b5d10c52 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -391,7 +391,7 @@ import kotlin.collections.ArrayList // 控制 BadCase 按钮展示 if (HmiBuildConfig.isShowBadCaseView) { - CallerDevaToolsManager.initBadCase(vsBadCaseToolsView) + CallerDevaToolsManager.initBadCase(badCaseToolsView) } // 控制 红绿灯 展示 diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml index 0e2e3830cf..903fd53cb5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/fragment_hmi.xml @@ -108,17 +108,16 @@ app:layout_goneMarginStart="50px" /> - + app:layout_goneMarginStart="50px" + /> 车辆检测 调试面板 - 反馈 + 录包设置 车速设置 系统运行 关机 diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt index b3331626ff..a360b916a5 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotProvider.kt @@ -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 是否显示 * diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt index b6d2b0a6f0..e622e30726 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotRecordListener.kt @@ -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){} + } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 983ffb7f21..984094ee77 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -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) diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt index dd2d352072..7f3da3c452 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotManager.kt @@ -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包 */ diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt index 06012928cc..b1280cb09a 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt @@ -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) + } + } + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt index ebe2f519d0..ff562c7e81 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsManager.kt @@ -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) diff --git a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ClickUtils.java b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ClickUtils.java index a0c2d559fa..27daf5217b 100644 --- a/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ClickUtils.java +++ b/core/mogo-core-utils/src/main/java/com/mogo/eagle/core/utilcode/util/ClickUtils.java @@ -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() { diff --git a/gradle.properties b/gradle.properties index 8ad27531db..3cdd75769d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -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