diff --git a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java index 2fb5dbf217..b712b1425f 100644 --- a/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java +++ b/OCH/mogo-och-taxi/src/main/java/com/mogo/och/taxi/ui/TaxiFragment.java @@ -36,6 +36,8 @@ import org.greenrobot.eventbus.ThreadMode; import java.lang.ref.WeakReference; import java.util.List; +import bag_manager.BagManagerOuterClass; + /** * @author congtaowang * @since 2021/1/18 @@ -438,6 +440,10 @@ public class TaxiFragment extends BaseTaxiTabFragment0){ + selectedBagSize = 0 + for(selectBagInfo in bagManagerEntity.bagsInfoResp){ + selectBagInfo.selectStatus = true + selectedBagSize += selectBagInfo.totalSize + bagManagerList.add(selectBagInfo) + } + selectedBagNum = bagManagerEntity.bagsInfoResp.size + //显示选择包的个数和大小 + 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 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + + bagUploadDialog = BagUploadDialog(context) + bagUploadDialog?.setListener { //删除选择 + bagManagerList.clear() + 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) + } + } + bagUploadDialog?.setAllUpload(selectedBagNum,selectedBagSize) + bagUploadDialog?.show() + + }else{ + ToastUtils.showShort("请先选择要上传的Bag包") + } + + } + //删除Bag包 + tvDeleteSelect.setOnClickListener { + if(bagManagerList.size>0){ + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotManager.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包描述信息 + bagManagerEntity.reqType = 5 + bagManagerEntity.keyReq = key + bagManagerEntity.descReq = description + CallerAutoPilotManager.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") + + val descriptionEntityOne = BagDescriptionEntity("包信息描述1",false, + "CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav",false) + val bagInfoEntityOne = BagInfoEntity() + bagInfoEntityOne.key = 12341 + bagInfoEntityOne.totalSize = 1*1024*1024*1000 + bagInfoEntityOne.timestamp = System.currentTimeMillis().toString() + bagInfoEntityOne.bagPath = "" + bagInfoEntityOne.mergeStat = false + bagInfoEntityOne.uploadStat = false + bagInfoEntityOne.description = descriptionEntityOne + + val descriptionEntityTwo = BagDescriptionEntity("包信息描述2",true, + "CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav",true) + val bagInfoEntityTwo = BagInfoEntity() + bagInfoEntityTwo.key = 12342 + bagInfoEntityTwo.totalSize = 2*1024*1024*1000 + bagInfoEntityTwo.timestamp = System.currentTimeMillis().toString() + bagInfoEntityTwo.bagPath = "" + bagInfoEntityTwo.mergeStat = false + bagInfoEntityTwo.uploadStat = false + bagInfoEntityTwo.description = descriptionEntityTwo + + val descriptionEntityThree = BagDescriptionEntity("包信息描述3",true, + "CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav",true) + val bagInfoEntityThree = BagInfoEntity() + bagInfoEntityThree.key = 12343 + bagInfoEntityThree.totalSize = 1*1024*1024*1000 + bagInfoEntityThree.timestamp = System.currentTimeMillis().toString() + bagInfoEntityThree.bagPath = "" + bagInfoEntityThree.mergeStat = false + bagInfoEntityThree.uploadStat = false + bagInfoEntityThree.description = descriptionEntityThree + + val descriptionEntityFour = BagDescriptionEntity("包信息描述1",true, + "CarPad/mogopadlog/X20202111230C01YYW/2023-01-30/Audio_1675049657187_BadCase.wav",true) + val bagInfoEntityFour = BagInfoEntity() + bagInfoEntityFour.key = 12344 + bagInfoEntityFour.totalSize = 10*1024*1024*1000L + bagInfoEntityFour.timestamp = System.currentTimeMillis().toString() + bagInfoEntityFour.bagPath = "" + bagInfoEntityFour.mergeStat = false + bagInfoEntityFour.uploadStat = false + bagInfoEntityFour.description = descriptionEntityFour + + bagManagerEntity.bagsInfoResp.add(bagInfoEntityOne) + bagManagerEntity.bagsInfoResp.add(bagInfoEntityTwo) + bagManagerEntity.bagsInfoResp.add(bagInfoEntityThree) + bagManagerEntity.bagsInfoResp.add(bagInfoEntityFour) + + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } fun setOnClickListener(clickListener: ClickListener) { @@ -57,4 +272,146 @@ internal class BadCaseManagerView @JvmOverloads constructor( fun onClose() } + override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) { + super.onBagManagerResult(bagManager) + UiThreadHandler.post { + //获取空间使用信息 + if(bagManager.reqType == 1){ + //遍历各个主机的硬盘空间信息 + if(bagManager.spaceInfoRespCount>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){ + if(bagManager.bagsInfoRespCount>0){ + 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.description = descriptionEntity + for(subBag in it.subBagsList){ + val subBagEntity = SubBagEntity(subBag.key,subBag.host,subBag.size) + bagInfoEntity.subBags.add(subBagEntity) + } + bagManagerEntity.bagsInfoResp.add(bagInfoEntity) + } + } + //更新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.keyReq){ + 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 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + } + //删除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() +// bagManagerEntity.bagsInfoResp.remove(deleteBagInfo) + bagManagerList.remove(deleteBagInfo) + //更新列表 + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + if(bagManagerList.size>0){ + //继续执行删除命令 + bagManagerEntity.reqType = 4 + bagManagerEntity.keyReq = bagManagerList[0].key + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } + } + } + } + //修改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 + } + //更新List + bagManagerListAdapter?.setData(bagManagerEntity.bagsInfoResp) + } + } + } + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerAutopilotRecordListenerManager.addListener(TAG, this) + bagManagerEntity.reqType = 2 + //遍历所有bag + CallerAutoPilotManager.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 + CallerAutoPilotManager.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 index edfad1faeb..52045bd0c4 100644 --- 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 @@ -4,6 +4,7 @@ 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; @@ -20,6 +21,14 @@ public class BagUploadDialog extends Dialog { private TextView tvCancelUpload;//取消上传 private TextView tvCancel;//取消 private TextView tvUploadDetail;//上传详情 + private ProgressBar viewUploadProgress;//上传进度条 + + private int totalNum; + private Long totalSize; + private int remainNum; + private Long remainSize; + + private BagUploadListener uploadListener; public BagUploadDialog(@NonNull Context context) { super(context, R.style.bad_case_dialog); @@ -42,12 +51,16 @@ public class BagUploadDialog extends Dialog { 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 -> { @@ -64,4 +77,28 @@ public class BagUploadDialog extends Dialog { public void onDetachedFromWindow() { super.onDetachedFromWindow(); } + + public void setListener(BagUploadListener listener){ + uploadListener = listener; + } + + public void setAllUpload(int totalNum,Long totalSize){ + this.totalNum = totalNum; + this.totalSize = totalSize; + } + + public void updateRemainUpload(int remainNum,Long remainSize){ + this.remainNum = remainNum; + this.remainSize = remainSize; + //更新进度条和进度文字 + tvUploadDetail.setText("共计"+totalNum+"个包 ("+(totalSize/(1000*1024*1024L))+"G) 已上传"+(totalNum-remainNum)+"个包 (" + +((totalSize-remainSize)/(1000*1024*1024L))+"G) 剩余"+remainNum+"个包 ("+ (remainSize/(1000*1024*1024L))+"G)"); + viewUploadProgress.setProgress((totalNum-remainNum)*100/totalNum); + } + + 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 9756927f7f..7b35d26999 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 08ad929554..9bc755aefa 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 50f692b8ba..c28171471a 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.function.api.autopilot.IMoGoAutopilotCarStateListener import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotRecordListener @@ -89,6 +92,8 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList private var longitude: Double?=null private var latitude: Double?=null + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + private var mInViewX = 0f private var mInViewY = 0f private var mDownInScreenX = 0f @@ -285,7 +290,7 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList itx["filename"] = recordFileName?:"" //bag包文件地址 itx["filesize"] = "0" //bag包文件大小 itx["key"] = recordKey?:"" //key - itx["reason"] = uploadReason.toString()?:"" //采集原因 + itx["reason"] = uploadReason.toString() //采集原因 itx["duration"] = BadCaseConfig.totalDuration.toString() //采集时长,固定为20S itx["startTime"] = System.currentTimeMillis().toString() //上报时间(时间戳格式) itx["channel"] = "1" //渠道 @@ -301,6 +306,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 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } @@ -351,6 +365,22 @@ class InitiativeBadCaseWindow constructor(activity: Activity) : View.OnTouchList } } + 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 + } + } + } + fun hideFloatWindow() { //注销采集结果回调监听 CallerAutopilotRecordListenerManager.removeListener(this.hashCode().toString()) 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 cfb42c46b6..451465b1f1 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 @@ -16,10 +16,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.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.RecordBagMsg import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarStateListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotManager import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarStatusListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -61,6 +64,8 @@ class PassiveBadCaseWindow constructor(activity: Activity) : View.OnTouchListene private var audioStatus = false 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 //录制文件包名 @@ -265,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 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } BadCaseConfig.windowNum-- clickListener?.closeWindow() } 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 index 2fb6b559c8..ae037f522d 100644 --- 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 @@ -1,5 +1,7 @@ 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 @@ -7,7 +9,11 @@ import android.widget.CheckBox import android.widget.EditText import android.widget.ImageView import android.widget.TextView +import androidx.core.widget.addTextChangedListener import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.badcase.BagDescriptionEntity +import com.mogo.eagle.core.data.badcase.BagInfoEntity +import com.mogo.eagle.core.utilcode.util.TimeUtils import com.zhjt.mogo_core_function_devatools.R import kotlinx.coroutines.NonDisposableHandle import kotlinx.coroutines.NonDisposableHandle.parent @@ -19,7 +25,13 @@ import kotlinx.coroutines.NonDisposableHandle.parent */ class BagManagerListAdapter: RecyclerView.Adapter() { - private var data:List ?= null + private var data:List ?= null + private var bagClickListener: BagClickListener ?= null + + fun setData(data: List?){ + this.data = data + notifyDataSetChanged() + } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BagManagerListHolder { val view = LayoutInflater.from(parent.context) @@ -28,7 +40,84 @@ class BagManagerListAdapter: RecyclerView.Adapter + bagClickListener?.onClick(bagInfoEntity,isChecked) + } + holder.etBagNameEdit.addTextChangedListener(object:TextWatcher{ + override fun beforeTextChanged( + s: CharSequence?, + start: Int, + count: Int, + after: Int + ) { + + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + + } + + override fun afterTextChanged(s: Editable?) { + bagInfoEntity.description?.let { desc-> + val descriptionStr = s.toString() + if(desc.description != descriptionStr){ + desc.description = descriptionStr + bagClickListener?.editDescription(bagInfoEntity.key,desc) + } + } + } + + }) + + 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 + } + + holder.tvBagSize.text = "${bagInfoEntity.totalSize/(1000*1024*1024)}G" + holder.tvBagTime.text = + it[position].timestamp?.let { it1 -> TimeUtils.millis2String(it1.toLong(),TimeUtils.getHourMinSecondFormat()) } + + + } } override fun getItemCount() = data?.size ?: 0 @@ -42,4 +131,19 @@ class BagManagerListAdapter: RecyclerView.Adapter = 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/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/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/layout/dialog_bag_upload.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/dialog_bag_upload.xml index 7af9702d7a..ac59ac7c64 100644 --- 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 @@ -66,7 +66,7 @@ android:gravity="center" /> - - + xmlns:app="http://schemas.android.com/apk/res-auto" + android:layout_marginTop="18dp" + android:layout_marginBottom="18dp" + > \ 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 index 88e48b03c6..78c13df55d 100644 --- 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 @@ -51,7 +51,7 @@ android:layout_marginTop="100dp" android:progressDrawable="@drawable/space_percent_bg" android:max="100" - android:progress="30" + android:progress="10" /> @@ -104,7 +104,7 @@ android:layout_height="80dp" app:layout_constraintLeft_toLeftOf="@id/viewManagerTitleLine" app:layout_constraintTop_toBottomOf="@id/viewUsedSpace" - android:layout_marginTop="30dp" + android:layout_marginTop="50dp" android:background="@drawable/select_all_button_bg" android:text="一键全选" android:textColor="#FFFFFFFF" @@ -119,7 +119,7 @@ app:layout_constraintTop_toTopOf="@id/tvSelectAll" app:layout_constraintBottom_toBottomOf="@id/tvSelectAll" app:layout_constraintLeft_toRightOf="@id/tvSelectAll" - android:layout_marginStart="20dp" + android:layout_marginStart="30dp" android:background="@drawable/cancel_select_button_bg" android:text="取消" android:textColor="#FFFFFFFF" @@ -144,7 +144,7 @@ android:layout_height="120dp" app:layout_constraintLeft_toLeftOf="@id/pbSpacePercent" app:layout_constraintBottom_toBottomOf="parent" - android:layout_marginBottom="50dp" + android:layout_marginBottom="120dp" android:background="@drawable/upload_cloud_button_bg" android:text="上云" android:textColor="#FFFFFFFF" @@ -174,6 +174,8 @@ app:layout_constraintRight_toRightOf="@id/pbSpacePercent" app:layout_constraintTop_toBottomOf="@id/tvSelectAll" app:layout_constraintBottom_toTopOf="@id/tvUploadCloud" + android:layout_marginTop="20dp" + android:layout_marginBottom="20dp" /> \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt index 08656d1ff9..ff7c2dbe2a 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiFragment.kt @@ -19,12 +19,14 @@ import android.view.animation.* import android.widget.* import androidx.core.view.* import androidx.lifecycle.lifecycleScope +import bag_manager.BagManagerOuterClass import com.alibaba.android.arouter.facade.annotation.Route import com.alibaba.android.arouter.launcher.ARouter import com.mogo.commons.context.ContextHolderUtil import com.mogo.commons.mvp.BaseFragment import com.mogo.commons.mvp.MvpFragment import com.mogo.commons.voice.* +import com.mogo.eagle.core.data.badcase.BagManagerEntity import com.mogo.eagle.core.data.bindingcar.AdUpgradeStateHelper import com.mogo.eagle.core.data.bindingcar.IPCUpgradeStateInfo import com.mogo.eagle.core.data.camera.CameraEntity @@ -103,6 +105,7 @@ import com.mogo.eagle.core.utilcode.util.* import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.zhidao.support.adas.high.common.MogoReport.Code.Error.EMAP.* +import com.zhjt.mogo_core_function_devatools.badcase.biz.SpaceWarningDialog import com.zhjt.mogo_core_function_devatools.badcase.consts.BadCaseConfig import com.zhjt.service_biz.BizConfig import kotlinx.android.synthetic.main.fragment_hmi.* @@ -183,6 +186,8 @@ class MoGoHmiFragment : MvpFragment(), private var busOperationStatus: IOchBusView? = null + private var bagManagerEntity: BagManagerEntity = BagManagerEntity() + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } @@ -313,6 +318,17 @@ class MoGoHmiFragment : MvpFragment(), setProxyTrafficLightView(viewTrafficLightVr) setProxyLimitingSpeedView(viewLimitingVelocity) setViewNotificationProvider(this) + + // 开启定时查询速度 + Timer().schedule(timerTaskRefresh, Date(), 60*1000) + } + + private val timerTaskRefresh = object : TimerTask() { + override fun run() { + //请求磁盘空间使用情况 + bagManagerEntity.reqType = 1 + CallerAutoPilotManager.sendBagManagerCmd(bagManagerEntity) + } } override fun getNotificationView(): IViewNotification? = @@ -381,10 +397,34 @@ class MoGoHmiFragment : MvpFragment(), } } + override fun onBagManagerResult(bagManager: BagManagerOuterClass.BagManager) { + super.onBagManagerResult(bagManager) + //判断磁盘是否已满,展示预警弹窗 + UiThreadHandler.post{ + bagManager.spaceInfoRespCount + if(bagManager.spaceInfoRespCount>0){ + for(spaceInfo in bagManager.spaceInfoRespList){ + for(bagSpaceInfo in spaceInfo.bagDirsSpaceInfoList){ + if(bagSpaceInfo.free == 0L){ + //磁盘空间已满 + val spaceWarningDialog = SpaceWarningDialog(requireContext()) + spaceWarningDialog.show() + } + } + } + } + } + } + override fun onDestroyView() { super.onDestroyView() CallerAutopilotRecordListenerManager.removeListener(TAG) CallerAutoPilotStatusListenerManager.removeListener(TAG) + try { + timerTaskRefresh.cancel() + } catch (e: Exception) { + e.printStackTrace() + } } 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 index 49af795a50..3af98f90a9 100644 --- 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 @@ -5,12 +5,14 @@ package com.mogo.eagle.core.data.badcase * @description 单个key值对应的包信息 * @since: 2023/2/1 */ -data class BagInfoEntity(var key: Long,// bag key值 - var totalSize: Long,// 所有子包或合并后的包的总大小 - var timestamp: String,// 时间戳 - var bagPath: String,// bag所在路径 - var mergeStat: Boolean,// 合并状态 - var uploadStat: Boolean,// 上传cos桶状态 - var description: BagDescriptionEntity,// 包描述信息 - var subBags: List // 子包信息 - ) \ No newline at end of file +class BagInfoEntity(){ + var key: Long = 0// bag key值 + var totalSize: Long = 0// 所有子包或合并后的包的总大小 + var timestamp: String ?= null// 时间戳 + 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包勾选状态,默认为未勾选 +} \ 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 index 70359b0a93..21bf91c857 100644 --- 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 @@ -5,10 +5,11 @@ package com.mogo.eagle.core.data.badcase * @description 包管理请求 * @since: 2023/2/1 */ -data class BagManagerEntity(var reqType: Int,// 请求类型:0-invalid 1-获取空间使用信息 2-遍历所有bag 3-上传cos 4-删除bag 5-为bag添加附加信息 - var keyReq: Long,// 要操作的包的key值,发送请求且reqType=(3,4,5)时有效 - var descReq: BagDescriptionEntity,// 更新包附加信息,发送请求且reqType=5时有效 - var spaceInfoResp: List,// 空间使用信息,获取响应且reqType=1时有效 - var bagsInfoResp: List,// 包信息列表,获取响应且reqType=2时有效 - var uploadCosResp: UploadCosStatEntity //反馈上传cos桶结果,获取响应且reqType=3时有效 - ) \ No newline at end of file +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-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/CallerAutopilotRecordListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/autopilot/CallerAutopilotRecordListenerManager.kt index b1280cb09a..1059c60836 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,6 +1,7 @@ package com.mogo.eagle.core.function.call.autopilot import androidx.annotation.Nullable +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 @@ -78,5 +79,16 @@ object CallerAutopilotRecordListenerManager : CallerBase() { } } + /** + * 录包任务管理应答 + */ + fun invokeBagManagerResult(bagManager: BagManagerOuterClass.BagManager){ + M_AUTOPILOT_RECORD_LISTENERS.forEach{ + val tag = it.key + val listener = it.value + listener.onBagManagerResult(bagManager) + } + } + } \ No newline at end of file