From 749c7b4a5709fca6c843ea3e64a299a595645627 Mon Sep 17 00:00:00 2001 From: xuxinchao <13522809046@163.com> Date: Wed, 13 Jul 2022 18:54:13 +0800 Subject: [PATCH] BadCase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增BadCase录包设置、AI数据采集,Badcase改版 --- .../autopilot/MoGoAutopilotProvider.kt | 4 + .../mogo-core-function-devatools/build.gradle | 2 + .../DevaToolsProvider.kt | 6 +- .../badcase/BadCaseManager.kt | 119 ++++--- .../badcase/biz/AIDataCollectWindow.kt | 316 +++++++++++++++++ .../badcase/biz/BadCaseConfigView.kt | 252 ++++++++++++++ .../badcase/biz/BadCaseToolsView.kt | 38 ++ .../badcase/biz/InitiativeBadCaseWindow.kt | 150 ++++++++ .../badcase/biz/TestBean.kt | 13 + .../badcase/consts/BadCaseConfig.kt | 25 ++ .../badcase/consts/BadCaseHost.kt | 2 +- .../badcase/repository/net/api/BadCaseApi.kt | 2 +- .../res/drawable-xxhdpi/icon_ai_normal.png | Bin 0 -> 6548 bytes .../res/drawable-xxhdpi/icon_ai_select.png | Bin 0 -> 10450 bytes .../main/res/drawable-xxhdpi/icon_audio.png | Bin 0 -> 3704 bytes .../drawable-xxhdpi/icon_bad_case_select.png | Bin 0 -> 10628 bytes .../main/res/drawable-xxhdpi/icon_expand.png | Bin 0 -> 332 bytes .../main/res/drawable-xxhdpi/icon_num_bg.png | Bin 0 -> 11032 bytes .../main/res/drawable/ai_collect_selector.xml | 8 + .../main/res/drawable/ai_collect_title_bg.xml | 9 + .../main/res/drawable/bad_case_audio_bg.xml | 9 + .../main/res/drawable/bad_case_selector.xml | 8 + .../drawable/badcase_radio_button_style.xml | 9 + .../res/drawable/badcase_record_edit_bg.xml | 10 + .../main/res/drawable/cancel_button_bg.xml | 5 + .../main/res/drawable/report_button_bg.xml | 9 + .../src/main/res/drawable/save_button_bg.xml | 9 + .../main/res/layout/layout_badcase_config.xml | 327 ++++++++++++++++++ .../main/res/layout/view_ai_data_collect.xml | 182 ++++++++++ .../main/res/layout/view_entrance_badcase.xml | 28 ++ .../res/layout/view_initiative_bad_case.xml | 192 ++++++++++ .../core/function/hmi/ui/MoGoHmiFragment.kt | 2 +- .../src/main/res/layout/fragment_hmi.xml | 15 +- .../src/main/res/values/strings.xml | 2 +- .../api/autopilot/IMoGoAutopilotProvider.kt | 10 + .../autopilot/IMoGoAutopilotRecordListener.kt | 6 + .../api/devatools/IDevaToolsProvider.kt | 7 +- .../call/autopilot/CallerAutoPilotManager.kt | 4 + .../CallerAutopilotRecordListenerManager.kt | 12 + .../call/devatools/CallerDevaToolsManager.kt | 6 +- .../eagle/core/utilcode/util/ClickUtils.java | 14 + gradle.properties | 2 +- 42 files changed, 1740 insertions(+), 74 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/AIDataCollectWindow.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseConfigView.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BadCaseToolsView.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/InitiativeBadCaseWindow.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/TestBean.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_normal.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_ai_select.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_audio.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_bad_case_select.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_expand.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xxhdpi/icon_num_bg.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_selector.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/ai_collect_title_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_audio_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bad_case_selector.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_radio_button_style.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/badcase_record_edit_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_button_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/report_button_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/save_button_bg.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_config.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_ai_data_collect.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_entrance_badcase.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_initiative_bad_case.xml 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 0000000000000000000000000000000000000000..f9ed275c133e816e3653e4e6e7ec528a289e6a9c GIT binary patch literal 6548 zcmV;F8EfW=P)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91W}pKA1ONa40RR91W&i*H0D(sx<^TW~{z*hZRCodHT?>>|)p_3g+At5%n&Nl_XBQEQOZEVYs{RP(Sarin?d1|P(guB@ioXk$f&pw_@( zOfYIid^81XOi&O|R1jm0(zO(jnPDFH-gEkW|33TNb7$_{xsP)%1J0Q_ckio_bp;cbBJPJGGbCHRGf!-d(apyNDmMn;vR4n?HYbY=5Hj@{ zdG*oOQ+I*T7d=mHj3r_l#v~iIwzXZBj<$^QqzwsTKt|1e{n2@@@-9_M&j1;Xl^Yp9*D=zT7^xt{PJ2{F*R7!?cdaKs4JJzkb>ItneQdM!Q8ZjI@ z_UZi>drDsmQ}xLzwz2%8w0cu3@6IM~%rB}n7FC6qKfi3*IVfl;%+>VrQ96VYw8qR% z-SEunMZd0eEh$8*Rbu>!oS2zc{&=j{ReL7{fBuMLBS(W^+Md<*J=Z?H z@@pUFh%PxOQew_qaPJwOtMA4+!Gw})bXaE8d$i+yW&Ns_7ow`Z6P2Kum)-kSoJp_w z_>n>cy$NhPF^CG!Sh<3@mK8gC(ruUmUkh20YGAo_t8#v}{hVo^nb-W+^VdH2+;caV zb>34JkX%aH>wNUD%2gLu8HAx-oTDCXc1M4`oTZ(TiJ5i9$_BTmw-qz68ABVTLsL7< z)HXP^H4E3>e_`_nSB*g#&BAtPQ`4k8|3`9 zP%sJ}{N?14=P8~lS}hB$%n_YVD_nX~Uo7+_v>;-*%%ZyLp89y6JVx1F^d42;eSRU! zH-q+m3}BjTU&EwCK@e65fF&^ReQCMPkxaRN4O=>U0#gCjzK7!&JU;&KwhyIBtV8z*wLcBqBn<`ls? zN4@$HBhzEvVl=!}1p(g9m23Lkj~L#Jci7$cRTT&;R0!^|6U_UF??(*pknEFY_^`qV z;qzWr44rv99efv z7KvCk3A~r0usxiw$RdN}#6EnrGa!b~rwo}#A%f~w&qHv{X34O}aB*)^zdaNkCeV_U z6y9zzih{Imfv=AofNBpi8Z3@LpG0U4Oa8a~iu8ymQOd_Y(L3sV>q7z7pQ33DLC zn6pnj$@MYYGQHb?Da{X&Vb}m%40A&}jxA$`D4fGHEZD;SAg}1})Mt?nnDe6c;*n=}c9F_0mf zBNtcrqnRI|Awd#!1Pi`1Leq8+D?|EdOxz`kF9p=R|XSiaF ztL@+gk2Zmn3^^v=*1k}e4+SIbW@&>w9b9P63a2Az1~@h>yyq)8oX!iTxVdr+Op2#S zO3T98&54=>9>E0ANbJ&t0rV-8kEuQ3(^G3*H?3VarQLK|i+K|*BRQyp5S**j!ow^V zj@!3Gqu|!`Wcj#Vh9A50>yCAgCCLvIGZ#KH)qz@yus51*A+pI?-~~ z1;jrEM{pE~ETj@)3>Zy_O(!t>c3v`p3>)dEu@d@_viQq$n&TivNI+K66u6W~ zKZ)AE{{WOEjSvTgQhv;H9alRp>>3yE5hSGrMKVorU@I_)>(!H!INvy7>pDn|ibUrl zWprbmKIhC&)=xO9F}C}EKTQ34(PECgP3 zUcl$$z(E+HWC^l>px+LnX1yU&rWjHZ39Bh2MzRXdmXu^N?LGA1qwVbnIv~^09{v?H zCB{e0k>1s59aC|?5ITcRKWt@kyW|8Coawovs}*Y7V*yj@#1keYZurI*nhhz&jF6mT z#*a?i^sS4UMvtzInL#+M(;S4;IM?6~J8yO*=D$VRHbsahX)Xry@rgwo=rQ|ZGGn>` ziEp-89`|05vZA%EeaCBWq-1P?DI`Wl~e@mha4M9xl$M2aK?;dy=O@wq<&%`w`&M;qedV>3AvpuG3|m%T zaA3wUR8Yn`rn8ZmJjMHT14k*o>#HhT7AYu^ps)*096u^{%k^`{Ho!j7#xw1rxsND|1grcK5kXv(Cc;)}1EBibm0BMr-t9Y1C^ zhTQ42*SZ{}Y<&&pi`8Sv{w7{d#A29Vz-2Ig9L&TFA+j70qNZe$MpliOex#UItMTJT zIyZl3?%2_dBV?W#^k8a+07Gz$rbsUb7N)lgr|Qf@E669N>l`sFwqW9%c&()5RiZ! zvoymACTPM)$y|_Sf72c`20!+=Qf_Wilp5F6;N1ET7mgjV?-|EKj>bgcJ4j5#akSYwt=rc4|czq;k3rrKJXNPpG^`BrNT*&1Vt zuPLv9lt4>}GKh%bbdRnBxMI{6x;)0ICfCW}+CRZi$P{0xKcX?jpkmuVq>LF|?_f+B zJFdAg9%u%dX9%z^d$H$j+4feFgD=y`EX}5aD`EJ#0?T7L%tx{~rmVo2l0^!DHdx0z z2U_BQ2<)OUF$da16UK0wGv2f6uPzHF%xFC2oMv{$rkylzA>=gr(js#PBBh}r0a7j; zJ9$!bLTo%ivb*$RW4_S$ydVE$ZReBgH}zt?(9gfHEqT(3)8gaCHDRQMrl6(JnA2ESU+2&8I7WdSj#U9kFl*=yD_5-U*s?jKDSb%+_(Dp|@nX~z zA<2*>rVUFoMq@~(C5153xRtnRwHGfC(vfS7Ath8PB9E=UKCW;6)|}?4lgB2+v>@1+ z7$0P0lraSW{@b$04?h0n?|L~MW_B!#s9Tq=?09SU`#7(#V+4CYHO+#KLSl}-Z2qi~ zqA5)0mtn>dTMjja=P9c?HoyF8#(WJ%3dR2&g|RabYn zy5+X}I^N&27bA~>!f1hSo+#JfITi(^NEw(ylPK&Qw|)vzwru8!^b zb*m{P1p`0LnuIegO&KQwta+dTNg)w&W4`*4LbF9ud`;;?N?F=MM8OHyN#CZw z5*u-4|GEC_vzksieqyZ!pDs6EA(Wmkz$vxnk&Rss{_L4wBOyu`QABo^X&lp}6VUIEZ6uLe##)QE z2`q9{-noj%$?>E0^R0KCwnlFF1CAR})VVp5l^wKW=bq$Ew?DG?OJ6*raSE2+Kiu2l zKK0y|?w|j1V>g#YIJ)C%9bE$e%n`vLkRSp*n%Y6y{DE4QKuoo$X`J%%%6l3~-rD_c za_6phFdHxz$v7#12}BHg3gv=Bu6GH!ea`5I0x4(~xnS#r7=Eh5&AR)KOr*MHrd$^>}LWCGNkRzHQtHh9L*S@Ho9LHFWXqW9M$SI7{m6AcO z_$%{6E+|=u;rCPa>W|t{|H#+Or1}ICzyU|%CJo2P&Qow=fMVH;i5eFQ2^;}4rbWgB z9Ls_sz~dyJR7r9ih}JO_93T`iqC+SP7tQ3`J;FR3(3$#@NdYV{2@RJD&I~n zh?$UYJ|y4?Qw)r36Qrb*12Mo!P{JU99A4|7T{o^7S2(y^dmp1IBZ<@;F=t%EB)CQv z*Q^|__;Or=%brhCkq4#_$DC@zBy!3v#|WpEIJj}k=Ckgh)D(lcx50kYK{SSeXx789 z^cO@z3cxo#+L#btTyWBk7#@tS9&T?z3S6*6xLpu$BP!yc zw6)>)GzS{P(r{I&4fh#dSzgI(kl#Sxguq}R0A_|}2|k(~8L8oyO)wy+JR-<+*^7CI zV;%;8@xb30hcYP3q%s=ESq4oYi|1y__x&P_fsikeCg6~1im8@h?|a3u)eOSUo4@Qy zG?h;^m9%B8mk~58g?>2zK@2sp*jNB%3=;_<69Tl5g0ulCeXAQthdfGUJY`d?Uv?;o zk;^zKK-_FX{5Uw((iBso-nzbR(O=MSw|?cLtKDHEOLu($1z2AS{jyUNI3UpVck$Dt z@z|s@*a1}>o6WeaaHi5W4uO(SAU8ie7h)LCOYBZrR7*N03p^ni5*n6oO0M*8F3iKV zlJdFObl!qx&!NMW{2ei)H53=>u7UQj$WXYHYJUKtjVl1KOgYRyfJ~#NrhqJ&woJMP zh7951xC;C6{j>F}7JUw#D60Ye>cRv72QMcreai?9@eWXoHu$|2;u#z463+mHWC3Vo zWMpRQ#js4cm6VAWpOu#-lQA~^!1DV@s>mU+?n?>_%Csv~EWcg{aLT$IkP&PF2o(?p z%lbpnVbHR{&q@>=*fhqKGZn2 zWy6;N^L@5)Kw{X+S~vbZ3^*0Kz3K46G0NH!Q+}>7pUk|(@V&tNq+mV)!*RtUKuq(! zbD0up`15X@KF_>t*#k)U`Me2-BMU+RR{u9;X^KwgbuLYY3}JCE>H>?^6^ z3LV*ge3lVd4n~ULUMLX5pD8I6sR7dA0xQl83jRz<&X+Og5{-`pyo)CTdJuO`uK3}w zK@f2C(x+FoJTgeCAi7{;n1f#o;&&e5JvERp>=_&Zty-U6-SUIM6J}BjI>uy@8sFI` zF1it?&5@qp^ey9vItEsPS&@wzbXJy29$%`tPak*yGqxGI;)lZw0vO~sGQ`eatz=@D znZ4ocPcOO#r>U(x9^QZeuplO-YKq0Mq%p>34!iy*)4z-BRb`PKmU&qDc_XM&w`2Bo zR}}S*j2Ko%PC{LMH?Ag5h@x_bj|`mAJKk3c{l;Y>?TWN_OU3Y=N3I7IQuvXOM%s!t zM@b5CiBw}O&|LUDf5E+r@b-ys<4ShLUx{MNt)|PRd#(~cwW?(qW?$6d??L^9T6^OUA$H`*wTGDZLKIVwqpEx9ST~Cd%q6xYaVTlN_26J9;$IezAKL< zO754fD#WlY@~u(*T2PGu++xJLS$N|Frop&bwenllh_OxK_``2< z@$*l(SF+?gKCQe;y13zLD{sbIx9X}VDlv}at9#Xn30H=nf5JtI`7jUjVCEuv${<`q z34Yvl4^YjbsiGLgc~Ab5k8wDU+B>4ERb|MK#TYl_jr6>s~2(i>_)tXY-3Y;)GO5* zJHlPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91W}pKA1ONa40RR91W&i*H0D(sx<^TXFJV``BRCoc+oqLdFS9RX^?U|8A zVg|_q0}^qR2r3eSa)EF#sX$^&m;{uBhp~hR$Y5eH20XQCKLRdd7sN3}FbRZ^Lf8djK+I_Ln(3SG_nr0a-uHI*%xLsLyXKs=_FCV1 z?6uB5=ib{reP``HK6cILD{s22oqAxUoxZx-PM>WtefY{sJ8|CHjy7vMwS=AXdD}Ug ziCbxVCEF`*ucrIN|3Jsrgx$TerS0CT<2RnyzPW2QTfHwYou%BT#xGns-*VNr+gS%& zJ6nZ5Th)7ll006;^-zJ^Y-LC}D}aUGx}2{Lpzb zg}m>KVJSblq#k+Y{FtwPtDUPRJXcwqqoSSQY%05T#jQeXm$(@;AovAr->m8kvV*8dlch}m07#|ju*^6KZ)-B^I}T(Lj3uBKHK^`?HPJr zyiVcHN}(x^c~uXZV&#_P)RL`eFR~P!ALYSf2%mY;(FRD@ds3%a`=WAr!-40wkIZH> zOzyRjbno$iJUc%8jrMHaelFGu&rI=Cpim0LEsEzzr^!w_H&1ihi`p(&R)c-%Lp7bA zIWS-th3$M~7A&1+?Rw>N=`)XSAH27oMM-lhle>4i^^Nl~h z7-dFsy||im-k@P#tLXZgk4;)=NZCU+m0P*)v|G2hmmT<}*{9cO?q)%ja5uZ1+#Ubs z`6;*F(SDa_h_C)CF2zWLmJ8#ZP`F^0Y3zyOX5tUN{7w@I5atjIpFAv=$Trad8S%(B z7{Xj}>~ZZ?`!AS%djs{|A|j2ueefLFa%p?H9KT+L*hvuxL=hOvg&vF13k_Dsav|*q zdHKPgWdrTH5r@Bw@FN|0aGA$uJ>9Dd?vjJgZ@+&}Jbw-!etklRlrRs9gRF#La*s(YZO_9s!NBL$lGKjC`rp3NznH7z6 z)-8~NC5MrZ8?J$o)V@PgTY+YEAN<>PzkJ8QduU)eQ(joy=drmePzQble- zeZWUn^5|K=Z&w3dz?NNbb8SV}OmZkMVv#ZIv+(h6dFi`f3(HUOCbIQ_4#()L5Q{_? z;_AG8X629OuUS+a{p>C`X4kIy%F1ue->%}kS&P}?qA8ygFGX_^E6-)jLcz*5_^~Ll z>-Z`p^4_q)zT=2HU_GsQE@bD%-*>+vcUC81gW1LOr@e@3WhhL`AO^8j;f?a#k&i3^0o;TaK zDd-T2quO%plpAkXQ&!a!2GwDR`hyGRI&#nVS_*@#&j;M{dcoyD7hkz$*|dBu`;1+v zQ^P>Re$1@-bl&KYGwghk+75Z1SKtmY1U+ZZ-gXrq&>jM|sp?KQhG)uGZg20C$8}91 z%DC_}pf5_<_96=l??dunptdWWNFTwwIZL>1SMp%T3#B(e7)IY+;^T9zJBIXAazX%h zGh8>AAm@B_UwhxKqj=_w@kXDU@++^^gTA$w8IaX85#Mi9v5xmqH`6A| zSM^+rGssly8BH{gQr{x)D_f7!ubnq9PkYE#jj+A(U% zYgDwUDY&Epse+$ikm$94w4_4 zOcwz@%U9OW?MoMXrXDsH2R+Q7W_R|bbmAYzb!%H+t2d7a^*&{$mxYX8wGDU!N)DeW zOE$e|lB4n(2W<4Ab|t-E1e9NF(BmL{Y85-v@;k~F@+yB2k0qbT>_3-s`5Uq3H#^PR zLA?q6*&}@uI=bJ?W!t%H{=j{=w7*bh56xmygv?FxX2n!27pNAPf;dQ`h9VT-F(bdE z>zF0^Xb&cNZJ4LjT|V-%>vDWBHlZ8hf}JeapY;jB{kFG9AIZlz>Hm5sCE)|fef!$w z+Twmk@644|&w&gXP-p9z+37UNbBnMx_GRNjiqCDR`xANiNi@ zEP3g3kMD&>E&SLVLy?t^`MUVhr|`rLHnL@Ed*QmTP3+?bgJOi#O=n@voVma?8Q?Rjqobg9=UD@mA3*b{L)gCYtDYmDyT^g4e{HRwM!0)Ub~EATytND3F22+&c+I@`bCExsL7|EHGp`z%$Pwb`9^z zFdwjqKia{M@jV@4Bo=bN(JX(+8McS1IqU*&floVcyQRHtZMvT8zSgN;Ie(Ir*ASy$ zT@r*}%K|_hI9cW+gEF`j>{JviW2EAJr3bU5x2|NJA27~OK9cuH4O9H?dI?7!-Cm&h z?=m^qOond{`B+#FLS!2Zy-NGJ&3;V1;f~=KCv-Jl#tQ6{m1uOn=DF&uESXn5@+g_> z@B*WYT(sw1ICe~8bzR{S6Z!JavP?d_o6r+e)bT}n{K_G|fPjm=b493OdzisjWcH7* z9ED4~brk(D^rM2ysP!P~?1qi`(4YFZSxyhCFF*-&KE(q>VvwRe(Ig!G_)*4yb%E`` zZtSo78swIh&*)RkkrICy%WV%C$A}H@Ftw)OHd@!{cf9@DUcNn`;bE8N6UgV&KfJ#^ zdzg22U1NADr{C(mn1sDRipi)zmQRxDoS>rXbc0sT662=JT!5@ zaEx;M9^xBYb8y{n_}Is$d}7!AqGJp;lVFnZEVADSgRi+R%8NI8`Mj<%vsbofDCn7P zN(D>8xpj<5b)G;3RU($bk4cR4lE)vW8L>5`S;D5k*;(i!v%dUURyJVlLoR|H?ShRg z7eu$io}yMP;>2HUMp^RjvH@?M=KYgt_zcy0>wDWXG7Vkdn1k(gB+UpV*f<}rykMO4 zh)Zy2j>*m9Il9n6>t_Py=xQYPD6>i!7jnRn8~9$x(uFwpiVG&VtZ6xZVu!}h*bMk? z9{@29F%*~IN?jO>jk#$4csV|c1QX0W({dgfJ(PoF3NkSzkG@l`Xh!tmi}poJpB>c; zh?(SlKJ1PZ12^~vm&3U&VHb3x&x&EaY@oImWia;;jgELDrmqcb;j@;^I|gT}`L_3{ z_QP0c%nHBYT|q*}LPeJ3az!D}wue9Ls3I-kvVg(f#l|_&6XwL=ZxE%^F{hmkcY$xaU1Ulr)-)-mWYB?#L z?|3o&ij_}aK}6GlBp=!^Sx~OCzxo-^H3#GAahT#-H@nz3tpUdSkS> z=i-FJ0n5nSzU+}ROvML3Nr!pardgAb>?&y|Q@$4XI2!E7S28_5ekwjDz+C_)8p#jJ zVcozdk4Y|tiXEP&%+(ORgvFC7O>)y{6n;cwW4oaliIsKPjgzXpieE^YP?MbhxaBc5 zM(;kAtbc}|MmRuFqRbDq#=hakXF23e{rxZW#n07!w8pmOOP#RT^Lk7R&TE@J4ew*0H{WV2< zU3;vYo!|nic@ZQ{VmhEHG9urzONV^KY1(a^aB#_(Iiuv^1xc7Yr`?xC~x zseie(ov@uqtvx`;zxnA|d(4Add(sD{|3B;XDad>UyUFoPpGdl4np$t)@~rsGBg5z9 z8BT)bPHgMSw_kY`Y-$AVDX5C8XGeeKrD8ws zA@laB3%9lV*G?(73*<2mQe9+g`{bg4xk!=&DULijWghA^%Dd+k1zxp#!Y=(D+Sc~1 zcB<_9|D&I_>9qdQh+qu#6u#q->9Af5a$}MVMm2B&)}u3;VQl|CtvLiU8Zpm-6ZSiE z<)iX+=gBeeRnSiEL9Jc!O}m9=|I{h1ed_tg_S+Y(HyYpmp}Z(puit@%>hYyhV6R_d zmIR;S`e=fPT&%-g$wa0xYsbIo58J6*rJ4R;WI5^%Bc1<5U!uOHd9^+TPmvkDj&Dbff>$-^|+;f7#k?2cj21|FILS@9(*6W$3)g zj~tM*gEVtfkaE?ly4=S8{>ig;^$QN)l<(|YZ6Cc}!4LZGZ@*qY-6sdrsV0*2!lwbq zyw)|cR$p`sC)^r;1!SxK^ap2h(7y45l7ZEK{BU0ODLFC?pLGH` z?U&jq+=8^=xr~15p?apgP)#{*EryMkPPgf{_q-3@+P-(QY`08J;8~~t;^&|1+RaODQ0@FGGS)2 zne0~EV^5|j+mEOz&v?(x?b`o+Kt0EI9VFBjIf=7Q#8do9o*H$NxDf3!r51OxJ$*&n z{NZr|_0?B~X-aCzJiMu#MHZ($@A4JjPEN9EVWgvp3tE)GD%@G8%-bhlyshmxHXgyQ zjnf{m(mwT~ZS90(rdtv3J)E@ZbpOY%U%k;ZCFBRcd{6J#6+=zA=9jm(6A!mj?wGe{ zzI$)G`m1-?pD(`2Wv@eDzvPUC^-IPoeCH^;V7xkHN`GNUrt}}qraIAzGE6xrsGTm! zM<;PkjgydV3Y1$}zhdfYc0*!dIyL1{57H~6mmL1q@{^~mw2%F(ZEgFO$!>jvhlJb^ z;b@YY_gK9ozUDsdyJkv~Dk_KXBeYebF)P0Xytz z!XD!MgwwXPE1$Pbzeueh2XvI5G{8Fvxj#}7r77ILj<6{||E?djPki}yFJoHcl-E=% zUPeqWGU!-pWUz8(rK!(^pXMxQtYdT-Ofe>7O?UDhW~YV99Y68 zwjZ2#yD;NUAxPa~e7UKhr|Aa`*S_M|_MrQ-fscIrvqx=h?>>K<-00N;jp25d28m9$ zFzF;ei#Lxi-rj!f_$0M)oZHpNUr8&b+_rY(zIl7~Rd>`YG-W^%I`pJ*(r4*omTO*eWKDV2JHPLp!pkiET8bU9J7~hH z7e4XXF}_dKjS>`qGGJuSE+d(z@&4a>cH=v)=GO%|UIU{w(#tGn^ zT0@YRZ@RQ)N_jYQRkIC*b*f#Km`o;mKI?3F`W|ep;SYwIK77^}3YYMDo-R zJ+)^pekacu^DcB5p|hi9L(K_f1JRy9$uaZ50U)SvWAHl6E4m8y<9f+^?JJLM4|~v| zn{q(S{PbVlI{7`s`O>FtZ!i35HHX`ppDnBH(I?N_H7`BVrtE1S|I%$*6vb9fY6#Q~ z*+Q9^54%OH2j(hhX=y;O4{NVwN0y7;^(&iP;N>Yb_5VlT*Bz8I=5dArjuIH1@oU}n z+;YH@cOE8ibXs6`%MFV*HR)bdAEzB*0l7bponeYbF zHIgc|61!Fx0hwC{)f^lL!!$hg)8F#sQs9qzdZ63LAGLpOythQIu-J?)A=y;*lY{do25-)*1y@}YOm78UM4y>LhS)hBLi zSHEJ%5jEv}HRX^0lBTG*G(fw9-O@sRD`U4v=7UuW$NIUC>40~as0*wpb7#2ry%xq`8*m~UvVhO_5mj;T=cXLn{=vf!-4rZe z`tCjLUDxQp$Pf3}9otvhwU<1&J@&Mt`XAc3?cz>ESOsI2DPGQ(WibR#m}f0{}tZ(@1=<8W?_uAY_gg3;)APLm5t$(l7_e+ z<&+1$4&DrY>}AIsQB!{Hecx~I`gHzoK_boCzFX(*+&6!x{ja~)E3msTXv+C|(0}ZI zP7nI&SyDSiJ0!bCe~iVuhll>OW4L`y`EcfHr5-GqV__@_!TEa4waQ!uwhy+baJrQ> z{as=W2ZE83hZNK@<^vDJ4if+YJVUr1sYhIG$EYb+sVP5mhJRpc=w_!&uDGfF-Y0IB zT2Z*HLg97r()gdg>AUTQJ$%f3=Lb!Bwwm%^|DqoBDLy*`o?W6p?(E%xOz~-ocZOHa z^M<90R(NMQ)W{F{q&C!#^3;l4rm0?&47mLXq?^kR*fC!NkY*SFq8!?oDPDEB>+l)y z#)}CkO;H5i&g57Zd`3odDD&U`#0x` zIGpE6KQ(1f`{@4|UVRZmvAiSPr0Et$Z0`=sYNyomWX_KpSa;PS%Y{;klp~mhoq}26 zoK^XW4`jMaer-kT+>N6?1nhXMz48fA_XHRk0{+S2~TV-DYxw|#tX z`^^tkQ_>KM!o7Ya$5cd$cKx>xwtxQC8{7Wd61WoEgwT`=^q~Lf7xSR6X8XBOeig^J zHOJR#p?;Q#rzx6Fx3Vh!SPS^7UFz5Ah^tx}KBP|bT;IvZZiQ;Qao{n~$N;-B5cE~} z=uuCvzM>OI4Vh%~_A5Vg_@=z`>YLlE|D*ouyKh%YNfq#4nW9krs9TJSHDNyg^#kp^ zf48Sm^g|6d<+45PsxJ<=FZ|T)%MW?^teEQ&V_}?Eh?Bp%O8>A$4M&2KAg& zv!UpnM;19)YRX)p)R=1lLyazO7cgl$H)Kdw(c^ z($T>KHxFI!6y5LjG?q$7?Vf(yQ6_()_a86N%WD7JWrHxhL4A&P%2mF74Zg>n!ZXDU zsb`6JzsuKdnQmt|u4hWtO-&^2)8Xo$(9%okM+Abx!+LbXnhyG{x{Ix}hqZ4i!u~|a zt_Z~}bwv^V|nzP9^sbYUpj>2_6( z!MAT?Y6_Ht0G5gJTw#G0i?XzWWc@uaEDK_pcm^_$(gib8@VJf)yi&XR;Hzf;BoBb= zBzrO_gFtJz;{@Qahe-y;bCFTU)T8Xd{Q3V`ZBKmtzV@c`x3|Zfx~1Ll{nhq|*WJ>7 z?@w-#4>?K^#-^C(>Xn{g#AB!_{wQDnU&Ol-nSbUlfL@Y+PCx$r+}E@Nb4kju-xl#h zLws<1%#NvwBPUQE_V{M5P;Sal6VmhbCpC~>Ct(l)Ex0(z28>h791wgkqSDig={GU; z)28d1fBQrV62Uv9j25HV*gAufK?RwjNP{1SivMR{Uu|c_1j2KE#qczl9$^C#c-PZPX55?ho&;C!(#)iVWm5-pE} zjEdD{-M#P3*zNqs}9Y>^EqXTN%oj8k0Z(U){ zr>PWWlnzkC)tyBfZjhoEoR1`gy^#$j>8T^5VcBrAQu%91L^O zh3AZO!aq6b@LU9{wRowuKD2$k#ZzDx*+5%iImxguTWIVTcx! zn``69m~tB44ol`BD1wQAxqsISrG#2=e%RCtOhX7up?k6GVa{LNLZ2%=mlV%LKT+m}fP{&7?OC}fB z=1U#4${Mrweixc40W-oAxOjIsa&RN>dBQ?z4q@ux>U9Iwis@YfCWjj$+kO>`_X>qs zY7)Lv!oX6lfZbPy2;R%qeSu=0F9XE4<`35kD3eXzY;t7G>cYE)BGO z>9}nwv-j83)tdM-+Q-G{4Z$=`&;%Ks7y+)ZQ^G>9NZ*t}7hhMo3#f3@51fiJPcuxh zOM_xBn&ROT-VGZH>?>csdK1(Pcpt*`=Slfa!;_=eK|HT)?UXf&O1m~no(mPbkq79M z%VJ&QkjJK|$euG!bq{RC>ZY+vU;m_UdGKT~>hro(1Jcjbp%$yCwWG zC35!(EBk(%6R%hOmyhm^9|iiRmoLb{SqrkD2AbM;91BZizs^*&WD^=Na~xP+JQL;= z-SVOoAVo8cU&)Dwj5nON5f2@CO($9TV}gxwI>mpnUKhFy<7xsAUX*^r_7NL&I;<<% z^4#{p;6PuwHNSZF*zQXVDK3vUEDIJhn6$YfJgWpcuJ0P6*Fh*&!<7r2DznDpBP+1Y z6vr@FOc-P3jF+LCDat(hO?f++@+uZW?xf%~nqi0Cw>!tX}Oi?RWrwuQxs(tPFFl(1C3Wpiy;}KPo^p(VfsF3hQ7gmpK#E2i$E1s*Xi#uaWjHiQLRx6#JPbDAY zk4?vXov)Hb9tt*Nl+~_rNh24{j_LkO=k(xpkR3SPKrUTw3Zd3F2I01a5!(=nCX*%wZBL{7>q16Aqj$v zL5+!L5}1;(*r&*#IN?a4#dfin6b+%{NzVY|0j7?KMrz%HK$8(K-hLI|l(~*RG9P6q zGhd=(j)q0A$=D?9bys~^-syuKN6I(KCjLr)rQnt86_Ql2g=R>Gm_oW3gJOoQ3p@!&0vMzMF>GHU>V8TR{f$^RjHP8JlmH`u6l=x3^a<*e^{E-Ix#R zdmd-)k|mq<(;EB+&AH!LbPnUVEybvR+koGUsGhG?$Z z$WjmF{r+FL*w+;|*(Z)@)xvc28-ATVDG+D$uc-&J!FTeDF1{=;AJKJMeuF8S8+NpI z;o+KskHa?x)CctCn=9=CapMbHG>c)_}{^k9;ghd_)fQL6gX1 z@R2x?nSv>s_@x>6V8nmoTUa*cIc+qjq03{6b5O6sF4(*4$iB$*$QnbS5BkeDFJ6wh z;XDb40)o#~Sn^&F%~J^bEB$hznS--@$tL#Er)Uc{G_CB31D|JFpTo#EcBUzGWaw)h zupVH?QMSnem14d2!0V6v3rxxF&W-cuZ&$#>zsHg1p0D_I_gkV8JsB+VOnF{-h{irN z@ze&(Z%bxVF@vw+8_{4LuDhc6)0si*}LFWhCTZ@34)3X9n75&qhejo;rG zFr9M6d8W+!oK^IdOuW}n^3G!@S?0Ot+qUGnWw}7$HNcOtJTF<~P;7z?O}r6@Pvm2K z+gmZ|u=5B+P=(BQY>Wf7rBrrF}wy&p9F+qEsXbLe7~Vk|sM* zSnO;cIrH3%C9~gPmM9Lo{jyH;Q9tGs8z7bsu`L_odmbEA|DET|W7|`|%nu>&5Dt3-i%rRxhk7Gt@2%X6?@Mr`~JF_v|ihuWkH>Sp3k!rlZ;I&bjW zyvr-zI3IbLUHd@&&%^KTx);Bolw8|86z~!4sp1ZMTk|ThA@dr!T|`#vwAMOtmdU2y zI?5h-mlY0K$McXEw$F>VP59vf-fxNW!5DqRlVg0D8pNsO6WcMex$?~8+Eb6VDY(l< zEZ29Eutm?*%V<5^4r^HpG!A}gqyS?PEGt~}6lT2NgGZN_y6C+#5>J%E#~yd^%LTTN zvT=;!!85wP_(?eURio`!wb*rhyWnVUU-nt2p5G`uD*ilwWja5{;YU%2A6ybFUK#XT zOtOKFe0f{#*kf+@V)E*aIE;KcKp|sq1z1Gj3cElf1H2x4Q2AZF`qtT7P~X)t zhPtc1_~rB`>NWlc@Xvd4?`E4wgEPJQ&n|rUW%S#Lm9@(m)+?!>f+OS|B}TaWyGitP_^x@)(xWyib;-O?Vd1$=T@wQkO05vE#2Et5FZS9KZt zSpcpMFxG3{af5EuV-uft2aZt``{<$OCG&05z`}w@4rS=Cc^FvOW4f_eRmAfx#z~S=cnk_#<$mo&tGP!%7F`K2s zkEx&49;rn>SCH#Bgi*{K1*n=0U6>SkxjfXhW6;HpB74Ly#g!n>2ip&_=tg%>vd|x;%|JC$(T`i(S9WdGw2XumqySB`w51rE~&zH#@wX&wet1;M?R!|{I0%hcl^6}s?_hI zm%G!PZ&JNVUz@VpepXdGTdtp=EF`dHrVB_WY{p|eL?vD0i%R&ftg$}V*mgE07*qo IM6N<$f{=(K)Bpeg literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..2d9fde365553e83e66d97ce5643c45b0095a0f2e GIT binary patch literal 3704 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 e-{>F1IGYcoFh_YZ$hK{sE{-7@ zqRBu0|F>5b@Mn0`@8HArgDb?Qm64@^hdrnyDe(0H7PC&HN9-q572eAnPGUB6QmE}o zFlUgoa`@9N5$loV@TxSxhEXKLG01^uGwV?X0rnN$%pLiHi=|ifF&`FK;dtcO6y`AI zgeHgRXF>&MV`fCnF}c8?s8H8=SYg5r0l%{+gdAEYTJUtbgt<@PHA%6a<#?Mj%PE|} y#6he>-jTP8=h5QTie3CyPH-L(b2!uL&&+W5sAP;mMd=%mPdr`yT-G@yGywpjz*{E( literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c65c78d418898bcc87121e482dcde3cea0456339 GIT binary patch literal 11032 zcmX|{c{mi__s2<0Wtn6TBQ5kP*>`4CDha7%U!&~%I*b`KvXrGLWE+yL!H~o-4B4_y z7-Sp!G8o&;7|Y<-_n+S%_nvd_J<<>EiX8t_c-E=xtf82R7e-YW}zXCot)8~^+>EUd9^ET{h$@~{0bl!b*Y zkClb(pJn~uT;8ewUxnte{lD+`zd-gKH53cWjo143?mUOGwr3O2ULL_|qmZCmHN4!C zdHioBPj@Fh94vcyo%7oDwwQ|p%BS`9MD=g(-+UIF5)*vyp|#i5;Cp9XThkOc;w{eH zmp2pXxn%W5-_&u#PkU30VByqX)1Pdub|12lIW4>ioeoLxsgQu7;JaA4+UZXEm>ll7 ze|o=ffA! zcd@@oJ{%1^5kJ!sut%#FuiX1Thje4Zy$4R_O ziT0v`=D7Zdai^(;&r%N0IOoW{T1yU zt|LOAp)m(6wCh0Y3lL3R%&@exPGO@0kWfp7rRTzHE{mC!}-*i+^KR=xWAL9pH;V!{?s;dmR^j+4M`_o zY7&naGTs87bgvmB_C;$6qYb;A(78HJPg13Wa=r;T+&{p6^^}|#z$3d<>v@c-IJrM>)~^n`g0WH zcLqs%&}^pFT0;wm%MxR4MN+?fkzSpC=pGtRo#xNp9t&^SEj#|OR9w&qYfc}h_E%IR z9HqhtGu3$JfiZK*XBv_JV|qD{>-kAvBDnpka>Zhw66xUl>IHY;`1gSxKXcR)H&0AD z`b+LiAkC7osW`QLGX+f>!*r(8^LWnaOGeuXwAkXZj*SN$pdY|cYGd$?|K za_tdhkdJxv@1P<4p;m2#ExZX(pj|cfF=J_LXuB@M8gOgXFZsq_XiVqw`~G2Op!zrA z;rbCZxuE55Q=mAjWBJ+xG{$Zn#*IIGV$$FgDmqaW6yk1~;b-r@T(v1e-)fMRgWB5h z;s|p&u)~Pj2+QLL|Bc=YMSja%GgtbAa{p*q#|JTr`h$OIoWA%C+p7xUos%=S+bo@4 zEOI%@TZ|a6yvUrB1M8Jt#qs^+aR6U&5z*-e>qtTuu#sZe|6m}SLH-VSd)m`IoOu=xz%jVdwjoRI-bNx6Evqi;W!TQ(@&xhd!3RpFoXWAm)~O$*V=M(Ww6 zhQ;Z<1ByLA<4`_NWXVRXmo*ry9Y_Bg`vec(o5Pc^-{r8#w628_@bRg%k(Td?dYq^@34RSHmt}UjZmoVOfHTy-_7%8m1F=G z#aj=2WQ&PTu%UaUba&Wt3Q=>IB}^);Evr$`ZYUksH`U5}rSw&w?Ph6^+}ir?88z7u z)WEDQ5IeQ2?gM)^K~4Q0jQL#L7u*Mf$0gatqipviAH<)O#>82IuBU?jL}|RF^7z}z zL664v_u{;70Wu{pos8R`?5mfQ9?$qAA^z*f?LsLhwg5Us_!Hp2@ ze5o1O`R$DtiFc$(HL7N+VyA0xWz49I+;1H#>mYg8hVBT%pQ zzg1!271W-d{&rJ4*B{~3kO9n^9JhC^55xAIBq~IO#yPl-3m^mWH(!-U}B5OnsD~D2ROiU-~+DY!qE=`Jc7?QbEpGDTlsEx>iW+- zn7ruG9QI5MhaEwpUll*$oE&E*e!636N|pH<&wFsGOr1I^tG#o|pHQz#t?h^O&p@Et z7D&56$(xzkce1}qc_)B47nKNZ7EnsAlU}8OtZP-$oK!Eju#mi^r$VmG;=5NUlGayKSxL$Bub-lQ5;x z*J{3yOYSx0%cWyb=!M#^Mw^Q-GLAX2@01} z@drs>y%b8)0i|E8#xa<}zl-(d2(8CuvD$AFu1kcITA1!0;s*`XmnvQAcR$J)nia5V zXE{IKUoQ`xdFEmFb7_!qaQcrDJY9&kB41=D+Gq*dvCiZHK$uJnP) zyu{a?^Ojz#0@_&;G6xkCN-i6@xe^#Sep$SC^OiAH<&4FKm}Y~$;X_+cbT+AB%;9v6 zSlDCJ3VYz}c^7!rRG~8GGwz&M}T} z%-{Fa&gB4mj;n1dKVqa*5K1EioLVIkn`oaVFy;#Qj~fng;@w~iTY1{qbQD~Tr<9a< z?D`$heg$1zzuJL$$W=Gp=P#1Ch|TZaDS{jf3|Ual2INNCxch;cymzsA@~IF3kl(1Z z^h!H(;CWNf$8EL(5NS8+iHFDI?Wei*D%y=2p@3yn>ej-~$gD+O-fO5ohC?=M8{7n` z+#=NycV8Y|Psq1(nGLAP|I#lZ*s_lzyu>6~=b-zdy{IIE0o1UT4Lns~0!FlNL#8P_Pli1Vdq7vM~evQ8}G1AnHmKGM;`|Ve?je0lc6Ix(3Y(KYQoM7+R$+I6`6q7P&G`$a*C&jy{{(*9D*o?L$8$xC(_m$2U7tR8(wz{_ zZPHIcWbj+o5zS#`-=%JFLE-%S5M+7nZpXfXD#W4;^0nCN+EPPj z+tf>c+PQHxjt=D#mFz3vMG4|)ma*2ysYccra+ibZugb(TajmSV*U{2y)do*=%}pAF z5tcMS`jvjWni*nT%YtK`Gj(SDT5;9BaC!Kn)mrcNR&->>=cOF;akYLQ;Jw}E0(!ub zX@S?!Sz`u!xN<2d9k?nQX`J4v@Eol+kdaa>Nd0U?+3KOUd4((g{o!Eu&{z1&mS;^e z;Esf1{nD+jUiKnm+Nbe%Dcjl~C=iKaYj3ABeR}d0ih3h>b;z z#!oBb+rDh^96K$kc5dCseNi&pJ)^fLtZUadKh3e*P3lsTJM;qOmL>A)`ILh<+wK9= zUBHrw=KEerj0XiKS)V+OoZppx%bkL(H#{bEYjkf2@i@G8(xSU*n{|Ls&<8hTd|G=2 zoKi^&R8cK$T1;5uO1 z^;gO?v%2kl$X5BWv8v$s z3!eCNVTCq3)jqyw>|yE|*_43uWnvAaF7*X>hiq}G8gYO}?QHs+TLdu{xmE3q26$9g zVYM}Si$B$*R&KvnNU}YzQzF@nz+>Xmz2}K<15eBbLYFWQ(a8D9+p7Td403J@FLSOc zs2J(($s<{3xLtDMJZ9(_Lq-MqQ7v|ozE&hk+Y5zmr1g?@vs;5?V&PC8VtY8)+cQ1J z9tZ9IKug*$49dc)A&wXs4at-1LdaQg%bUpo>53kJ0DLfua>sFrb=?YUxrDCc&#fb()TH2j@k5Z;F~ov(;b`FF5Pe29?cG!PV5f_!_{)nX#))^! zU6bUyK)oOnyY^CnG$u{F)7r{@=33dOBIEQ=xKZY|7u?ITpKyHZ zGd`TE{}f5!3-@}QJ3GR?-4O+I4I0Z56~E0s%X?vMm;>~q)H8tk*tktNMlroyXwt$F zcK5GeArZ#E*vTC`J~{3zRRx%SDiNjB`Bb_Qm$nzA^Hy&vpx=g146{qTVu484UVgSr zItq|G*BV>X&8WNW$MDq(onVrL)N`*TuDoeFSk-{A<1go5vY4&1dS4qR`SzC1f>0h| ze+3-{Ta)!iyBujovuV`AqLnvU+otr?#FHFWB?LBGFbpzzpPd|4vGaS)e-((q&iKEt z`i(5#`x;Aphq|9E@>e)G`+@S!T$?^^e$CO2g{M8Y!Na>6HOtK`JId@g%4Wmi+ooI_ z4IBqcmOXnb3M(L_q}9!X_Uh9MEECeg&W+DFLsv@MYA+w28oxEn#(2o#F1U@_^vZf;01t@T;C&)mC8*gv7^H zvQs_vhuH#lX!RP5{dq>?o7 z)fQiLoB)_+O|6>s_obFsHwDT(_FkGc8-E9#zIeAj^K-GDnkGFU(!&U+Ei&^tS^7ut z>huB8@d@a>yI0eGjWeM|cVQ56eq_+(nB1`|Gq?!pDIU4F)B9{;d!t$Gao~k_S?4FE zRY-WvVzyd2hCa%aP6%Qo zggc?*JgnUJ2XsBe?&_PaDLT2<`J)RkET;C{KAA5R{CDMrA=Gw2cdjaY#;CmUH-kwv z5`1ZD!ku)7~xJIez|ku%@bx* zM@huzd_HA!+qYsAE(6{Hepx{e6VIMcrjav^5i9BY*XCvu#uQw=@0YTxITt_i_@NiZ zPZV@p!h|_SL((7++b>|w^)cp1w!*U9M(-fUj}Hc3bLSrF{N}cJBVYf}DT?oLhZd+^8dy^)S1)PHK*Gqb)AycZ+1DE~;w)AOArHNCxQ-AjwXey*p%8beoR!T4+OX}pwtM?+$7S_k4YANvVg9pZ+?g9vqy4&fjl&gG8g~{t02koO?S_(m zv&B|U&nBs(QN%EI4Chbk)$@!iU^7B2sJ-fJ5lU9k; zY();`GP>tVhUp#5lzhPBd@fhdB$NWIbF7X(-FzMKf&U_R{Sewxqdx41*a7Xlu0ikj z6D65wu#afT*nxOw0~Xe?H+=0t+OC1LsLh^h-)rgdI(jgzA)4|#%uKZ^CeH|S1#7=e3<;hD3ca|3mqZ8Z0tv6w(NL@W|Y*@=bCPXR(+acxUcw z(}$P^8uu6`FoPMCoaAMR2If9ATwLQ&~-a2iq zUYY%#7>yqSku{EW{=X6j{sFQAQs=+iyhlG#9HXLFjsrVe@AACdnS?QPYissznk>L2 zRLw_c)wU9B|ke&;8lv&d}AHUudjXjqw<@oBAj2>H@Q4~s`z1O`=~d3vy@!; zV$B`)=k)wDwl;aC@#Gvq+mL8)t)t=Z$vlHQ;Ngegq|)~b zn>Lvfo3l()VzKqGRvkz8Oz>-dAz6bz$QO|cFsS4k&2$%)^;wrlXDM$CubPWHdMj@@ zHix4zcW1qNDK=Lr@;?qvD1TxpTb8+cRiHfTcIf{Ae&oY?hS(sRPoED^-~6bbs-m7t z$(VzbcaXzvJU1?dUQ;0Q3+~60+*jQHm`8OM9!Oj@Fh>pdeB)oD=8A@TpYbbC)jz}8psd4B zxl-HW0zq7e9<&>KB&s0)Hh)q1--JU zHYjdw4Le{k_oXKq#6|FHnDS=wFDjS5nts#+&kl574bDfBB3Z~#WL*a!|XdiQa09I<6L%O zl+HnhANfsD<87&=s0hPHg+|vu-qvL($BcSps;UKXe0Xv=DN~8Qb0^G%1lBKqrPpw< zevmZO08l4OmR|$*=RQp=*ceZ$`lSoO(p$oKNWw&r*{qQWYCurK4`oSl;C??LwDS3w z#tV)fX0}Y0nx)PP6Dx#hlkzdF%Q;*lv1#T{gf4(>{-G1WIc{Em@@MI5>@W0}@a^rJ zJ8bsPD65lR%2+W%O$|{qeKUJ$L@$^%hH)A-9=F+o?u!T>Dvb@mYGjhiHwH@09Q}E| z0=wc1er((7Dur_KDE@uKwlr)rpzT)9y*U`54Q$~0ols_Lfb#xI_{7I6#P#+Ey;MNZ zhjEILFiU#_8n{xTcVP04wWVsERj1}#>;+_pd)D-~=jRcke9N-IJj=8X4vlUj;=PKA zjF|>=4$rx^tq}jNVzcZv7-?=pq{{hC?DCs6^i@iI((%FRyv^?^^M-!KEl*MW{^g{{ zLCeW5S#R$L=I}~D33XGKtVieXFjsdcFdKZQlRoraw(7(AwUEuD{D}UXW%Bof)qMvf z^eNE>p2D*CaepoO#7alYr!$~0_e!P}e$KrWWpjCc_^4+;EA=~jO3fVX^N9%E>!@m| zQ$vxc81_f$N6;M5$G%5yN)K8P8;A`in<5bf~p257()ApT~v8GqevX7q0P~$~Z~64;sipci1}a%sK11 zirt;31cmY9CYyqpF@1XLw$b9J;>@Ps~EBYo4DVq+^CQRl-~g`HeE-<7$!{+yqL-8JYEP)|?Pz=q5=d2h(}`V}Tl~lFZc^bH_Bg6*oBOoKTDBIXav{25oAEhIFLr@l4(axb5AZ)$%$UUbRs0AIBQYPFhP$WC+kd z&7zJXl06=Fy5VAQ&c%gmKxK}XrZh&;v`WNkY^%-o5)*cMZjCuo{;HFm?Lsi9ERiy9 z(1=t~&*=Q*JR>72F$Okn)c0>CJFga*)mdCOshj7yu}Q?!OUDXg$HP^|t*eXcaO;$L z4!xOX7FKhtwiX4;=a_)C-!p#4-N*R)$O=*!;Re2 z--&PI94BT1-!Db?6q@l6C)*rLgLCR&yXv;K^t)d+KVMxT|DNek@<^Sv8tTcC84V{$ zj@tQ_9YzeaLRWdr4?AcgRjrkx1=oVb6A@7~nvr00MtUT48TK%CD&xRobNft`!7W_! z3Q>1GY!Ca{oZIY*l^+3k^gN=-$1^|!S^vu3;drg5s!Q~U&haEpvZV^7Oz`bmU$LE7 zv*g!v!ISuj{ zsjX`)OFBJpwPT$>?7o&hJIvY1!7-ZV#@1LJVtMwj>$jgSZwWhDQCsY_MV4#t7{g&} z$2SM}87;Gl{I2Ee?ERf??IKIpC9X+GZyK_$BWh%uqyu16jf!b- zOW-uYY_;*qT-d{%Ip+cbm6a>}d@uzXAztl-eNc6Y=FL95^cr1zn9FNv#>kM)za92? z`ZPd*@acxm9{N0JKNkh{De=-}n%^y>c0t4zKaHKG# zjaveKYJ?rXcs85;r+I>?y0U%K(ZGZb>0|i43D-RV8^9fYyHwJ17y0Y?Dx)#djhAc? zP2Ekn#OY`g25xq66tPZU@!DFjxz1>s-_FlHm9CXuugM_l%rT)TTK}*9{JYKAQGxVU zZ!S8WLaoI!cM{EBX*F?3w6pBq?HotOiNCQaZVJ^~v_n~mzB~qL`aO+Ba@m1P_G@;Y z%Vm$-m7+MbznM?DjyKmI4nwyDHGKwiKkRjL{@fbEeaiOl>L+YC@s+nm*x{!KdImvn6N${mif4 ztdiCOE(MUq6CH*Z!|WAP!a{3eM?-NpbEyoj#y6s?t2zL;brPas-g!EfIfDjj1J%cO(wuClM8h4JOsvQCsKRM}w9ZQwnO%gquylRYUKmw5dz} zKT=>*L&*k=-(uDwAD0R=8#6^QXXH!XRCwsqS?AYYQgE%G)-7L`Cht{VdFi#$&lixd z2U7x=l{qx{Foa*X*6Hz+j~prWtx)XI=7HIM=f*;SvON+5h!fNm)Yb5NQyd{-ll`%w z0{C65UUktbTU}C653G3j?B=9Z3C%-RyR^lOdt=XV9;qWidF$pBfmN7E;oaSig*{JR z)5nJwjAlh&)M&u{d-|97!5#teI(~-(2d>8$Tlind0UjvJ=`99W#hUx>Sr_21F7G@j z8*Jr%*96oATRG%5rh2+@kTWQ8nnh;GG}-UeSS=v|1ACigxaP?Q26tHE(Y=k!O%ZhM z?N^Mz@40wKP#01688JP2|1Mu_{6*a7(%8(92WmZ`-?bWPCZXnQc1shmGt(i`F0Dt!=kYBM}nWu;9;Yu2ydoohqqn?HKQqpODOmIpU_i zqCK+oRkLc~U%0DN2;ehL^xg!A5A~^pC8JOEOB0!W5ZQ@f)O-bOE^#NZXF{?9`Z=rM z)*9A7yei>WSCllOjBaFy#q(jtx0)-|Au?GP?L#p>C#A;^X}a_Q=EN+1F-1ozhxxcG z>r+777wtAMvxC8h^cWAs^l7yVfz;Zz7s&I)=b*JHEb-51VJ=e=F}**ren*Z3Q`NR@ zATC`F?vk$U08zvIb?T1V!~9ROXd#qNJ>@dR{;2UliHaU2iBRvq zbIujr$r?#;?~xZeDl{3`)vAaT80En4k;KTzMy_hr2BIX%W3SgL8C)=#U0Bkf>Zj(E znvAB)n)9B2wppVg`eLM_tIz?*u!hS>Y)&!|{#BardxYlU3=*u+j5~IyJ;x`p&LsnP ztbH+I)+1g*-&WMPzmR*OkB@YEo7Vs8W3f^+BzmkhBY2XGvrsV=cb!Yd&xTY|Mz)tERYyC`50O7$zl;9~U`4AG z-5QN~WYYzdvhvnt4<9V>;9IK;#fmm%j=Cv*S=P-$>t0{8<;dSela*`>X4%Q-1B+uS zoqHGt?;9RGnoZUxn63SvRGbHqv~-x;o5cwWrW?=PJp9DXgj80WDqX?JuZ zE7`!&oMv37n)qr|11XnM{tx`u2kt1&FlD;*f-ySi_^N3-GkR5Tn!apv)yGNq;b<`8jBrE{4aL?kqrmZ=u$!Os_|AY5&E-l!p~BBrGdw8mdhcl z7au4MJ_XX^E!JwRPs|6&Kv1(d>#w@M&pJ?64V4XYQxP51@bRvX^8M8s~={6)c5Ku@Z^Jx|UBOY$T2Q-}eyWc{D>HgSk zy`ztItx%I1p8vvlT_hnq=ptr++S(=Di(wd%V^8VD1JSeFZQLrXHCo5ROwtZzw|bw_ zN$2!;8Q3%m)@}h$=C-oE>(l!*NfNm-soCth@YN#Sqnuhk&rB^q7f!d8BYUb>&lKF8 zu|jqauGOR5KlO_7yL)Z2m3Tbt+Su+8C!m47j-haQ*uJqr<@d2$}RjW-dpaDh>ut_Kiup&IC)m?5y0N?T>5`isrvUH L->bOm@cRD%Ha_{Q literal 0 HcmV?d00001 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