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 index ad824820f9..76c5af3e91 100644 --- 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 @@ -6,15 +6,18 @@ import android.graphics.PixelFormat import android.os.SystemClock import android.util.DisplayMetrics import android.view.* -import android.widget.RadioButton import android.widget.TextView +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo -import com.mogo.eagle.core.data.map.MogoLocation +import com.mogo.eagle.core.data.deva.badcase.AiDataEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener +import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotRecordListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.toast.TipToast @@ -23,11 +26,15 @@ import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.mogo.eagle.core.utilcode.util.ToastUtils import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.badcase.biz.adapter.AiDataListAdapter import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig +import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseNetManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch import record_cache.RecordPanelOuterClass +import java.lang.StringBuilder import java.util.* /** @@ -36,7 +43,7 @@ import java.util.* * @since: 2022/7/12 */ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener, - IMoGoAutopilotRecordListener { + IMoGoAutopilotRecordListener , BadCaseNetListener { companion object { const val TAG = "AIDataCollectWindow" @@ -49,18 +56,12 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener 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 var collectReason: StringBuilder = StringBuilder() + + private var aiDataListAdapter: AiDataListAdapter?= null @Volatile private var recordKey: String? = null //录制bag包key @@ -77,6 +78,7 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener private var mInScreenY = 0f private var clickListener: ClickListener? = null + private var rvCollectList: RecyclerView ?= null init { initFloatWindow(); @@ -93,15 +95,7 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener 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) - + rvCollectList = mFloatLayout.findViewById(R.id.rvCollectList) tvCollectReport = mFloatLayout.findViewById(R.id.tvCollectReport) tvCollectCancel = mFloatLayout.findViewById(R.id.tvCollectCancel) if (BadCaseConfig.windowNum < 1) { @@ -120,107 +114,39 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener 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 = "夜间交通流" - } + val linearLayoutManager = LinearLayoutManager(mActivity) + linearLayoutManager.orientation = LinearLayoutManager.VERTICAL + rvCollectList?.layoutManager = linearLayoutManager + aiDataListAdapter = AiDataListAdapter() + aiDataListAdapter?.setListener(object: AiDataListAdapter.AiDataClickListener{ + override fun onClick(reason: String, isChecked: Boolean) { + if(isChecked){ + collectReason.append(reason) + }else{ + val index = collectReason.indexOf(reason) + collectReason.delete(index,index+reason.length) + } + } + }) + rvCollectList?.adapter = aiDataListAdapter + //注册网络接口获取数据监听 + CallerDevaToolsNetManager.addListener(TAG,this) + //获取数据 + BadCaseNetManager.badCaseNetManager.getAiData() //上报 tvCollectReport.setOnClickListener { + if(collectReason.isBlank()){ + ToastUtils.showShort("请选择最少一个原因") + return@setOnClickListener + } GlobalScope.launch { val uploadResult = presenter.upload(mutableMapOf().also { itx -> itx["carLicense"] = AppConfigInfo.plateNumber ?: "" //车牌号 itx["filename"] = recordFileName ?: "" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey ?: "" //key - itx["reason"] = collectReason //采集原因 + itx["reason"] = collectReason.toString() //采集原因 itx["duration"] = "20" //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "AI" //渠道 @@ -279,24 +205,6 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener } - 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 -> { @@ -336,6 +244,8 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener fun hideFloatWindow() { //注销采集结果回调监听 CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) + //注销网络接口监听 + CallerDevaToolsNetManager.removeListener(this) // 移除 ADAS车辆状态&定位 监听 CallerChassisLocationWGS84ListenerManager.removeListener(this.hashCode().toString()) if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) @@ -349,4 +259,11 @@ class AIDataCollectWindow constructor(activity: Activity) : View.OnTouchListener fun closeWindow() } + override fun onAiDataResponse(list: List) { + if(list.isNotEmpty()){ + //刷新列表 + aiDataListAdapter?.setData(list) + } + } + } \ 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/adapter/AiDataListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/AiDataListAdapter.kt new file mode 100644 index 0000000000..58eecf09c6 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/AiDataListAdapter.kt @@ -0,0 +1,62 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz.adapter + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.RadioButton +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.deva.badcase.AiDataEntity +import com.zhjt.mogo_core_function_devatools.R + +/** + * AI数据采集适配器 + */ +class AiDataListAdapter: RecyclerView.Adapter() { + + private var data:List ?= null + private var clickListener: AiDataClickListener ?= null + + fun setData(data: List){ + this.data = data + notifyDataSetChanged() + } + + fun setListener(listener: AiDataClickListener){ + clickListener = listener + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): AiDataHolder { + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_ai_data, parent, false) + return AiDataHolder(view) + } + + override fun onBindViewHolder(holder: AiDataHolder, position: Int) { + data?.let { + val entity = it[position] + if(entity.content.isBlank()){ + holder.rbDataSelect.text = entity.name + }else{ + holder.rbDataSelect.text = "${entity.name}:${entity.content}" + } + holder.rbDataSelect.isChecked = entity.isChecked + holder.rbDataSelect.tag = entity + holder.rbDataSelect.setOnCheckedChangeListener { _, isChecked -> + clickListener?.onClick(holder.rbDataSelect.text.toString(),isChecked) + entity.isChecked = isChecked + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + class AiDataHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var rbDataSelect: CheckBox = itemView.findViewById(R.id.rbDataSelect) + } + + interface AiDataClickListener{ + fun onClick(reason: String,isChecked: Boolean) + } + +} \ 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/BadCaseNetModel.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt index 874e2d23b7..c19d296883 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/BadCaseNetModel.kt @@ -1,9 +1,13 @@ package com.zhjt.mogo_core_function_devatools.badcase.repository.net import com.mogo.commons.constants.HostConst +import com.mogo.eagle.core.data.BaseResponse import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_DEVA import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.network.apiCall +import com.mogo.eagle.core.network.request +import com.mogo.eagle.core.utilcode.util.GsonUtils import com.zhjt.mogo_core_function_devatools.badcase.BadCaseManager import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.BadCaseApi import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.UploadResult @@ -55,4 +59,31 @@ internal class BadCaseNetModel { CallerLogger.d("$M_DEVA${BadCaseManager.TAG}", "upload_error:$t") null } + + private fun getNetWorkApi(baseUrl: String ="http://eagle-qa.zhidaozhixing.com"): BadCaseApi{ + return MoGoRetrofitFactory.getInstanceNoCallAdapter(baseUrl) + .create(BadCaseApi::class.java) + } + + fun getAiData(onSuccess: ((String) -> Unit),onError: ((String) -> Unit)){ + request>{ + loader{ + apiCall{ + getNetWorkApi().getAiData() + } + } + onSuccess{ + if(it.msg == "success"){ + onSuccess.invoke(GsonUtils.toJson(it.result)) + }else{ + onError.invoke(it.msg) + } + } + onError{ + it.message?.let { it1 -> onError.invoke(it1) } + } + } + } + + } \ 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 d87b6b61f5..b0fa9d3805 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 @@ -1,5 +1,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.repository.net.api +import com.mogo.eagle.core.data.BaseResponse +import com.mogo.eagle.core.data.deva.badcase.AiDataEntity import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.BadCaseResponse import com.zhjt.mogo_core_function_devatools.badcase.repository.net.api.entity.UploadResult import retrofit2.Response @@ -13,4 +15,10 @@ internal interface BadCaseApi { @GET("eagle-eye-dns/yycp-vehicle-management-service/tool/badcase/reasons") suspend fun get(@Query("channel", encoded = true) channel: String, @Query("pageNo") pageNo: Int): Response + + /** + * 获取AI数据采集列表数据 + */ + @GET("eagleEye-mis/dataGather/select/active") + suspend fun getAiData(): BaseResponse> } \ 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/BadCaseNetManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseNetManager.kt new file mode 100644 index 0000000000..0a008f9ffb --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/repository/net/api/BadCaseNetManager.kt @@ -0,0 +1,44 @@ +package com.zhjt.mogo_core_function_devatools.badcase.repository.net.api + +import com.mogo.eagle.core.data.deva.badcase.AiDataEntity +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsNetManager +import com.zhjt.mogo_core_function_devatools.badcase.repository.net.BadCaseNetModel +import org.json.JSONArray +import org.json.JSONObject + +class BadCaseNetManager { + + companion object{ + val badCaseNetManager: BadCaseNetManager by lazy(mode = LazyThreadSafetyMode.SYNCHRONIZED){ + BadCaseNetManager() + } + } + + private val badCaseNetModel = BadCaseNetModel() + + fun getAiData(){ + badCaseNetModel.getAiData( + onSuccess = + { + val list = ArrayList() + val result = JSONArray(it) + if(result.length()>0){ + for(i in 0 until result.length()){ + val jsonObject = result[i] as JSONObject + val id = jsonObject.optInt("id") + val name = jsonObject.optString("name") + val content = jsonObject.optString("content") + val entity = AiDataEntity(id, name, content,false) + list.add(entity) + } + } + //将结果回调到调用页面 + CallerDevaToolsNetManager.invokeAiDataResponse(list) + }, + onError = + { + + }) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_ai_data.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_ai_data.xml new file mode 100644 index 0000000000..dbd3103282 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_ai_data.xml @@ -0,0 +1,14 @@ + + + + \ 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 index f06a6d117d..9ce6809750 100644 --- 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 @@ -23,7 +23,6 @@ android:textColor="#FFFFFFFF" android:textSize="46dp" android:gravity="center" - android:text="1" /> - - - - - - - - - - - - - - - ){} +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsNetManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsNetManager.kt new file mode 100644 index 0000000000..6176bd97eb --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/devatools/CallerDevaToolsNetManager.kt @@ -0,0 +1,19 @@ +package com.mogo.eagle.core.function.call.devatools + +import com.mogo.eagle.core.data.deva.badcase.AiDataEntity +import com.mogo.eagle.core.function.api.devatools.badcase.BadCaseNetListener +import com.mogo.eagle.core.function.call.base.CallerBase + +object CallerDevaToolsNetManager: CallerBase() { + + /** + * AI数据采集数据回调 + */ + fun invokeAiDataResponse(list: List){ + M_LISTENERS.forEach{ + val listener = it.value + listener.onAiDataResponse(list) + } + } + +} \ No newline at end of file