Merge branch 'dev_robotaxi-d_241112_6.8.0' of gitlab.zhidaoauto.com:SCA/L4HA/AndroidApp/MoGoEagleEye into dev_robotaxi-d_241112_6.8.0

This commit is contained in:
xinfengkun
2024-11-20 17:23:21 +08:00
131 changed files with 3859 additions and 4522 deletions

View File

@@ -24,6 +24,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerV2nNioEventListenerMana
import com.mogo.eagle.core.function.call.cloud.CallerCloudListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.och.CallerOchBizFunctionCall4EagleManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
@@ -178,6 +179,7 @@ class TeleMsgHandler : IMsgHandler {
// 10: 第1个1代表运营面板开关打开第2个0代表打开成功告之司机端
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "11".toByteArray())
}
CallerOchBizFunctionCall4EagleManager.setVideoView(target)
} else {
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "10".toByteArray())
@@ -185,6 +187,7 @@ class TeleMsgHandler : IMsgHandler {
} else {
//第1个0代表运营面板开关关闭第2个1代表关闭成功告之司机端; 相应的还有状态00表示关闭失败
CallerTelematicManager.sendMsgToServer(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_RSP, "01".toByteArray())
CallerOchBizFunctionCall4EagleManager.setVideoView(null)
}
} catch (t: Throwable) {
t.printStackTrace()

View File

@@ -2,7 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.animation.ObjectAnimator
import android.animation.ValueAnimator
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.net.ConnectivityManager
import android.os.CountDownTimer
import android.text.TextUtils
import android.util.AttributeSet
@@ -32,20 +36,21 @@ import kotlinx.android.synthetic.main.view_cold_start.view.ivColdStartStatus
import kotlinx.android.synthetic.main.view_cold_start.view.ivIpcConnectStatus
import kotlinx.android.synthetic.main.view_cold_start.view.ivNodeListMask
import kotlinx.android.synthetic.main.view_cold_start.view.ivSsmConnectStatus
import kotlinx.android.synthetic.main.view_cold_start.view.ivWifiConnectStatus
import kotlinx.android.synthetic.main.view_cold_start.view.rvNodeList
import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvColdStartNow
import kotlinx.android.synthetic.main.view_cold_start.view.tvIpcConnectContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvSsmConnectContent
import kotlinx.android.synthetic.main.view_cold_start.view.tvSystemStartupTitle
import kotlinx.android.synthetic.main.view_cold_start.view.viewColdStartDivider
import kotlinx.android.synthetic.main.view_cold_start.view.viewSsmConnectDivider
import kotlinx.android.synthetic.main.view_cold_start.view.tvWifiConnectContent
import system_master.SsmInfo
import system_master.SystemStatusInfo
import java.util.Locale
import java.util.regex.Matcher
import java.util.regex.Pattern
/**
* 冷启动呈现二期
* 前置展示冷启动过程和结果
@@ -63,12 +68,15 @@ class ColdStartView @JvmOverloads constructor(
const val COLD_START_WAITING_TIME = 600000L //冷启动超时等待时间
}
private var wifiConnectStatus = false //WIFI连接状态默认是未连接
private var ipcConnectStatus = false //连接域控状态,默认是未连接
private var ssmConnectStatus = false //SSM连接状态默认是未连接
private var coldStartStatus = false //冷启动状态,默认是未冷启动成功
private var currentColdStartSuccess = false //冷启动成功状态,也是成功后动画完成状态
private var wifiRotationAnim: ObjectAnimator?= null //WIFI连接状态动画
private var ipcRotationAnim: ObjectAnimator?= null //域控连接状态动画
private var ssmRotationAnim: ObjectAnimator?= null //SSM连接状态动画
@@ -117,6 +125,11 @@ class ColdStartView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
// 注册广播接收器
val intentFilter = IntentFilter()
intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
context.applicationContext.registerReceiver(networkStateReceiver, intentFilter)
showWifiConnecting()
CallerAutoPilotStatusListenerManager.addListener(TAG, this)
CallerColdStartStateListenerManager.addListener(TAG,this)
}
@@ -125,24 +138,30 @@ class ColdStartView @JvmOverloads constructor(
super.onDetachedFromWindow()
CallerAutoPilotStatusListenerManager.removeListener(TAG)
CallerColdStartStateListenerManager.removeListener(TAG)
wifiRotationAnim?.cancel()
ipcRotationAnim?.cancel()
ssmRotationAnim?.cancel()
connectSSMTimer?.cancel()
coldStartRotationAnim?.cancel()
connectColdStartTimer?.cancel()
// 取消注册广播接收器
context.applicationContext.unregisterReceiver(networkStateReceiver)
}
override fun onAutopilotIpcConnectStatusChanged(
status: AdasConstants.IpcConnectionStatus,
reason: String?
){
ipcConnectStatus = status == AdasConstants.IpcConnectionStatus.CONNECTED
if(!wifiConnectStatus){
return
}
ThreadUtils.runOnUiThread {
ipcConnectStatus = if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
if(status == AdasConstants.IpcConnectionStatus.CONNECTED){
//域控连接成功
if(!ipcConnectStatus){
if(ipcConnectStatus){
showIPCConnectSuccessView()
}
true
}else{
//域控连接失败
when(status){
@@ -206,8 +225,6 @@ class ColdStartView @JvmOverloads constructor(
/**
* 状态查询应答
* @param status 数据
@@ -331,6 +348,28 @@ class ColdStartView @JvmOverloads constructor(
}
}
private val networkStateReceiver: BroadcastReceiver = object: BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
if (intent!!.action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
val connectivityManager =
context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkInfo = connectivityManager.activeNetworkInfo
ThreadUtils.runOnUiThread {
if (networkInfo != null && networkInfo.isConnected) {
// 网络连接可用
connectWifiSuccess()
} else {
// 网络连接不可用
showWifiConnecting()
}
}
}
}
}
/**
* 冷启动状态
*/
@@ -392,12 +431,12 @@ class ColdStartView @JvmOverloads constructor(
ipcRotationAnim?.cancel()
ivIpcConnectStatus.rotation = 0f
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_wait)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white))
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_success)
//开启连接SSM倒计时
connectSSMProcess()
//域控连接成功后开始展示SSM连接状态
viewSsmConnectDivider.visibility = View.VISIBLE
ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
//旋转动画
if(ssmRotationAnim == null){
@@ -411,13 +450,7 @@ class ColdStartView @JvmOverloads constructor(
//设置SSM连接文案为连接中
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_loading)
tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, android.R.color.white))
viewSsmConnectDivider.visibility = View.VISIBLE
ivSsmConnectStatus.visibility = View.VISIBLE
tvSsmConnectContent.visibility = View.VISIBLE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
rvNodeList.visibility = View.GONE
ivNodeListMask.visibility = View.GONE
//域控连接成功埋点统计
@@ -434,6 +467,7 @@ class ColdStartView @JvmOverloads constructor(
*/
private fun showIPCConnectFailView(failReason: String?){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_exception)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail))
if(tvIpcConnectContent.text.isNotEmpty() && tvIpcConnectContent.text.equals(failReason)){
return
}
@@ -443,14 +477,7 @@ class ColdStartView @JvmOverloads constructor(
failReason?.let {
tvIpcConnectContent.text = it
}
//隐藏SSM相关视图
viewSsmConnectDivider.visibility = View.GONE
ivSsmConnectStatus.visibility = View.GONE
tvSsmConnectContent.visibility = View.GONE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
rvNodeList.visibility = View.GONE
ivNodeListMask.visibility = View.GONE
//域控连接失败埋点统计
@@ -462,8 +489,75 @@ class ColdStartView @JvmOverloads constructor(
newColdStart = false
}
/**
* 等待网络连接
*/
private fun showWifiConnecting(){
wifiConnectStatus = false
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_wifi_wait)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white))
ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_loading)
if(wifiRotationAnim == null){
wifiRotationAnim = ObjectAnimator.ofFloat(ivWifiConnectStatus, "rotation", 0f, 360f)
}
wifiRotationAnim?.repeatCount = ValueAnimator.INFINITE
wifiRotationAnim?.repeatMode = ValueAnimator.RESTART
wifiRotationAnim?.duration = 1500
wifiRotationAnim?.interpolator = LinearInterpolator()
wifiRotationAnim?.start()
//动画和计时器重置
ipcRotationAnim?.cancel()
ivIpcConnectStatus.rotation = 0f
ssmRotationAnim?.cancel()
ivSsmConnectStatus.rotation = 0f
connectSSMTimer?.cancel()
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
connectColdStartTimer?.cancel()
//域控连接状态展示
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait))
tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_wait)
//SSM连接状态展示
ivSsmConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait))
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_wait)
//冷启动节点状态展示
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_wait))
tvColdStartContent.text = resources.getString(R.string.cold_start_wait)
//隐藏Topic列表
rvNodeList.visibility = View.GONE
ivNodeListMask.visibility = View.GONE
ipcConnectStatus = false
}
private fun connectWifiSuccess(){
wifiConnectStatus = true
wifiRotationAnim?.cancel()
ivWifiConnectStatus.rotation = 0f
ivWifiConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))
tvWifiConnectContent.text = resources.getString(R.string.wifi_connect_success)
//开始连接域控
tvIpcConnectContent.text = resources.getString(R.string.ipc_connect_loading)
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
if(ipcRotationAnim == null){
ipcRotationAnim = ObjectAnimator.ofFloat(ivIpcConnectStatus, "rotation", 0f, 360f)
}
ipcRotationAnim?.repeatCount = ValueAnimator.INFINITE
ipcRotationAnim?.repeatMode = ValueAnimator.RESTART
ipcRotationAnim?.duration = 1500
ipcRotationAnim?.interpolator = LinearInterpolator()
ipcRotationAnim?.start()
//隐藏冷启动相关视图
rvNodeList.visibility = View.GONE
ivNodeListMask.visibility = View.GONE
if(ipcConnectStatus){
showIPCConnectSuccessView()
}
}
private fun showIPCConnecting(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_tel_wait)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white))
ivIpcConnectStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_process))
tvIpcConnectContent.text = "正在重连域控..."
if(ipcRotationAnim == null){
@@ -474,14 +568,7 @@ class ColdStartView @JvmOverloads constructor(
ipcRotationAnim?.duration = 1500
ipcRotationAnim?.interpolator = LinearInterpolator()
ipcRotationAnim?.start()
//隐藏SSM相关视图
viewSsmConnectDivider.visibility = View.GONE
ivSsmConnectStatus.visibility = View.GONE
tvSsmConnectContent.visibility = View.GONE
//隐藏冷启动相关视图
viewColdStartDivider.visibility = View.GONE
ivColdStartStatus.visibility = View.GONE
tvColdStartContent.visibility = View.GONE
rvNodeList.visibility = View.GONE
ivNodeListMask.visibility = View.GONE
}
@@ -508,6 +595,7 @@ class ColdStartView @JvmOverloads constructor(
*/
private fun showSSMConnectSuccessView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_wait)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white))
//取消旋转动画
ssmRotationAnim?.cancel()
//取消连接SSM超时等待倒计时
@@ -518,9 +606,6 @@ class ColdStartView @JvmOverloads constructor(
tvSsmConnectContent.text = resources.getString(R.string.ssm_connect_success)
tvSsmConnectContent.setTextColor(ContextCompat.getColor(context, R.color.white))
//展示冷启动连接过程视图
viewColdStartDivider.visibility = View.VISIBLE
ivColdStartStatus.visibility = View.VISIBLE
tvColdStartContent.visibility = View.VISIBLE
rvNodeList.visibility = View.VISIBLE
ivNodeListMask.visibility = View.VISIBLE
tvColdStartContent.text = "启动中…"
@@ -541,6 +626,7 @@ class ColdStartView @JvmOverloads constructor(
*/
private fun showSSMConnectFailView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_ssm_exception)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail))
//取消旋转动画
ssmRotationAnim?.cancel()
ivSsmConnectStatus.rotation = 0f
@@ -606,6 +692,7 @@ class ColdStartView @JvmOverloads constructor(
*/
private fun showColdStartFailView(){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_exception)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.cold_start_fail))
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_fail))
@@ -619,6 +706,7 @@ class ColdStartView @JvmOverloads constructor(
private fun showColdStartSuccessView(){
if(coldStartStatus){
tvSystemStartupTitle.text = resources.getString(R.string.cold_start_title_sys_success)
tvSystemStartupTitle.setTextColor(ContextCompat.getColor(context, R.color.white))
coldStartRotationAnim?.cancel()
ivColdStartStatus.rotation = 0f
ivColdStartStatus.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_cold_start_success))

View File

@@ -401,7 +401,7 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
if (!isFirst) {
if (reasong.isNotEmpty()) {
val substring = reasong.substring(0, reasong.length - 2)
val substring = reasong.substring(0, reasong.length - 1)
PermissionsDialogUtils.openAppDetails(this, substring, REQUEST_CODE_DIALOG)
}else {
PermissionsDialogUtils.openAppDetails(this, null, REQUEST_CODE_DIALOG)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 939 B

After

Width:  |  Height:  |  Size: 954 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -20,15 +20,49 @@
/>
<ImageView
android:id="@+id/ivIpcConnectStatus"
android:id="@+id/ivWifiConnectStatus"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/tvSystemStartupTitle"
app:layout_constraintLeft_toLeftOf="@id/tvSystemStartupTitle"
android:contentDescription="@string/ipc_connect_icon"
android:contentDescription="@string/wifi_connect_icon"
android:layout_marginTop="@dimen/dp_50"
/>
<TextView
android:id="@+id/tvWifiConnectContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/ivWifiConnectStatus"
app:layout_constraintBottom_toBottomOf="@id/ivWifiConnectStatus"
app:layout_constraintLeft_toRightOf="@id/ivWifiConnectStatus"
android:textSize="@dimen/sp_36"
android:textColor="@color/white"
android:layout_marginStart="@dimen/dp_15"
android:text="@string/wifi_connect_loading"
/>
<View
android:id="@+id/viewWifiConnectDivider"
android:layout_width="@dimen/dp_4"
android:layout_height="@dimen/dp_26"
app:layout_constraintLeft_toLeftOf="@id/ivWifiConnectStatus"
app:layout_constraintRight_toRightOf="@id/ivWifiConnectStatus"
app:layout_constraintTop_toBottomOf="@id/ivWifiConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
/>
<ImageView
android:id="@+id/ivIpcConnectStatus"
android:layout_width="@dimen/dp_40"
android:layout_height="@dimen/dp_40"
app:layout_constraintTop_toBottomOf="@id/viewWifiConnectDivider"
app:layout_constraintLeft_toLeftOf="@id/ivWifiConnectStatus"
android:contentDescription="@string/ipc_connect_icon"
android:layout_marginTop="@dimen/dp_5"
/>
<TextView
android:id="@+id/tvIpcConnectContent"
android:layout_width="wrap_content"
@@ -50,7 +84,6 @@
app:layout_constraintTop_toBottomOf="@id/ivIpcConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
android:visibility="invisible"
/>
<ImageView
@@ -85,7 +118,6 @@
app:layout_constraintTop_toBottomOf="@id/ivSsmConnectStatus"
android:layout_marginTop="@dimen/dp_5"
android:background="@drawable/bg_cold_start_divider"
android:visibility="invisible"
/>
<ImageView

View File

@@ -92,6 +92,6 @@
<color name="auto_exploration_content_p">#131415</color>
<color name="cold_start_fail">#FFCD3D</color>
<color name="cold_start_fail">#FF4E41</color>
</resources>

View File

@@ -213,19 +213,27 @@
<string name="traffic_light_source">红绿灯信号来源</string>
<string name="report_success">已发起上报</string>
<string name="wifi_connect_icon">Wifi连接状态图标</string>
<string name="ipc_connect_icon">域控连接状态图标</string>
<string name="ssm_connect_icon">SSM连接状态图标</string>
<string name="cold_start_icon">冷启动状态图标</string>
<string name="wifi_connect_loading">等待连接车辆WiFi…</string>
<string name="wifi_connect_success">已连接车辆Wi-Fi</string>
<string name="ipc_connect_wait">待连接域控</string>
<string name="ipc_connect_loading">连接域控…</string>
<string name="ipc_connect_success">已连接域控</string>
<string name="cold_start_in_progress_title">系统启动中…</string>
<string name="cold_start_success_title">系统启动成功</string>
<string name="cold_start_fail_title">系统启动失败</string>
<string name="ssm_connect_wait">待连接SSM</string>
<string name="ssm_connect_loading">正在等待SSM信息</string>
<string name="ssm_connect_success">与SSM通信正常</string>
<string name="ssm_connect_fail">超时未收到SSM信息建议重启车辆并上报问题</string>
<string name="cold_start_wait">待启动</string>
<string name="cold_start_success_content">系统启动成功,即将进入主页</string>
<string name="cold_start_fail_content">系统启动异常,建议上报问题,可尝试重启车辆</string>
<string name="cold_start_title_wifi_wait">等待车辆上电</string>
<string name="cold_start_title_tel_wait">等待连接域控</string>
<string name="cold_start_title_tel_exception">连接域控异常,持续重试中</string>
<string name="cold_start_title_ssm_wait">等待SSM信息</string>

View File

@@ -1699,20 +1699,22 @@ class TravelRealityView @JvmOverloads constructor(
super.invokeOchInfo(ochInfo)
Log.d(TAG, "invokeOchInfo$ochInfo")
if (ochInfo.type == 0) {
val locList = ochInfo.latLonList
if (locList.isEmpty() || locList.size < 2) {
mStartLatLng = null
mEndLatLng = null
UiThreadHandler.post {
hideStartEndMarker()
val locationList = ochInfo.latLonList
locationList?.let { locList->
if (locList.isEmpty() || locList.size < 2) {
mStartLatLng = null
mEndLatLng = null
UiThreadHandler.post {
hideStartEndMarker()
}
} else {
// 设置开始结束Marker位置
mStartLatLng = LatLng(locList[0].latitude, locList[0].longitude)
mEndLatLng = LatLng(locList[1].latitude, locList[1].longitude)
}
if (!isPlayingAnim) {
drawStartAndEnd()
}
} else {
// 设置开始结束Marker位置
mStartLatLng = LatLng(locList[0].latitude, locList[0].longitude)
mEndLatLng = LatLng(locList[1].latitude, locList[1].longitude)
}
if (!isPlayingAnim) {
drawStartAndEnd()
}
}
}