diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt index 9962aa08aa..ca769c1b31 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/badcase/BadCaseManager.kt @@ -417,7 +417,6 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis override fun onAutopilotRecordResult(recordPanel: RecordPanelOuterClass.RecordPanel) { super.onAutopilotRecordResult(recordPanel) CallerLogger.d("$M_DEVA$TAG", "recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type}") - CallerLogger.i(TestTag,"onAutopilotRecordResult receive recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") if(BadCaseConfig.notDisplayBagWindow){ //此时点击主动录包按钮,不能展示上报弹窗,需要在此处做主动录包弹窗中的一些逻辑 //开始录制 @@ -441,22 +440,18 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis CallerLogger.i(TestTag,"onAutopilotRecordResult contains recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") //目前type == 3包括接管被动录包和其他一些故障录包 if(recordPanel.type == 3){ - CallerLogger.i(TestTag,"onAutopilotRecordResult 符合type=3 recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") //录包成功 if(recordPanel.stat == 100 || recordPanel.stat == 101){ - CallerLogger.i(TestTag,"onAutopilotRecordResult 录包成功 recordKey=${recordPanel.key},stat=${recordPanel.stat},type=${recordPanel.type},lineName=${BadCaseConfig.lineName}") val activity = AppStateManager.currentActivity() if (activity !is AppCompatActivity) { return } - CallerLogger.i(TestTag,"activity符合条件") val geocodeSearch = GeocodeSearch(activity) geocodeSearch.setOnGeocodeSearchListener(object: GeocodeSearch.OnGeocodeSearchListener { override fun onRegeocodeSearched(regeocodeResult: RegeocodeResult?, p1: Int) { regeocodeResult?.regeocodeAddress?.formatAddress?.let { address = it } - CallerLogger.i(TestTag,"onRegeocodeSearched address=${address}") val takeOverRecordInfo = TakeOverRecordInfo(System.currentTimeMillis(), address,level1Id,level2Id,level3Id, level1Name, level2Name, level3Name, @@ -477,12 +472,12 @@ internal object BadCaseManager : LifecycleEventObserver, IMoGoAutopilotRecordLis val q = RegeocodeQuery(latLon,200f,GeocodeSearch.AMAP) geocodeSearch.getFromLocationAsyn(q) takeOverBagId = recordPanel.key -// //触发域控前后120度摄像头截图和高精地图截图 -// CallerAutoPilotControlManager.sendCaptureImgReqOnTakeOver(recordPanel.key) -// //高精地图屏幕截图 -// CallerMapScreenListenerManager.addListener(TAG,this) -// //开启高精地图截图 -// CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() + //触发域控前后120度摄像头截图和高精地图截图 + CallerAutoPilotControlManager.sendCaptureImgReqOnTakeOver(recordPanel.key) + //高精地图屏幕截图 + CallerMapScreenListenerManager.addListener(TAG,this) + //开启高精地图截图 + CallerMapUIServiceManager.getMapUIController()?.getMapScreenShot() } } } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt index c57fd8122b..10f50ff625 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverReasonWindow.kt @@ -3,7 +3,9 @@ package com.zhjt.mogo_core_function_devatools.workorder import android.annotation.SuppressLint import android.app.Activity import android.graphics.PixelFormat +import android.net.Uri import android.os.Bundle +import android.os.Environment import android.text.Editable import android.text.TextWatcher import android.util.DisplayMetrics @@ -41,13 +43,15 @@ import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.eagle.core.utilcode.util.JsonParser import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.TimeUtils +import com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.tts.base.SpeechUtils 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.workorder.adapter.OrderReasonAdapter -import kotlin.math.absoluteValue +import java.io.File + /** * 接管原因编辑窗口 @@ -63,11 +67,7 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene private var mWindowParams: WindowManager.LayoutParams? = null private var mWindowManager: WindowManager? = null private lateinit var mFloatLayout: View - - private var mInViewX = 0f - private var mInViewY = 0f - private var mInScreenX = 0f - private var mInScreenY = 0f + private var takeOverSceneWindow: TakeOverSceneWindow ?= null // 语音听写对象 private var mIat: SpeechRecognizer? = null @@ -84,6 +84,9 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene private lateinit var tvTakeOverReason: AppCompatTextView private lateinit var etNoteInput: AppCompatEditText private lateinit var ivNoteAudio: ImageView + private lateinit var ivFrontCamera: ImageView + private lateinit var ivRearCamera: ImageView + private lateinit var ivMapScreen: ImageView private lateinit var tvTakeOverSave: TextView private lateinit var tvTakeOverCancel: TextView private lateinit var rvTakeOverList: RecyclerView @@ -132,7 +135,7 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene it.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL it.gravity = Gravity.START or Gravity.TOP it.width = 902 - it.height = 1530 + it.height = 1535 it.alpha = 1.0f } } @@ -143,6 +146,9 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene tvTakeOverReason = mFloatLayout.findViewById(R.id.tvTakeOverReason) etNoteInput = mFloatLayout.findViewById(R.id.etNoteInput) ivNoteAudio = mFloatLayout.findViewById(R.id.ivNoteAudio) + ivFrontCamera = mFloatLayout.findViewById(R.id.ivFrontCamera) + ivRearCamera = mFloatLayout.findViewById(R.id.ivRearCamera) + ivMapScreen = mFloatLayout.findViewById(R.id.ivMapScreen) tvTakeOverSave = mFloatLayout.findViewById(R.id.tvTakeOverSave) tvTakeOverCancel = mFloatLayout.findViewById(R.id.tvTakeOverCancel) rvTakeOverList = mFloatLayout.findViewById(R.id.rvTakeOverList) @@ -316,6 +322,13 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene } } + private fun showSceneWindow(frontCameraUri: Uri,rearCameraUri: Uri,mapScreenUri: Uri,currentItem: Int){ + if(takeOverSceneWindow == null){ + takeOverSceneWindow = TakeOverSceneWindow(mActivity) + } + takeOverSceneWindow?.showFloatWindow(frontCameraUri,rearCameraUri,mapScreenUri,currentItem) + } + private fun setAudio(status: Boolean){ if(status){ //开始录音 @@ -417,25 +430,6 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene @SuppressLint("ClickableViewAccessibility") override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { -// when (motionEvent?.action) { -// MotionEvent.ACTION_DOWN -> { -// // 获取相对View的坐标,即以此View左上角为原点 -// mInViewX = motionEvent.x -// mInViewY = motionEvent.y -// // 获取相对屏幕的坐标,即以屏幕左上角为原点 -// mInScreenX = motionEvent.rawX -// mInScreenY = motionEvent.rawY -// } -// MotionEvent.ACTION_MOVE -> { -// // 更新浮动窗口位置参数 -// mInScreenX = motionEvent.rawX -// mInScreenY = motionEvent.rawY -// mWindowParams!!.x = (mInScreenX - mInViewX).toInt() -// mWindowParams!!.y = (mInScreenY - mInViewY).toInt() -// // 手指移动的时候更新小悬浮窗的位置 -// mWindowManager!!.updateViewLayout(mFloatLayout, mWindowParams) -// } -// } return true } @@ -457,6 +451,46 @@ class TakeOverReasonWindow constructor(activity: Activity) : View.OnTouchListene tvTakeOverTime.text = mActivity.resources.getString(R.string.take_over_time) + millis2String(mTakeOverRecordInfo.faultStartTime, TimeUtils.getHourMinSecondFormat()) } + //展示前向摄像头 + val frontCameraPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "FrontCamera" + File.separator + millis2String( + System.currentTimeMillis(), + getMdFormat() + ) + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val frontCameraUri = Uri.parse(frontCameraPath) + ivFrontCamera.setImageURI(frontCameraUri) + //展示后向摄像头 + val rearCameraPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "RearCamera" + File.separator + millis2String( + System.currentTimeMillis(), + getMdFormat() + ) + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val rearCameraUri = Uri.parse(rearCameraPath) + ivRearCamera.setImageURI(rearCameraUri) + //展示高精地图截图 + val mapScreenPath: String = ((Environment.getExternalStorageDirectory() + .absolutePath + File.separator) + + "MapScreen" + File.separator + millis2String( + System.currentTimeMillis(), + getMdFormat() + ) + File.separator + mTakeOverRecordInfo.bagId) + ".png" + val mapScreenUri = Uri.parse(mapScreenPath) + ivMapScreen.setImageURI(mapScreenUri) + + //前向120°摄像头 + ivFrontCamera.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,0) + } + //后向120°摄像头 + ivRearCamera.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,1) + } + //高精地图截图 + ivMapScreen.setOnClickListener { + showSceneWindow(frontCameraUri,rearCameraUri,mapScreenUri,2) + } setWindowShowStatus(true) } diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt new file mode 100644 index 0000000000..c8e271919e --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt @@ -0,0 +1,102 @@ +package com.zhjt.mogo_core_function_devatools.workorder + +import android.annotation.SuppressLint +import android.app.Activity +import android.graphics.PixelFormat +import android.net.Uri +import android.util.DisplayMetrics +import android.view.Gravity +import android.view.LayoutInflater +import android.view.View +import android.view.WindowManager +import android.widget.ImageView +import androidx.viewpager.widget.ViewPager +import com.mogo.eagle.core.utilcode.util.BarUtils +import com.zhjt.mogo_core_function_devatools.R +import com.zhjt.mogo_core_function_devatools.workorder.adapter.TakeOverSceneAdapter + +/** + * 场景图像查看窗口 + */ +class TakeOverSceneWindow constructor(activity: Activity) { + + companion object{ + const val TAG = "TakeOverSceneWindow" + } + + private var mActivity: Activity = activity + private var mWindowParams: WindowManager.LayoutParams? = null + private var mWindowManager: WindowManager? = null + private lateinit var mFloatLayout: View + private lateinit var vpSceneImage: ViewPager + private lateinit var ivSceneClose: ImageView + private lateinit var ivScenePrevious: ImageView + private lateinit var ivSceneNext: ImageView + private val takeOverSceneAdapter = TakeOverSceneAdapter() + + init { + initFloatWindow() + } + + private fun initFloatWindow(){ + mFloatLayout = LayoutInflater.from(mActivity).inflate(R.layout.view_take_over_scene, null) as View + initView() + initEvent() + mWindowParams = WindowManager.LayoutParams() + mWindowManager = mActivity.windowManager + mWindowParams?.let { + it.format = PixelFormat.RGBA_8888 + it.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE + it.gravity = Gravity.START or Gravity.TOP + it.width = WindowManager.LayoutParams.MATCH_PARENT + it.height = 1535 + it.alpha = 1.0f + } + } + + private fun initView(){ + vpSceneImage = mFloatLayout.findViewById(R.id.vpSceneImage) + ivSceneClose = mFloatLayout.findViewById(R.id.ivSceneClose) + ivScenePrevious = mFloatLayout.findViewById(R.id.ivScenePrevious) + ivSceneNext = mFloatLayout.findViewById(R.id.ivSceneNext) + } + + private fun initEvent(){ + var currentIndex = 0 + vpSceneImage.adapter =takeOverSceneAdapter + //关闭弹窗 + ivSceneClose.setOnClickListener { + hideFloatWindow() + } + //前一个场景 + ivScenePrevious.setOnClickListener { + currentIndex = (currentIndex-1).coerceAtLeast(0) + vpSceneImage.currentItem = currentIndex + } + //后一个场景 + ivSceneNext.setOnClickListener { + currentIndex = (currentIndex + 1).coerceAtMost(2) + vpSceneImage.currentItem = currentIndex + } + } + + @SuppressLint("SetTextI18n") + fun showFloatWindow(frontCameraUri: Uri, rearCameraUri: Uri, mapScreenUri: Uri, currentItem: Int) { + if (mFloatLayout.parent == null) { + val metrics = DisplayMetrics() + // 默认固定位置,靠屏幕右边缘的中间 + mWindowManager!!.defaultDisplay.getMetrics(metrics) + mWindowParams!!.x = 0 + mWindowParams!!.y = metrics.heightPixels - BarUtils.getStatusBarHeight() + mWindowManager!!.addView(mFloatLayout, mWindowParams) + takeOverSceneAdapter.setSceneUri(frontCameraUri, rearCameraUri, mapScreenUri) + } + } + + fun hideFloatWindow() { + if (mFloatLayout.parent != null){ + mWindowManager!!.removeView(mFloatLayout) + } + } + +} \ 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/workorder/adapter/TakeOverSceneAdapter.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt new file mode 100644 index 0000000000..f02a37b97b --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt @@ -0,0 +1,69 @@ +package com.zhjt.mogo_core_function_devatools.workorder.adapter + +import android.net.Uri +import android.os.Environment +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.ImageView +import android.widget.TextView +import androidx.viewpager.widget.PagerAdapter +import com.mogo.eagle.core.utilcode.util.TimeUtils.getMdFormat +import com.mogo.eagle.core.utilcode.util.TimeUtils.millis2String +import com.zhjt.mogo_core_function_devatools.R +import java.io.File + + +class TakeOverSceneAdapter: PagerAdapter() { + + private lateinit var mFrontCameraUri: Uri + private lateinit var mRearCameraUri: Uri + private lateinit var mMapScreenUri: Uri + + fun setSceneUri(frontCameraUri: Uri,rearCameraUri: Uri,mapScreenUri: Uri){ + mFrontCameraUri = frontCameraUri + mRearCameraUri = rearCameraUri + mMapScreenUri = mapScreenUri + } + + // 获取要滑动的控件的数量 + override fun getCount(): Int { + return 3 + } + + // 来判断显示的是否是同一张图片,这里我们将两个参数相比较返回即可 + override fun isViewFromObject(view: View, `object`: Any): Boolean { + return view == `object` + } + + // 当要显示的图片可以进行缓存的时候,会调用这个方法进行显示图片的初始化, + // 我们将要显示的ImageView加入到ViewGroup中,然后作为返回值返回即可 + override fun instantiateItem(container: ViewGroup, position: Int): Any { + val inflater = LayoutInflater.from(container.context) + val view = inflater.inflate(R.layout.layout_scene_pager,container,false) + val sceneName: TextView = view.findViewById(R.id.tvSceneName) + val ivSceneImage: ImageView = view.findViewById(R.id.ivSceneImage) + when (position) { + 0 -> { + sceneName.text = container.resources.getString(R.string.take_over_front_camera) + ivSceneImage.setImageURI(mFrontCameraUri) + } + 1 -> { + sceneName.text = container.resources.getString(R.string.take_over_rear_camera) + ivSceneImage.setImageURI(mRearCameraUri) + } + else -> { + sceneName.text = container.resources.getString(R.string.take_over_map_screen) + ivSceneImage.setImageURI(mMapScreenUri) + } + } + container.addView(view) + return view + } + + // PagerAdapter只缓存三张要显示的图片,如果滑动的图片超出了缓存的范围,就会调用这个方法,将图片销毁 + override fun destroyItem(container: ViewGroup, position: Int, `object`: Any) { + container.removeView(`object` as View) + } + +} \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png new file mode 100644 index 0000000000..84513b5885 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png new file mode 100644 index 0000000000..ad46b155c6 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png new file mode 100644 index 0000000000..b9c0a12a09 Binary files /dev/null and b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png differ diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml new file mode 100644 index 0000000000..dd0222ad49 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml new file mode 100644 index 0000000000..d0dc4eebd0 --- /dev/null +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml @@ -0,0 +1,26 @@ + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml index 2735fe0efb..70ad990d8d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_reason.xml @@ -145,6 +145,111 @@ android:contentDescription="@string/take_over_note_audio" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml index ba13a4df93..42e32d54ed 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml +++ b/core/function-impl/mogo-core-function-devatools/src/main/res/values/strings.xml @@ -66,6 +66,13 @@ (选填) 手动输入 补充描述语音输入 + 场景图像 + 前向120°摄像头 + 后向120°摄像头 + 高精地图截图 + 上一个场景 + 关闭场景 + 下一个场景 上报 保存 取消