From b12c487174c44e7df274be0ffa579701a82e3df7 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Mon, 27 Jan 2025 17:56:46 +0800 Subject: [PATCH] =?UTF-8?q?[6.10.0]=E6=8E=A5=E7=AE=A1=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E5=B7=A5=E5=85=B7=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../badcase/BadCaseManager.kt | 17 +-- .../workorder/TakeOverReasonWindow.kt | 86 +++++++++----- .../workorder/TakeOverSceneWindow.kt | 102 +++++++++++++++++ .../workorder/adapter/TakeOverSceneAdapter.kt | 69 ++++++++++++ .../res/drawable-xhdpi/icon_scene_close.png | Bin 0 -> 8485 bytes .../res/drawable-xhdpi/icon_scene_left.png | Bin 0 -> 8361 bytes .../res/drawable-xhdpi/icon_scene_right.png | Bin 0 -> 8277 bytes .../src/main/res/drawable/bg_scene_name.xml | 10 ++ .../main/res/layout/layout_scene_pager.xml | 26 +++++ .../main/res/layout/view_take_over_reason.xml | 105 ++++++++++++++++++ .../main/res/layout/view_take_over_scene.xml | 49 ++++++++ .../src/main/res/values/strings.xml | 7 ++ 12 files changed, 434 insertions(+), 37 deletions(-) create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/TakeOverSceneWindow.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/workorder/adapter/TakeOverSceneAdapter.kt create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_close.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_left.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable-xhdpi/icon_scene_right.png create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/drawable/bg_scene_name.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/layout_scene_pager.xml create mode 100644 core/function-impl/mogo-core-function-devatools/src/main/res/layout/view_take_over_scene.xml 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 0000000000000000000000000000000000000000..84513b588538785ca05fc113841d256d861cfd79 GIT binary patch literal 8485 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 a3NXec_zDAM_x<;af|`n!a<$@{PyYpeBPSaG literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..ad46b155c6f07209ec31d9ba37ee9b858c0af3c3 GIT binary patch literal 8361 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 literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..b9c0a12a0921678d4f780c8ed60962e588b466d0 GIT binary patch literal 8277 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 K%HI_&1OE%P5W&g- literal 0 HcmV?d00001 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°摄像头 + 高精地图截图 + 上一个场景 + 关闭场景 + 下一个场景 上报 保存 取消