diff --git a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java index f7cea76f00..e8f76bb184 100644 --- a/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java +++ b/OCH/mogo-och-bus/src/main/java/com/mogo/och/bus/fragment/BaseBusTabFragment.java @@ -56,6 +56,7 @@ import org.greenrobot.eventbus.EventBus; import java.util.Objects; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -320,6 +321,10 @@ public abstract class BaseBusTabFragment public void onAutopilotRecordConfig(@NonNull MessagePad.RecordDataConfig config) { } + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } + /** * 测试到站 */ diff --git a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java index 473ab89f04..1abc7afcad 100644 --- a/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java +++ b/OCH/mogo-och-sweeper/src/main/java/com/mogo/och/sweeper/fragment/BaseSweeperTabFragment.java @@ -50,6 +50,7 @@ import com.mogo.och.sweeper.util.BDRouteDataTestUtils; import com.mogo.och.sweeper.view.SlidePanelView; import com.mogo.och.sweeper.view.SweeperTrafficDataView; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -298,6 +299,9 @@ public abstract class BaseSweeperTabFragment0){ + selectedBagSize = 0 + selectedBagNum = 0 + bagManagerList.clear() + for(selectBagInfo in bagManagerEntity.bagsInfoResp){ + if(selectBagInfo.itemType == 0){ + selectBagInfo.selectStatus = true + selectedBagSize += selectBagInfo.totalSize + bagManagerList.add(selectBagInfo) + selectedBagNum++ + } + } + //显示选择包的个数和大小 + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + //取消选中 + tvCancelSelect.setOnClickListener { + if(bagManagerEntity.bagsInfoResp.size>0){ + for(cancelBagInfo in bagManagerEntity.bagsInfoResp){ + cancelBagInfo.selectStatus = false + bagManagerList.remove(cancelBagInfo) + } + selectedBagNum = 0 + selectedBagSize = 0 + tvSelectedBagSize.visibility = View.GONE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + + + //上传Cos桶 + tvUploadCloud.setOnClickListener { + if(bagManagerList.size>0){ + bagManagerEntity.reqType = 3 + bagManagerEntity.keyReq = bagManagerList[0].key + Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq) + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + + bagUploadDialog = BagUploadDialog(context) + bagUploadDialog?.setListener { //删除选择,取消上传 + bagManagerList.clear() + if (bagManagerEntity.bagsInfoResp.size > 0) { + for (cancelBagInfo in bagManagerEntity.bagsInfoResp) { + if(cancelBagInfo.itemType == 0){ + cancelBagInfo.selectStatus = false + bagManagerList.remove(cancelBagInfo) + } + } + selectedBagNum = 0 + selectedBagSize = 0 + tvSelectedBagSize.visibility = View.GONE + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + bagUploadDialog?.show() + bagUploadDialog?.setAllUpload(selectedBagNum,selectedBagSize) + }else{ + ToastUtils.showShort("请先选择要上传的Bag包") + } + + } + //删除Bag包 + tvDeleteSelect.setOnClickListener { + if(bagManagerList.size>0){ + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + }else{ + ToastUtils.showShort("请先选择要删除的Bag包") + } + + } + + bagManagerListAdapter = BagManagerListAdapter() + bagManagerListAdapter?.setListener(object :BagManagerListAdapter.BagClickListener{ + override fun onClick(bagInfoEntity: BagInfoEntity, isChecked: Boolean) { + if(isChecked){ + bagInfoEntity.selectStatus = true + bagManagerList.add(bagInfoEntity) + selectedBagNum++ + selectedBagSize += bagInfoEntity.totalSize + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + }else{ + bagInfoEntity.selectStatus = false + bagManagerList.remove(bagInfoEntity) + selectedBagNum-- + selectedBagSize -= bagInfoEntity.totalSize + if(selectedBagNum == 0){ + tvSelectedBagSize.visibility = View.GONE + }else{ + tvSelectedBagSize.text = "已选${selectedBagNum}个包,共${selectedBagSize/(1000*1024*1024)}G" + tvSelectedBagSize.visibility = View.VISIBLE + } + } + + } + + override fun uploadBI(bagInfoEntity: BagInfoEntity) { + //展示上报弹窗 + val initiativeBadCaseWindow = InitiativeBadCaseWindow(context as Activity) + initiativeBadCaseWindow.setClickListener(object: InitiativeBadCaseWindow.ClickListener{ + override fun closeWindow() { + initiativeBadCaseWindow.hideFloatWindow() + } + }) + initiativeBadCaseWindow.showReportBIWindow(bagInfoEntity) + } + + override fun editDescription(key: Long, description: BagDescriptionEntity) { + //编辑Bag包描述信息 + isNameModify = true + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = key + bagManagerEntity.descReq = description + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } + + override fun bagAudio(key: Long, audioUrl: String) { + DownloadManager.getInstance().init(context) + val downUrl = audioUrl.replace("http://petchfile-1255510688.cos.ap-beijing.myqcloud.com/","") + DownloadManager.getInstance().download(downUrl, + audioSavePath,"${key}.wav") + //延迟播放 + Handler().postDelayed({ + //音频文件播放 + Audition.getInstance().playOrStop("${audioSavePath}${key}.wav") + }, 1500) + } + + }) + val linearLayoutManager = LinearLayoutManager(context) + rvBagList.layoutManager = linearLayoutManager + rvBagList.adapter = bagManagerListAdapter + + //音频文件播放 +// Audition.getInstance().playOrStop("/mnt/sdcard/mogo/test.wav") +// +// 音频下载 +// DownloadManager.getInstance().init(context) +// DownloadManager.getInstance().download("CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav", +// "/mnt/sdcard/mogo/","test13.wav") + + } + + fun setOnClickListener(clickListener: ClickListener) { + this.clickListener = clickListener + } + + interface ClickListener { + fun onClose() + } + + override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) { + super.onBagManagerResult(bagManager) + UiThreadHandler.post { + Log.i(TAG,"onBagManagerResult Start") + Log.i(TAG,"keyReq="+bagManager.keyReq) + Log.i(TAG,"reqType="+bagManager.reqType) + Log.i(TAG,"uploadCosResp stat="+bagManager.uploadCosResp.stat) + Log.i(TAG,"descReq description="+bagManager.descReq.description + +" audioUrl="+bagManager.descReq.audioUrl + +" reportBI="+bagManager.descReq.reportBI + +" hasAudio="+bagManager.descReq.hasAudio) + for(logBag in bagManager.bagsInfoRespList){ + Log.i(TAG,"bagPath="+logBag.bagPath) + Log.i(TAG,"timestamp="+logBag.timestamp) + Log.i(TAG,"description="+logBag.description) + Log.i(TAG,"key="+logBag.key) + Log.i(TAG,"mergeStat="+logBag.mergeStat) + Log.i(TAG,"totalSize="+logBag.totalSize) + Log.i(TAG,"uploadStat="+logBag.uploadStat) + } + Log.i(TAG,"onBagManagerResult End") + + //获取空间使用信息 + if(bagManager.reqType == 1){ + //遍历各个主机的硬盘空间信息 + if(bagManager.spaceInfoRespCount>0){ + spaceTotal = 0 + spaceUsed = 0 + spaceFree = 0 + for(spaceInfo in bagManager.spaceInfoRespList){ + spaceInfo.diskSpaceInfo?.let { + spaceTotal += it.total + spaceUsed += it.used + spaceFree += it.free + } + } + //展示空间使用情况 + //已使用空间 + tvUsedSpaceContent.text = "${(spaceUsed/(1000*1024*1024L))}G" + //可使用空间 + tvFreeSpaceContent.text = "${(spaceFree/(1000*1024*1024L))}G" + //进度条展示空间 + pbSpacePercent.progress = (spaceUsed*100/spaceTotal).toInt() + } + } + //遍历所有bag + else if(bagManager.reqType == 2){ + clBagHaveDataLayout.visibility = View.VISIBLE + clBagNoDataLayout.visibility = View.GONE + if(bagManager.bagsInfoRespCount>0){ + bagManagerEntity.bagsInfoResp.clear() + val originBagInfoList = ArrayList() + for(bagInfo in bagManager.bagsInfoRespList){ + bagInfo?.let { + val descriptionEntity = BagDescriptionEntity(it.description.description,it.description.hasAudio,it.description.audioUrl,it.description.reportBI) + val bagInfoEntity = BagInfoEntity() + bagInfoEntity.key = it.key + bagInfoEntity.totalSize = it.totalSize + bagInfoEntity.timestamp = it.timestamp + bagInfoEntity.bagPath = it.bagPath + bagInfoEntity.mergeStat = it.mergeStat + bagInfoEntity.uploadStat = it.uploadStat + bagInfoEntity.itemType = 0 + bagInfoEntity.description = descriptionEntity + for(subBag in it.subBagsList){ + val subBagEntity = SubBagEntity(subBag.key,subBag.host,subBag.size) + bagInfoEntity.subBags.add(subBagEntity) + } + originBagInfoList.add(bagInfoEntity) + //对数组按照时间顺序进行倒序排序 + originBagInfoList.sortWith(Comparator { o1, o2 -> + o2.timestamp.compareTo(o1.timestamp) + }) + } + } + + for(originBagInfo in originBagInfoList){ + originBagInfo.let { + it.timestamp.let { time -> + val month = time.substring(4,6) + val day = time.substring(6,8) + val timeStr = "${month}月${day}日" + var containTime = false + for(bag in bagManagerEntity.bagsInfoResp){ + if(bag.timeStr == timeStr){ + containTime = true + } + } + if(!containTime || bagManagerEntity.bagsInfoResp.size ==0){ + //增加时间的 + val bagInfoTimeEntity = BagInfoEntity() + bagInfoTimeEntity.itemType = 1 + bagInfoTimeEntity.timeStr = timeStr + bagInfoTimeEntity.timestamp = time.substring(0,8) + bagManagerEntity.bagsInfoResp.add(bagInfoTimeEntity) + } + var containKey = false + for(bagInfoContain in bagManagerEntity.bagsInfoResp){ + if(bagInfoContain.key == it.key){ + containKey = true + } + } + if(!containKey){ + bagManagerEntity.bagsInfoResp.add(it) + } + } + } + } + + //更新List + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + + // 开启定时查询速度 + Timer().schedule(timerTaskRefresh, Date(), 60*1000) + } + //上传Cos + else if(bagManager.reqType == 3){ + //此处应循环上传Cos + val uploadIterator = bagManagerEntity.bagsInfoResp.iterator() + while(uploadIterator.hasNext()){ + val uploadBagInfo = uploadIterator.next() + if(uploadBagInfo.key == bagManager.uploadCosResp.key && bagManager.uploadCosResp.stat!=1){ + bagManagerList.remove(uploadBagInfo) + if(bagManagerList.size>0){ + var remainSize = 0L + for(bagInfo in bagManagerList){ + remainSize += bagInfo.totalSize + } + bagUploadDialog?.updateRemainUpload(bagManagerList.size,remainSize) + //执行下一个上传Bag命令 + bagManagerEntity.reqType = 3 + bagManagerEntity.keyReq = bagManagerList[0].key + Log.i("sendBagManagerCmd","bagManagerEntity.keyReq="+bagManagerEntity.keyReq) + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + //上传Cos执行完成 + if(bagManagerList.size == 0 && selectedBagNum != 0){ + ToastUtils.showShort("上传命令完成") + bagUploadDialog?.uploadCompleted() + tvCancelSelect.performClick() + } + + when (bagManager.uploadCosResp.stat) { + 0 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶成功") + } + 2 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶copy过程失败,原因:${bagManager.uploadCosResp.message}") + } + 3 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶合并过程失败,原因:${bagManager.uploadCosResp.message}") + } + 4 -> { + ToastUtils.showShort("${bagManager.uploadCosResp.key} 上传cos桶上传过程失败,原因:${bagManager.uploadCosResp.message}") + } + } + + } + //删除Bag + else if(bagManager.reqType == 4){ + //收到此回调就删除对应key的Bag + val iterator = bagManagerEntity.bagsInfoResp.iterator() + while(iterator.hasNext()){ + val deleteBagInfo = iterator.next() + if(deleteBagInfo.key == bagManager.keyReq){ + iterator.remove() + bagManagerList.remove(deleteBagInfo) + //更新列表 +// bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + if(bagManagerList.size>0){ + //继续执行删除命令 + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + //遍历列表,如当天Bag全部删除,同时把日期标题也删除更新列表 + val titleIterator = bagManagerEntity.bagsInfoResp.iterator() + while(titleIterator.hasNext()){ + val titleBagInfo = titleIterator.next() + if(titleBagInfo.itemType == 1){ + val bagIterator = bagManagerEntity.bagsInfoResp.iterator() + var hasBag = false + while(bagIterator.hasNext()){ + val bagBagInfo = bagIterator.next() + if(bagBagInfo.itemType == 0){ + bagBagInfo.timestamp?.let { + if(it.contains(titleBagInfo.timestamp.toString())){ + hasBag = true + } + } + } + } + if(!hasBag){ + bagIterator.remove() + } + } + } + if(bagManagerList.size == 0){ + tvCancelSelect.performClick() + } + //更新列表 + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + //修改bag附加信息 + else if(bagManager.reqType == 5){ + //更新Bag包上报状态 + for(bagInfo in bagManagerEntity.bagsInfoResp){ + if(bagInfo.key == bagManager.keyReq){ + bagInfo.description?.let { + it.reportBI = bagManager.descReq.reportBI + it.description = bagManager.descReq.description + it.hasAudio = bagManager.descReq.hasAudio + it.audioUrl = bagManager.descReq.audioUrl + } + } + } + if(!isNameModify){ + //更新List + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + isNameModify = false + } + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerAutopilotRecordListenerManager.addListener(TAG, this) + bagManagerEntity.reqType = 2 + //遍历所有bag + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerAutopilotRecordListenerManager.removeListener(TAG) + try { + timerTaskRefresh.cancel() + } catch (e: Exception) { + e.printStackTrace() + } + } + + private val timerTaskRefresh = object : TimerTask() { + override fun run() { + UiThreadHandler.post { + //获取空间使用信息,每隔1分钟获取一次 + bagManagerEntity.reqType = 1 + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + +} \ 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/BagUploadDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BagUploadDialog.java new file mode 100644 index 0000000000..00dd1145b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/BagUploadDialog.java @@ -0,0 +1,121 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.ProgressBar; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.zhjt.mogo_core_function_devatools.R; + +import java.text.DecimalFormat; + +/** + * @author XuXinChao + * @description Bag包上传进度展示弹窗 + * @since: 2022/2/1 + */ +public class BagUploadDialog extends Dialog { + + private TextView tvCancelUpload;//取消上传 + private TextView tvCancel;//取消 + private TextView tvUploadDetail;//上传详情 + private ProgressBar viewUploadProgress;//上传进度条 + + private int totalNum = 0; + private Long totalSize = 0L; + private int remainNum = 0; + private Long remainSize = 0L; + + private BagUploadListener uploadListener; + private DecimalFormat format = new DecimalFormat("0.0"); + + public BagUploadDialog(@NonNull Context context) { + super(context, R.style.bad_case_dialog); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_bag_upload); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 688; + params.width = 1110; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + tvCancelUpload = findViewById(R.id.tvCancelUpload); + tvCancel = findViewById(R.id.tvCancel); + tvUploadDetail = findViewById(R.id.tvUploadDetail); + viewUploadProgress = findViewById(R.id.viewUploadProgress); + } + + private void initEvent(){ + //取消上传 + tvCancelUpload.setOnClickListener(v -> { + if(uploadListener!=null){ + uploadListener.cancelUpload(); + } + dismiss(); + }); + //取消 + tvCancel.setOnClickListener(v -> { + dismiss(); + }); + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + public void setListener(BagUploadListener listener){ + uploadListener = listener; + } + + @SuppressLint("SetTextI18n") + public void setAllUpload(int totalNum, Long totalSize){ + this.totalNum = totalNum; + this.totalSize = totalSize; + //更新进度条和进度文字 + String totalStr = format.format((totalSize/(1000*1024*1024.0))); + tvUploadDetail.setText("共计"+totalNum+"个包 ("+totalStr+"G) 已上传"+(0)+"个包 (" + +0+"G) 剩余"+totalNum+"个包 ("+ totalStr+"G)"); + } + + @SuppressLint("SetTextI18n") + public void updateRemainUpload(int remainNum, Long remainSize){ + this.remainNum = remainNum; + this.remainSize = remainSize; + //更新进度条和进度文字 + String updateTotalStr = format.format((totalSize/(1000*1024*1024.0))); + String updateUploadStr = format.format(((totalSize-remainSize)/(1000*1024*1024.0))); + String updateRemainStr = format.format((remainSize/(1000*1024*1024.0))); + tvUploadDetail.setText("共计"+totalNum+"个包 ("+updateTotalStr+"G) 已上传"+(totalNum-remainNum)+"个包 (" + +updateUploadStr+"G) 剩余"+remainNum+"个包 ("+ updateRemainStr +"G)"); + viewUploadProgress.setProgress((totalNum-remainNum)*100/totalNum); + } + + public void uploadCompleted(){ + dismiss(); + } + + interface BagUploadListener{ + //取消上传 + void cancelUpload(); + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java index 959f43ee8f..a3c03232d5 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseListDialog.java @@ -20,6 +20,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig; import java.util.ArrayList; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -116,4 +117,8 @@ public class CaseListDialog extends Dialog implements IMoGoAutopilotRecordListen caseListAdapter.notifyDataSetChanged(); }); } + + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java index a0cd77525a..972abec769 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/CaseTopicListDialog.java @@ -28,6 +28,7 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig; import java.util.ArrayList; import java.util.List; +import bag_manager.BagManagerOuterClass; import mogo.telematics.pad.MessagePad; import record_cache.RecordPanelOuterClass; @@ -203,4 +204,8 @@ public class CaseTopicListDialog extends Dialog implements IMoGoAutopilotRecordL @Override public void onAutopilotRecordResult(@NonNull RecordPanelOuterClass.RecordPanel recordPanel) { } + + @Override + public void onBagManagerResult(@NonNull BagManagerOuterClass.BagManager bagManager) { + } } 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 index 1bcca50ca6..f2c675caec 100644 --- 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 @@ -13,6 +13,9 @@ import android.widget.ImageView import android.widget.TextView import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.badcase.RecordCaseEntity import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener @@ -36,8 +39,10 @@ import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import mogo.telematics.pad.MessagePad import record_cache.RecordPanelOuterClass import java.io.File +import java.lang.StringBuilder import java.util.* @@ -77,17 +82,17 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private lateinit var tvInitiativeCancel: TextView private var audioStatus = false - private var audioFileName: String? = null //录音文件名称 + private var audioFileName:String?=null //录音文件名称 private var uploadReason: StringBuilder = StringBuilder() //上报原因,标签 - @Volatile - private var recordKey: String? = null //录制bag包key - + private var recordKey: String?=null //录制bag包key @Volatile - private var recordFileName: String? = null //录制文件包名 - private var longitude: Double? = null - private var latitude: Double? = null + private var recordFileName: String?=null //录制文件包名 + private var longitude: Double?=null + private var latitude: Double?=null + + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() private var mInViewX = 0f private var mInViewY = 0f @@ -107,9 +112,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } @SuppressLint("SetTextI18n") - private fun initFloatWindow() { - mFloatLayout = - LayoutInflater.from(mActivity).inflate(R.layout.view_initiative_bad_case, null) as View + private fun initFloatWindow(){ + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_initiative_bad_case, null) as View mFloatLayout.setOnTouchListener(this) tvInitiativeNum = mFloatLayout.findViewById(R.id.tvInitiativeNum) @@ -128,17 +132,16 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList tvInitiativeReport = mFloatLayout.findViewById(R.id.tvInitiativeReport) tvInitiativeCancel = mFloatLayout.findViewById(R.id.tvInitiativeCancel) - if (BadCaseConfig.windowNum < 1) { + if(BadCaseConfig.windowNum<1){ BadCaseConfig.windowNum = 1 } tvInitiativeNum.text = BadCaseConfig.windowNum.toString() BadCaseConfig.windowNum++ - tvInitiativeTime.text = - "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" + tvInitiativeTime.text = "时间:${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())}" tvInitiativeIdentity.text = "身份:${BadCaseConfig.identity}" //采集结果回调监听 - CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(), this) + CallerAutopilotRecordListenerManager.addListener(this.hashCode().toString(),this) // 添加 ADAS车辆状态&定位 监听 CallerChassisLocationWGS84ListenerManager.addListener(this.hashCode().toString(), this) viewAudioButton.setOnClickListener { @@ -147,37 +150,37 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } tvInitiativeReport.setOnClickListener { - if (!rbOne.isChecked && !rbTwo.isChecked && !rbThree.isChecked && - !rbFour.isChecked && !rbFive.isChecked && !rbSix.isChecked - ) { + if(!rbOne.isChecked && !rbTwo.isChecked && !rbThree.isChecked && + !rbFour.isChecked && !rbFive.isChecked && !rbSix.isChecked){ TipToast.shortTip("请选择至少一个Case") return@setOnClickListener } - if (rbOne.isChecked) { + uploadReason.clear() + if(rbOne.isChecked){ uploadReason.append("严重画龙 ") } - if (rbTwo.isChecked) { + if(rbTwo.isChecked){ uploadReason.append("速度过慢 ") } - if (rbThree.isChecked) { + if(rbThree.isChecked){ uploadReason.append("感知、定位、地图等其他 ") } - if (rbFour.isChecked) { + if(rbFour.isChecked){ uploadReason.append("速度过快 ") } - if (rbFive.isChecked) { + if(rbFive.isChecked){ uploadReason.append("存在碰撞风险 ") } - if (rbSix.isChecked) { + if(rbSix.isChecked){ uploadReason.append("点刹、顿挫") } - if (audioStatus) { + if(audioStatus){ audioStatus = !audioStatus setAudio(audioStatus) Handler().postDelayed({ - uploadAudio() - }, 1000) - } else { + uploadAudio() + },1000) + }else{ uploadAudio() } } @@ -200,10 +203,10 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } - var countDownTimer: CountDownTimer? = null + var countDownTimer: CountDownTimer?=null - private fun setAudio(status: Boolean) { - if (status) { + private fun setAudio(status: Boolean){ + if(status){ //开始录音 audioFileName = "Audio_${System.currentTimeMillis()}_BadCase" RecordManager.getInstance().start(audioFileName) @@ -211,11 +214,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList viewAudioButton.setImageResource(R.drawable.icon_bad_case_audio_select) tvAudioCountDown.visibility = View.VISIBLE //开始倒计时 - if (countDownTimer == null) { + if(countDownTimer==null){ countDownTimer = object : CountDownTimer(60000, 1000) { override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished / 1000}S" + tvAudioCountDown.text = "${millisUntilFinished/1000}S" } override fun onFinish() { @@ -228,7 +231,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } countDownTimer?.start() } - } else { + }else{ //结束倒计时 countDownTimer?.cancel() countDownTimer?.onFinish() @@ -238,13 +241,11 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } - private fun uploadAudio() { + private fun uploadAudio(){ val singlePath = "/mnt/sdcard/mogo/DataCollection/${audioFileName}.wav" val file = File(singlePath) - if (file.exists()) { - LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext, - "Audio", - singlePath, + if(file.exists()){ + LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,"Audio",singlePath, object : OnUploadListener { override fun onUploadSuccess(filePath: String, downloadUrl: String) { CallerLogger.d("$M_DEVA$TAG", "语音文件上传成功:downloadUrl=$downloadUrl") @@ -260,7 +261,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList removeUploadListener(singlePath) } }) - } else { + }else{ //上传到服务器 upload(null) } @@ -270,7 +271,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList * 将语音文件上传Cos监听移除 * @param filePath 文件路径 */ - private fun removeUploadListener(filePath: String) { + private fun removeUploadListener(filePath: String){ val pkgInfo: List = filePath.substring( filePath.lastIndexOf("/") + 1, filePath.lastIndexOf(".") @@ -283,21 +284,21 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList * 将记录上传到服务器 * @param downloadUrl 语音文件下载地址 */ - private fun upload(downloadUrl: String?) { - GlobalScope.launch { + private fun upload(downloadUrl: String?){ + GlobalScope.launch{ val uploadResult = presenter.upload(mutableMapOf().also { itx -> - itx["carLicense"] = AppConfigInfo.plateNumber ?: "" //车牌号 - itx["filename"] = recordFileName ?: "" //bag包文件地址 + itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 + itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 - itx["key"] = recordKey ?: "" //key - itx["reason"] = uploadReason.toString() ?: "" //采集原因 + itx["key"] = recordKey?:"" //key + itx["reason"] = uploadReason.toString() //采集原因 itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "1" //渠道 itx["carSn"] = MoGoAiCloudClientConfig.getInstance().sn //SN itx["userRole"] = BadCaseConfig.identity //采集者角色 - itx["audioUrl"] = downloadUrl ?: "" //音频COS地址 - itx["mapVersion"] = BadCaseConfig.dockerVersion ?: "" //工控机版本 + itx["audioUrl"] = downloadUrl?:"" //音频COS地址 + itx["mapVersion"] = BadCaseConfig.dockerVersion ?:"" //工控机版本 itx["eyeVersion"] = AppUtils.getAppVersionName() //鹰眼版本 itx["coordinate"] = "latitude:${latitude};longitude:${longitude}" //坐标 @@ -306,6 +307,15 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList TipToast.shortTip("上报失败") } else { TipToast.shortTip("上报成功") + //将上报BI的结果同步给工控机记录保存 + recordKey?.let { + val hasAudio = downloadUrl != null + val descReqEntity = BagDescriptionEntity(uploadReason.toString(),hasAudio,downloadUrl.toString(),true) + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = it.toLong() + bagManagerEntity.descReq = descReqEntity + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } @@ -346,19 +356,28 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 mWindowManager!!.addView(mFloatLayout, mWindowParams) //开启录包 - if (recordCaseEntity != null) { - CallerAutoPilotControlManager.recordPackage( - recordCaseEntity.caseId, - Random(SystemClock.elapsedRealtime()).nextInt(), - BadCaseConfig.totalDuration, - BadCaseConfig.previousDuration, - recordCaseEntity.topicList - ) - } else { - CallerAutoPilotControlManager.recordPackage( - BadCaseConfig.type, Random(SystemClock.elapsedRealtime()).nextInt(), - BadCaseConfig.totalDuration, BadCaseConfig.previousDuration - ) + if(recordCaseEntity!=null){ + CallerAutoPilotControlManager.recordPackage(recordCaseEntity.caseId,Random(SystemClock.elapsedRealtime()).nextInt(), + BadCaseConfig.totalDuration, BadCaseConfig.previousDuration,recordCaseEntity.topicList) + }else{ + CallerAutoPilotControlManager.recordPackage(BadCaseConfig.type,Random(SystemClock.elapsedRealtime()).nextInt(), + BadCaseConfig.totalDuration, BadCaseConfig.previousDuration) + } + } + } + + fun showReportBIWindow(bagInfoEntity: BagInfoEntity){ + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = metrics.widthPixels + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 + mWindowManager!!.addView(mFloatLayout, mWindowParams) + //已经录包无需再次启动录包,只要将录包信息同步到弹窗 + bagInfoEntity.let { + recordKey = it.key.toString() + recordFileName = it.bagPath } } } @@ -373,13 +392,12 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { CallerLogger.d("${M_DEVA}${TAG}", "-- 收到工控机录制任务回调 -- $recordPanel") - ThreadUtils.runOnUiThread { - if (recordKey == null) { + if(recordKey==null){ recordKey = recordPanel.key.toString() BadCaseConfig.recordKeyList.add(recordPanel.key) } - if (recordFileName == null) { + if(recordFileName==null){ recordFileName = recordPanel.filename } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt index 3459ecf586..bf0429ecf6 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/PassiveBadCaseWindow.kt @@ -6,6 +6,8 @@ import android.graphics.Color import android.graphics.PixelFormat import android.os.CountDownTimer import android.os.Handler +import android.os.Parcel +import android.os.Parcelable import android.util.DisplayMetrics import android.view.* import android.widget.CheckBox @@ -15,10 +17,13 @@ import android.widget.TextView import com.google.android.flexbox.FlexboxLayout import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.eagle.core.data.app.AppConfigInfo +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationWGS84Listener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -28,12 +33,13 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.zhidao.loglib.call.LogInfoManagerFactory import com.zhidao.loglib.upload.OnUploadListener -import com.zhidao.loglib.upload.UploadManager import com.zhjt.mogo_core_function_devatools.R import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.mogo_core_function_devatools.badcase.record.RecordManager import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import mogo.telematics.pad.MessagePad +import com.zhidao.loglib.upload.UploadManager import me.jessyan.autosize.utils.AutoSizeUtils import org.greenrobot.eventbus.EventBus import java.io.File @@ -56,14 +62,16 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var mFloatLayout: View private var audioStatus = false - private var audioFileName: String? = null //录音文件名称 + private var audioFileName:String?=null //录音文件名称 + + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() private var uploadReason: String = String() //上报原因,标签 - private var recordKey: String? = null //录制bag包key - private var recordFileName: String? = null //录制文件包名 - private var boxBean: MsgBoxBean? = null - private var longitude: Double? = null - private var latitude: Double? = null + private var recordKey: String?=null //录制bag包key + private var recordFileName: String?=null //录制文件包名 + private var boxBean: MsgBoxBean ?= null + private var longitude: Double?=null + private var latitude: Double?=null private var mInViewX = 0f private var mInViewY = 0f @@ -73,7 +81,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var mInScreenY = 0f private var clickListener: ClickListener? = null - var countDownTimer: CountDownTimer? = null + var countDownTimer: CountDownTimer?=null private lateinit var tvPassiveNum: TextView private lateinit var tvPassiveTime: TextView @@ -96,9 +104,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } @SuppressLint("SetTextI18n") - private fun initFloatWindow() { - mFloatLayout = - LayoutInflater.from(mActivity).inflate(R.layout.view_passive_bad_case, null) as View + private fun initFloatWindow(){ + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_passive_bad_case, null) as View mFloatLayout.setOnTouchListener(this) tvPassiveNum = mFloatLayout.findViewById(R.id.tvPassiveNum) tvPassiveTime = mFloatLayout.findViewById(R.id.tvPassiveTime) @@ -108,13 +115,12 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene tvPassiveReport = mFloatLayout.findViewById(R.id.tvPassiveReport) tvPassiveCancel = mFloatLayout.findViewById(R.id.tvPassiveCancel) flReasonLayout = mFloatLayout.findViewById(R.id.flReasonLayout) - if (BadCaseConfig.windowNum < 1) { + if(BadCaseConfig.windowNum<1){ BadCaseConfig.windowNum = 1 } tvPassiveNum.text = BadCaseConfig.windowNum.toString() BadCaseConfig.windowNum++ - tvPassiveTime.text = - "时间:${millis2String(System.currentTimeMillis(), TimeUtils.getHourMinSecondFormat())}" + tvPassiveTime.text = "时间:${millis2String(System.currentTimeMillis(),TimeUtils.getHourMinSecondFormat())}" tvPassiveIdentity.text = "身份:${BadCaseConfig.identity}" // 添加 ADAS车辆状态&定位 监听 CallerChassisLocationWGS84ListenerManager.addListener(TAG, this) @@ -124,17 +130,17 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } tvPassiveReport.setOnClickListener { - if (uploadReason.isEmpty()) { + if(uploadReason.isEmpty()){ TipToast.shortTip("请选择至少一个Case") return@setOnClickListener } - if (audioStatus) { + if(audioStatus){ audioStatus = !audioStatus setAudio(audioStatus) Handler().postDelayed({ uploadAudio() - }, 1000) - } else { + },1000) + }else{ uploadAudio() } //删除记录 @@ -162,8 +168,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } } - private fun setAudio(status: Boolean) { - if (status) { + private fun setAudio(status: Boolean){ + if(status){ //开始录音 audioFileName = "Audio_${System.currentTimeMillis()}_BadCase" RecordManager.getInstance().start(audioFileName) @@ -171,11 +177,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene viewAudioButton.setImageResource(R.drawable.icon_bad_case_audio_select) tvAudioCountDown.visibility = View.VISIBLE //开始倒计时 - if (countDownTimer == null) { + if(countDownTimer==null){ countDownTimer = object : CountDownTimer(60000, 1000) { override fun onTick(millisUntilFinished: Long) { - tvAudioCountDown.text = "${millisUntilFinished / 1000}S" + tvAudioCountDown.text = "${millisUntilFinished/1000}S" } override fun onFinish() { @@ -188,7 +194,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } countDownTimer?.start() } - } else { + }else{ //结束倒计时 countDownTimer?.cancel() countDownTimer?.onFinish() @@ -198,13 +204,11 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene } - private fun uploadAudio() { + private fun uploadAudio(){ val singlePath = "/mnt/sdcard/mogo/DataCollection/${audioFileName}.wav" val file = File(singlePath) - if (file.exists()) { - LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext, - "Audio", - singlePath, + if(file.exists()){ + LogInfoManagerFactory.createAudioUpload(mActivity.applicationContext,"Audio",singlePath, object : OnUploadListener { override fun onUploadSuccess(filePath: String, downloadUrl: String) { CallerLogger.d("$M_DEVA$TAG", "语音文件上传成功:downloadUrl=$downloadUrl") @@ -220,7 +224,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene removeUploadListener(singlePath) } }) - } else { + }else{ //上传到服务器 upload(null) } @@ -230,7 +234,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene * 将语音文件上传Cos监听移除 * @param filePath 文件路径 */ - private fun removeUploadListener(filePath: String) { + private fun removeUploadListener(filePath: String){ val pkgInfo: List = filePath.substring( filePath.lastIndexOf("/") + 1, filePath.lastIndexOf(".") @@ -243,21 +247,21 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene * 将记录上传到服务器 * @param downloadUrl 语音文件下载地址 */ - private fun upload(downloadUrl: String?) { - GlobalScope.launch { + private fun upload(downloadUrl: String?){ + GlobalScope.launch{ val uploadResult = presenter.upload(mutableMapOf().also { itx -> - itx["carLicense"] = AppConfigInfo.plateNumber ?: "" //车牌号 - itx["filename"] = recordFileName ?: "" //bag包文件地址 + itx["carLicense"] = AppConfigInfo.plateNumber?:"" //车牌号 + itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 - itx["key"] = recordKey ?: "" //key + itx["key"] = recordKey?:"" //key itx["reason"] = uploadReason //采集原因 itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "0" //渠道 itx["carSn"] = MoGoAiCloudClientConfig.getInstance().sn //SN itx["userRole"] = BadCaseConfig.identity //采集者角色 - itx["audioUrl"] = downloadUrl ?: "" //音频COS地址 - itx["mapVersion"] = BadCaseConfig.dockerVersion ?: "" //工控机版本 + itx["audioUrl"] = downloadUrl?:"" //音频COS地址 + itx["mapVersion"] = BadCaseConfig.dockerVersion ?:"" //工控机版本 itx["eyeVersion"] = AppUtils.getAppVersionName() //鹰眼版本 itx["coordinate"] = "latitude:${latitude};longitude:${longitude}" //坐标 @@ -266,6 +270,15 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene TipToast.shortTip("上报失败") } else { TipToast.shortTip("上报成功") + //将上报BI的结果同步给工控机记录保存 + recordKey?.let { + val hasAudio = downloadUrl != null + val descReqEntity = BagDescriptionEntity(uploadReason,hasAudio,downloadUrl.toString(),true) + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = it.toLong() + bagManagerEntity.descReq = descReqEntity + CallerAutoPilotControlManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } @@ -309,33 +322,28 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene // 默认固定位置,靠屏幕右边缘的中间 mWindowManager!!.defaultDisplay.getMetrics(metrics) mWindowParams!!.x = metrics.widthPixels - mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() - 950 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight()-950 mWindowManager!!.addView(mFloatLayout, mWindowParams) } - GlobalScope.launch { + GlobalScope.launch{ presenter.loadBadCases(true).also { ThreadUtils.runOnUiThread { it.iterator().forEach { val checkBox = CheckBox(mActivity) checkBox.setTextColor(Color.WHITE) - val lp = FlexboxLayout.LayoutParams( - FlexboxLayout.LayoutParams.WRAP_CONTENT, - FlexboxLayout.LayoutParams.WRAP_CONTENT - ) - checkBox.buttonDrawable = - mActivity.resources.getDrawable(R.drawable.badcase_radio_button_style) - checkBox.setPadding( + val lp = FlexboxLayout.LayoutParams(FlexboxLayout.LayoutParams.WRAP_CONTENT, + FlexboxLayout.LayoutParams.WRAP_CONTENT) + checkBox.buttonDrawable = mActivity.resources.getDrawable(R.drawable.badcase_radio_button_style) + checkBox.setPadding(SizeUtils.dp2px(10f), SizeUtils.dp2px(10f), SizeUtils.dp2px(10f), - SizeUtils.dp2px(10f), - SizeUtils.dp2px(10f) - ) - checkBox.textSize = AutoSizeUtils.dp2px(mActivity, 18f).toFloat() + SizeUtils.dp2px(10f)) + checkBox.textSize = AutoSizeUtils.dp2px(mActivity,18f).toFloat() checkBox.text = it.reason checkBox.isChecked = it.isChecked checkBox.setOnCheckedChangeListener(this@PassiveBadCaseWindow) - flReasonLayout.addView(checkBox, lp) + flReasonLayout.addView(checkBox,lp) } } } @@ -345,13 +353,13 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene override fun onCheckedChanged(buttonView: CompoundButton?, isChecked: Boolean) { buttonView?.text?.let { - if (isChecked) { - if (!uploadReason.contains(it)) { + if(isChecked){ + if(!uploadReason.contains(it)){ uploadReason += it } - } else { - if (uploadReason.contains(it)) { - uploadReason = uploadReason.replace(it.toString(), "") + }else{ + if(uploadReason.contains(it)){ + uploadReason = uploadReason.replace(it.toString(),"") } } @@ -365,7 +373,7 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene if (mFloatLayout.parent != null) mWindowManager!!.removeView(mFloatLayout) } - fun setRecord(msgBoxBean: MsgBoxBean) { + fun setRecord(msgBoxBean: MsgBoxBean){ boxBean = msgBoxBean val recordBagMsg = (msgBoxBean.bean as RecordBagMsg) recordKey = recordBagMsg.key.toString() diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java new file mode 100644 index 0000000000..036f2cb2b0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/SpaceWarningDialog.java @@ -0,0 +1,87 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz; + +import android.app.Activity; +import android.app.Dialog; +import android.os.Bundle; +import android.view.WindowManager; +import android.widget.TextView; + +import androidx.annotation.NonNull; + +import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager; +import com.zhjt.mogo_core_function_devatools.R; + +/** + * @author XuXinChao + * @description BadCase车端磁盘空间已满预警弹窗 + * @since: 2022/2/1 + */ +public class SpaceWarningDialog extends Dialog { + + private TextView tvCleanDisk;//清理磁盘 + private TextView tvCancel;//取消 + private Activity mActivity; + + private ClickListener clickListener; + + public SpaceWarningDialog(@NonNull Activity activity) { + super(activity, R.style.bad_case_dialog); + mActivity = activity; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_space_warning); + WindowManager.LayoutParams params = getWindow().getAttributes(); + params.height = 688; + params.width = 1110; + getWindow().setAttributes(params);//向WindowManager设置属性 + setCanceledOnTouchOutside(false); + init(); + initEvent(); + } + + private void init(){ + tvCleanDisk = findViewById(R.id.tvCleanDisk); + tvCancel = findViewById(R.id.tvCancel); + } + + private void initEvent(){ + //清理磁盘 + tvCleanDisk.setOnClickListener(v -> { + //跳转录包管理页面 +// if(mActivity!=null){ +// CallerDevaToolsManager.INSTANCE.showBadCaseManagerView(mActivity); +// } + if(clickListener!=null){ + clickListener.showBadCaseManagerView(); + } + dismiss(); + }); + //取消 + tvCancel.setOnClickListener(v -> { + //取消弹窗 + dismiss(); + }); + } + + public void setClickListener(ClickListener clickListener){ + this.clickListener = clickListener; + } + + @Override + public void onAttachedToWindow() { + super.onAttachedToWindow(); + } + + @Override + public void onDetachedFromWindow() { + super.onDetachedFromWindow(); + } + + public interface ClickListener{ + void showBadCaseManagerView(); + } + +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt new file mode 100644 index 0000000000..d3c8abc803 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/biz/adapter/BagManagerListAdapter.kt @@ -0,0 +1,175 @@ +package com.zhjt.mogo_core_function_devatools.badcase.biz.adapter + +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.CheckBox +import android.widget.EditText +import android.widget.ImageView +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.zhjt.mogo_core_function_devatools.R +import java.text.DecimalFormat + +/** + * @author XuXinChao + * @description Bag包管理列表适配器 + * @since: 2022/12/19 + */ +class BagManagerListAdapter: RecyclerView.Adapter() { + + private var data:List ?= null + private var bagClickListener: BagClickListener ?= null + private val format = DecimalFormat("0.00") + + fun setData(data: List?){ + this.data = data + notifyDataSetChanged() + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder { + if(viewType == 1){ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_bag_time_title,parent,false) + return BagTimeTitleHolder(view) + }else{ + val view = LayoutInflater.from(parent.context) + .inflate(R.layout.item_bag_manager, parent, false) + return BagManagerListHolder(view) + } + } + + override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { + when(holder){ + is BagTimeTitleHolder ->{ + data?.let { + holder.tvBagTimeTitle.text = it[position].timeStr + } + } + is BagManagerListHolder->{ + data?.let { + val bagInfoEntity = it[position] + holder.cbBagSelect.setOnCheckedChangeListener(null) + holder.cbBagSelect.isChecked = bagInfoEntity.selectStatus + holder.cbBagSelect.tag = bagInfoEntity + holder.cbBagSelect.setOnCheckedChangeListener { _, isChecked -> + bagClickListener?.onClick(bagInfoEntity,isChecked) + } + + val textWatcher: TextWatcher = object : TextWatcher { + override fun beforeTextChanged( + charSequence: CharSequence, + i: Int, + i1: Int, + i2: Int + ) { + } + + override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} + override fun afterTextChanged(editable: Editable) { + bagInfoEntity.description?.let { desc-> + val descriptionStr = editable.toString() + if(desc.description != descriptionStr){ + desc.description = descriptionStr + bagClickListener?.editDescription(bagInfoEntity.key,desc) + } + } + } + } + holder.etBagNameEdit.onFocusChangeListener = + View.OnFocusChangeListener { p0, hasFocus -> + val edit = p0 as EditText + if(hasFocus){ + edit.addTextChangedListener(textWatcher) + }else{ + edit.removeTextChangedListener(textWatcher) + } + } + + + bagInfoEntity.description?.let { des-> + if(des.reportBI){ + //已上报 + holder.tvBagReportStatus.text = "已上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_reported_button_bg) + }else{ + //未上报 + holder.tvBagReportStatus.text = "上报" + holder.tvBagReportStatus.setBackgroundResource(R.drawable.bag_report_button_bg) + holder.tvBagReportStatus.setOnClickListener { + bagClickListener?.uploadBI(bagInfoEntity) + } + } + if(des.description.isEmpty()){ + holder.etBagNameEdit.setText(bagInfoEntity.key.toString()) + }else{ + holder.etBagNameEdit.setText(des.description) + } + } + + + if(bagInfoEntity.description?.hasAudio == true){ + holder.ivBagAudio.visibility = View.VISIBLE + holder.ivBagAudio.setOnClickListener { + bagInfoEntity.description?.let { description-> + bagClickListener?.bagAudio(bagInfoEntity.key,description.audioUrl) + } + } + }else{ + holder.ivBagAudio.visibility = View.INVISIBLE + } + //大小 + val bagSize = format.format(bagInfoEntity.totalSize/(1000*1024*1024.0)) + holder.tvBagSize.text = "${bagSize}G" + + //时间 + bagInfoEntity.timestamp?.let { time-> + val hour = time.substring(8,10) + val min = time.substring(10,12) + val second = time.substring(12,14) + holder.tvBagTime.text = "${hour}:${min}:${second}" + } + } + } + } + } + + override fun getItemCount() = data?.size ?: 0 + + override fun getItemViewType(position: Int): Int { + return data!![position].itemType + } + + class BagTimeTitleHolder(itemView: View): RecyclerView.ViewHolder(itemView){ + var tvBagTimeTitle: TextView = itemView.findViewById(R.id.tvBagTimeTitle) + } + + class BagManagerListHolder(itemView: View) : RecyclerView.ViewHolder(itemView){ + var cbBagSelect: CheckBox = itemView.findViewById(R.id.cbBagSelect) + var etBagNameEdit: EditText = itemView.findViewById(R.id.etBagNameEdit) + var tvBagReportStatus: TextView = itemView.findViewById(R.id.tvBagReportStatus) + var ivBagAudio: ImageView = itemView.findViewById(R.id.ivBagAudio) + var tvBagTime: TextView = itemView.findViewById(R.id.tvBagTime) + var tvBagSize: TextView = itemView.findViewById(R.id.tvBagSize) + } + + fun setListener(listener: BagClickListener){ + bagClickListener = listener + } + + interface BagClickListener{ + //选择Bag包 + fun onClick(bagInfoEntity: BagInfoEntity,isChecked: Boolean) + //上报BI平台 + fun uploadBI(bagInfoEntity: BagInfoEntity) + //编辑Bag包描述信息 + fun editDescription(key: Long,description: BagDescriptionEntity) + //听录音 + fun bagAudio(key: Long,audioUrl: String) + } + +} \ 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/BadCaseConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/consts/BadCaseConfig.kt index 44c7041d9a..f7c6fcd06f 100644 --- 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 @@ -1,5 +1,7 @@ package com.zhjt.mogo_core_function_devatools.badcase.consts +import com.mogo.eagle.core.data.badcase.BagInfoEntity + /** * @author XuXinChao * @description 录包配置参数 @@ -32,5 +34,8 @@ object BadCaseConfig { //自定义Topic清单列表 @JvmField var customTopicList: ArrayList = ArrayList() + //Bag包管理列表 + @JvmField + var bagManagerList: ArrayList = ArrayList() } \ 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/record/Audition.java b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java new file mode 100644 index 0000000000..f4ec60ac13 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/record/Audition.java @@ -0,0 +1,103 @@ +package com.zhjt.mogo_core_function_devatools.badcase.record; + +import android.media.AudioManager; +import android.media.MediaPlayer; +import android.text.TextUtils; + +//播放试听 +public class Audition implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener{ + private static volatile Audition INSTANCE; + public MediaPlayer mediaPlayer; + private String oldPath; + private OnAuditionListener listener; + + public interface OnAuditionListener { + void onAuditionCompletion(); + + } + + public void registerOnAuditionListener(OnAuditionListener listener) { + this.listener = listener; + } + + public void unregisterOnAuditionListener() { + this.listener = null; + } + + private Audition() { + } + + public static Audition getInstance() { + if (INSTANCE == null) { + synchronized (Audition.class) { + if (INSTANCE == null) { + INSTANCE = new Audition(); + } + } + } + return INSTANCE; + } + + + public boolean isPlaying() { + return mediaPlayer != null && mediaPlayer.isPlaying(); + } + + private void play(String path) { + oldPath = path; + if (mediaPlayer != null) { + mediaPlayer.release(); + mediaPlayer = null; + } + if (mediaPlayer == null) { + mediaPlayer = new MediaPlayer(); + mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); + mediaPlayer.setOnPreparedListener(this); + mediaPlayer.setOnCompletionListener(this); + } + try { + mediaPlayer.setDataSource(path); + } catch (Exception e) { + e.printStackTrace(); + } + mediaPlayer.prepareAsync(); + + } + + public void stop() { + oldPath = null; + if (mediaPlayer != null) { + mediaPlayer.stop(); + mediaPlayer.reset(); + } + + } + + public boolean playOrStop(String path) { + if (!TextUtils.equals(oldPath, path)) { + play(path); + return true; + } else { + stop(); + return false; + } + } + + public void onDestroy() { + stop(); + mediaPlayer = null; + } + + @Override + public void onPrepared(MediaPlayer mp) { + mp.start(); + } + + @Override + public void onCompletion(MediaPlayer mp) { + oldPath = null; + if (listener != null) { + listener.onAuditionCompletion(); + } + } +} diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png new file mode 100644 index 0000000000..2959045ff3 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_audio.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png new file mode 100644 index 0000000000..5f4ea0176b Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_bag_no_data.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_report_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_report_button_bg.xml new file mode 100644 index 0000000000..23037d43c7 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_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/bag_reported_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_reported_button_bg.xml new file mode 100644 index 0000000000..40bd562159 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bag_reported_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/cancel_select_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_select_button_bg.xml new file mode 100644 index 0000000000..b08f6cbec3 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/cancel_select_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/delete_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/delete_button_bg.xml new file mode 100644 index 0000000000..7bcbe63d19 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/delete_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/icon_bag_edit.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png new file mode 100644 index 0000000000..09ffe565d7 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/icon_bag_edit.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml new file mode 100644 index 0000000000..e5075f161d --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_ct.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml new file mode 100644 index 0000000000..353d7da364 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/progress_bar_drawable.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_button_bg.xml new file mode 100644 index 0000000000..8db8728253 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/select_all_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/space_percent_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_percent_bg.xml new file mode 100644 index 0000000000..c4425322f3 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_percent_bg.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml new file mode 100644 index 0000000000..645b1b3df2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/space_warning_progress_bg.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml new file mode 100644 index 0000000000..efb8967e91 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/unused_space_bg.xml @@ -0,0 +1,8 @@ + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_button_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_button_bg.xml new file mode 100644 index 0000000000..fe4635f8aa --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/upload_cloud_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/used_space_bg.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/used_space_bg.xml new file mode 100644 index 0000000000..8d23b4cb9f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/used_space_bg.xml @@ -0,0 +1,8 @@ + + + + diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml new file mode 100644 index 0000000000..0f76ebdba2 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml new file mode 100644 index 0000000000..5cfa0f954f --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_space_warning.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml new file mode 100644 index 0000000000..8cd8a75b48 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_manager.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml new file mode 100644 index 0000000000..38ccd6bf86 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/item_bag_time_title.xml @@ -0,0 +1,16 @@ + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml new file mode 100644 index 0000000000..6a86a27676 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_badcase_manager.xml @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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/setting/ToolsView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt index 62341fb157..a81a76c890 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/ToolsView.kt @@ -53,6 +53,10 @@ class ToolsView private constructor() { override fun showSOPSettingView() { sopView.toggle(it) } + + override fun showBadCaseManagerView() { + ToastUtils.showShort("代码合并中") + } }) } toolsViewFloat = WarningFloat.with(it) diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt index 4a40e3c053..f120cf33e1 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/AutoPilotAndCheckView.kt @@ -100,6 +100,10 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor( sopLayout.setOnClickListener { clickListener?.showSOPSettingView() } + managerLayout.setOnClickListener { + //录包管理页面 + clickListener?.showBadCaseManagerView() + } ivDebugPanel.setOnClickListener { clickListener?.showDebugPanelView() @@ -225,6 +229,7 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor( fun showDebugPanelView() fun showFeedbackView() fun showSOPSettingView() + fun showBadCaseManagerView() } override fun onAutopilotCarConfig(carConfigResp: MessagePad.CarConfigResp) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png new file mode 100644 index 0000000000..8dc2dff73f Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/debug_icon_bag_manager.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml index ec1ceea5e6..6b77eb7543 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_auto_pilot_check.xml @@ -148,6 +148,35 @@ + + + + + + + + 调试面板 录包设置 运营面板 + 录包管理 车速设置 账户信息 系统运行 diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt new file mode 100644 index 0000000000..823e6dfb24 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagDescriptionEntity.kt @@ -0,0 +1,12 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description bag附加信息(录音,备注,接管信息) + * @since: 2023/2/2 + */ +data class BagDescriptionEntity(var description: String,// bag接管描述或重命名信息 + var hasAudio: Boolean,// 此bag是否具有录音文件 + var audioUrl: String,// bag附加录音文件的文件名 + var reportBI: Boolean //上报BI状态 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt new file mode 100644 index 0000000000..8b15aee887 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagInfoEntity.kt @@ -0,0 +1,20 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 单个key值对应的包信息 + * @since: 2023/2/1 + */ +class BagInfoEntity(){ + var key: Long = 0// bag key值 + var totalSize: Long = 0// 所有子包或合并后的包的总大小 + var timestamp: String = ""// 时间戳 + var bagPath: String ?= null// bag所在路径 + var mergeStat: Boolean = false// 合并状态 + var uploadStat: Boolean = false// 上传cos桶状态 + var description: BagDescriptionEntity ?= null// 包描述信息 + var subBags: ArrayList =ArrayList()// 子包信息 + var selectStatus: Boolean = false //Bag包勾选状态,默认为未勾选 + var itemType: Int = 0 //0是正常Bag包,1为时间Title + var timeStr: String = "" +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt new file mode 100644 index 0000000000..21bf91c857 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagManagerEntity.kt @@ -0,0 +1,15 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 包管理请求 + * @since: 2023/2/1 + */ +class BagManagerEntity(){ + var reqType: Int = 1// 请求类型:0-invalid 1-获取空间使用信息 2-遍历所有bag 3-上传cos 4-删除bag 5-为bag添加附加信息 + var keyReq: Long =0// 要操作的包的key值,发送请求且reqType=(3,4,5)时有效 + var descReq: BagDescriptionEntity ?= null// 更新包附加信息,发送请求且reqType=5时有效 + var spaceInfoResp: List = ArrayList()// 空间使用信息,获取响应且reqType=1时有效 + val bagsInfoResp: MutableList = ArrayList()// 包信息列表,获取响应且reqType=2时有效 + var uploadCosResp: UploadCosStatEntity ?=null//反馈上传cos桶结果,获取响应且reqType=3时有效 +} \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt new file mode 100644 index 0000000000..ce7651e0f2 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/BagSpaceInfoEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description bag目录空间使用情况 + * @since: 2023/2/1 + */ +data class BagSpaceInfoEntity(var host: String,// 主机名 + var diskSpaceInfo: SpaceInfoEntity,// 硬盘空间信息 + var BagDirsSpaceInfo: List// /home/mogo/data/bags下各子空间信息 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt new file mode 100644 index 0000000000..fdf174bf4e --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SpaceInfoEntity.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 车端BadCase存储空间使用情况 + * @since: 2023/2/1 + */ +data class SpaceInfoEntity( + var directory: String,// 路径名,为空表示总空间,否则表示对应的/home/mogo/data/bags下的子目录 + var total: Long,// 总空间 + var free: Long,// 可用空间 + var used: Long // 已用空间 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt new file mode 100644 index 0000000000..c52c375ab5 --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/SubBagEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 各主机上报的包信息 + * @since: 2023/2/1 + */ +data class SubBagEntity(var key: Long,//bag key值 + var host: String,//主机名 + var size: Long //此子包的大小 + ) \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt new file mode 100644 index 0000000000..ae8d276ace --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/badcase/UploadCosStatEntity.kt @@ -0,0 +1,11 @@ +package com.mogo.eagle.core.data.badcase + +/** + * @author XuXinChao + * @description 上传cos桶状态 + * @since: 2023/2/1 + */ +data class UploadCosStatEntity(var key: Long, + var stat: Int,// 0-成功 1-执行中 2-copy过程失败 3-合并过程失败 4-上传过程失败 + var message: String// 失败时的具体描述 + ) \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt index e1c50cce6c..cc070805e1 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/autopilot/IMoGoAutopilotControlProvider.kt @@ -2,6 +2,7 @@ package com.mogo.eagle.core.function.api.autopilot import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.trafficlight.TrafficLightResult import com.mogo.eagle.core.function.api.base.IMoGoFunctionServerProvider @@ -187,6 +188,12 @@ interface IMoGoAutopilotControlProvider : IMoGoFunctionServerProvider { */ fun getBadCaseConfig(reqType: Int,recordType: Int,topicsNeedToCache: List): Boolean + /** + * 获取Bag包管理信息 + * @param bagManagerEntity 包管理请求实体类 + */ + fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean + /** * 发送工控机所有节点重启命令 */ 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 e622e30726..4cca4b7e3d 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 bag_manager.BagManagerOuterClass import mogo.telematics.pad.MessagePad import record_cache.RecordPanelOuterClass @@ -20,4 +21,9 @@ interface IMoGoAutopilotRecordListener { */ fun onAutopilotRecordConfig(config: MessagePad.RecordDataConfig){} + /** + * 录包任务管理应答 + */ + fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager){} + } \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt index 1140e23f39..6798098a60 100644 --- a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutoPilotControlManager.kt @@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.call.autopilot import android.os.SystemClock import chassis.SpecialVehicleTaskCmdOuterClass import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.constants.MogoServicePaths import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig @@ -268,6 +269,19 @@ object CallerAutoPilotControlManager { } } + /** + * 获取Bag包管理信息 + * @param bagManagerEntity 包管理请求实体类 + */ + fun sendBagManagerCmd(bagManagerEntity: BagManagerEntity): Boolean?{ + // 司机屏才能查询数据采集的配置 + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + return providerApi?.sendBagManagerCmd(bagManagerEntity) + }else{ + return false + } + } + /** * 向左变道 */ 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 5ae8d5a153..5eb0bfa59c 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 @@ -1,5 +1,6 @@ package com.mogo.eagle.core.function.call.autopilot +import bag_manager.BagManagerOuterClass import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener import com.mogo.eagle.core.function.call.base.CallerBase import mogo.telematics.pad.MessagePad @@ -34,4 +35,15 @@ object CallerAutopilotRecordListenerManager : CallerBase