Merge branch 'release_robotaxi-d_231031_6.2.0.2' into 6.2.0_merge_master

# Conflicts:
#	OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/fragment/BaseSweeperCloudTabFragment.java
#	OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/cloud/model/SweeperCloudTaskModel.java
#	OCH/sweeper/driver/src/main/java/com/mogo/och/sweeper/operate/model/SweeperOperateTaskModel.java
#	OCH/sweeper/sweeper/build.gradle
#	OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/SweeperProvider.java
#	OCH/sweeper/sweeper/src/main/java/com/mogo/och/sweeper/view/BusArcView.java
#	app/script/functions/och.gradle
#	app/src/main/java/com/mogo/launcher/startup/ConfigStartUp.kt
#	core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/SOPSettingView.kt
#	core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_sop_setting.xml
#	core/function-impl/mogo-core-function-hmi/src/main/res/values/strings.xml
#	core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/config/FunctionBuildConfig.kt
This commit is contained in:
yangyakun
2023-12-04 11:01:17 +08:00
1322 changed files with 15039 additions and 15346 deletions

View File

@@ -54,14 +54,13 @@
-->
<activity
android:name="com.mogo.eagle.core.function.main.MainLauncherActivity"
android:clearTaskOnLaunch="${ACTIVITY_ROOT}"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize"
android:enabled="true"
android:hardwareAccelerated="true"
android:launchMode="singleTask"
android:resizeableActivity="false"
android:screenOrientation="landscape"
android:resumeWhilePausing="true"
android:screenOrientation="${SCREEN_ORIENTATION}"
android:stateNotNeeded="true"
android:theme="@style/Main"
android:windowSoftInputMode="adjustPan|stateHidden">
@@ -97,21 +96,6 @@
</activity>
<!-- <activity-->
<!-- android:name="com.mogo.eagle.core.function.main.VideoAdAtc"-->
<!-- android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|screenLayout|fontScale|uiMode|orientation|screenSize|smallestScreenSize"-->
<!-- android:enabled="true"-->
<!-- android:exported="true"-->
<!-- android:process=":video_ad"-->
<!-- android:resizeableActivity="false"-->
<!-- android:resumeWhilePausing="true"-->
<!-- android:screenOrientation="landscape"-->
<!-- android:stateNotNeeded="true"-->
<!-- android:theme="@style/Main"-->
<!-- android:windowSoftInputMode="adjustPan|stateHidden">-->
<!-- </activity>-->
<activity
android:name="com.mogo.eagle.core.function.main.AppListActivity"
android:exported="true"
@@ -122,10 +106,6 @@
<!-- </intent-filter>-->
</activity>
<meta-data
android:name="MAP_SDK_VERSION111111"
android:value="${MAP_SDK_VERSION}" />
<receiver android:name="com.mogo.eagle.core.function.hmi.receiver.V2XWarningBroadcastReceiver">
<intent-filter>
<action android:name="com.hmi.v2x.notification" />

View File

@@ -3,11 +3,12 @@ package com.mogo.eagle.core.function.hmi.notification.anim
import android.animation.Animator
import android.animation.ValueAnimator
import android.graphics.Rect
import android.util.Log
import android.view.View
import android.view.WindowManager
import com.mogo.eagle.core.data.enums.SidePattern
import com.mogo.eagle.core.function.hmi.notification.interfaces.OnFloatAnimator
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.BarUtils
import kotlin.math.min
@@ -52,7 +53,7 @@ open class DefaultAnimator : OnFloatAnimator {
windowManager.updateViewLayout(view, params)
} catch (e: Exception) {
cancel()
Log.i("DebugViewSwitchLog", "执行动画异常,异常原因:"+e)
CallerLogger.i(M_HMI + "DebugViewSwitchLog", "执行动画异常,异常原因:$e")
}
}
}

View File

@@ -3,12 +3,9 @@ package com.mogo.eagle.core.function.hmi.receiver
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.biz.notice.NoticeNormalData
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.utilcode.util.SharedPrefs
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
/**
* 用于普通云公告的测试
@@ -24,23 +21,25 @@ class NoticeNormalBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
try {
// 分发场景
dispatchShowWaring("11", "官方公告", "测试普通云公告普通云公告普通云公告普通云公告普通云公告普通云公告普通云公告哈哈哈哈哈哈好好",
"https://dataservice-1255510688.cos.ap-beijing.myqcloud.com/carImg/yycp_NoticeDETAIL_location.png",
"https://vd2.bdstatic.com/mda-mk1347dzxdmcre0y/sc/cae_h264/1635819498112313003/mda-mk1347dzxdmcre0y.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1635837585-0-0-5295f6658c7711ba7b4d3ef478a7fbaa&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=",
2)
SharedPrefs.getInstance(context).putInt("videoType", 1)
dispatchShowWaring(
"11", "官方公告", "测试普通云公告普通云公告普通云公告普通云公告普通云公告普通云公告普通云公告哈哈哈哈哈哈好好",
"https://dataservice-1255510688.cos.ap-beijing.myqcloud.com/carImg/yycp_NoticeDETAIL_location.png",
"https://vd2.bdstatic.com/mda-mk1347dzxdmcre0y/sc/cae_h264/1635819498112313003/mda-mk1347dzxdmcre0y.mp4?v_from_s=hkapp-haokan-tucheng&auth_key=1635837585-0-0-5295f6658c7711ba7b4d3ef478a7fbaa&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=",
2
)
SharedPrefsMgr.getInstance(context).putInt("videoType", 1)
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun dispatchShowWaring(
id: String,
titleTv: String,
contentTv: String,
imageUrl: String,
videoUrl: String,
fileType: Int
id: String,
titleTv: String,
contentTv: String,
imageUrl: String,
videoUrl: String,
fileType: Int
) {
val data = NoticeNormalData()

View File

@@ -2,13 +2,11 @@ package com.mogo.eagle.core.function.hmi.ui
import android.content.Context
import android.text.TextUtils
import android.util.*
import android.view.*
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.lifecycle.lifecycleScope
import com.alibaba.android.arouter.facade.annotation.Route
import com.mogo.commons.voice.AIAssist
import com.mogo.commons.voice.IMogoVoiceCmdCallBack
import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.constants.MogoServicePaths.PATH_FRAGMENT_HMI
@@ -39,7 +37,6 @@ import com.mogo.eagle.core.function.hmi.ui.tools.ModifyBindingCarDialog
import com.mogo.eagle.core.function.hmi.ui.tools.ToBindingCarDialog
import com.mogo.eagle.core.function.hmi.ui.tools.UpgradeAppDialog
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog
import com.mogo.eagle.core.function.hmi.ui.vehicle.TurnLightViewStatus
import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView
import com.mogo.eagle.core.utilcode.floating.*
import com.mogo.eagle.core.utilcode.kotlin.safeCancel
@@ -47,9 +44,10 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.*
import com.mogo.tts.base.IMogoTTSCallback
import com.zhjt.service_biz.BizConfig
import kotlinx.coroutines.*
import kotlinx.coroutines.selects.*
import java.util.concurrent.atomic.AtomicBoolean
import java.util.concurrent.atomic.AtomicReference
/**
@@ -64,7 +62,6 @@ class MoGoHmiProvider : IMoGoHmiProvider {
private const val TAG = "MoGoHmiProvider"
}
private val lastSpeakJob by lazy { AtomicReference<Job>() }
private var lastShowV2XJob: Job? = null
private var context: Context? = null
@@ -73,7 +70,8 @@ class MoGoHmiProvider : IMoGoHmiProvider {
*/
private val lookAround by lazy { AtomicReference<MoGoPopWindow>() }
private val scope by lazy { CoroutineScope(Dispatchers.Default + SupervisorJob()) }
private val isPlayingTts by lazy { AtomicBoolean(false) }
override fun init(context: Context?) {
this.context = context
@@ -145,66 +143,27 @@ class MoGoHmiProvider : IMoGoHmiProvider {
}.invokeOnCompletion {
listener?.onDismiss()
}
Log.d("CODE", "---- 00 ------ tts_content: $ttsContent")
if (ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) {
val last = lastSpeakJob.get()
Log.d("CODE", "---- 0 ------: last: $last")
if (last != null && !last.isCompleted) {
Log.d("CODE", "---- 1 ------")
return
}
scope.launch {
Log.d("CODE", "---- 2 ------")
val d1 = async {
Log.d("CODE", "---- 2_1 start ------")
speak(it, ttsContent)
Log.d("CODE", "---- 2_1 end ------")
}
val d2 = async {
Log.d("CODE", "---- 2_2 start ------")
delay((305.75 * ttsContent.length).toLong())
Log.d("CODE", "---- 2_2 end ------")
}
val ret = select<Int> {
d1.onAwait { 1 }
d2.onAwait { 2 }
}
if (ret == 1) {
d2.cancel()
Log.d("CODE", "---- 3 ------")
} else {
d1.cancel()
Log.d("CODE", "---- 4 ------")
}
}.also { itx ->
lastSpeakJob.set(itx)
if (!isPlayingTts.get() && ttsContent != null && !TextUtils.isEmpty(ttsContent) && playTTS) {
context?.also {
AIAssist.getInstance(it).speakTTSVoiceWithLevel(ttsContent, AIAssist.LEVEL2, object : IMogoTTSCallback {
override fun onSpeakEnd(speakText: String?) {
super.onSpeakEnd(speakText)
isPlayingTts.set(false)
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
super.onSpeakError(speakText, errorMsg)
isPlayingTts.set(false)
}
})
isPlayingTts.set(true)
}
}
}
}
private suspend fun speak(ctx: Context, text: String) = suspendCancellableCoroutine<Unit> {
try {
val voiceCallback = object : IMogoVoiceCmdCallBack {
override fun onSpeakEnd(speakText: String?) {
super.onSpeakEnd(speakText)
it.resumeWith(Result.success(Unit))
}
override fun onSpeakError(speakText: String?, errorMsg: String?) {
super.onSpeakError(speakText, errorMsg)
it.resumeWith(Result.success(Unit))
}
}
it.invokeOnCancellation {
AIAssist.getInstance(ctx).stopSpeakTts(text)
}
AIAssist.getInstance(ctx).speakTTSVoiceWithLevel(text, AIAssist.LEVEL2, voiceCallback)
} catch (t: Throwable) {
it.resumeWith(Result.success(Unit))
CallerLogger.w("$M_HMI$TAG", t.message)
}
}
override fun showWarning(v2xType: String, direction: WarningDirectionEnum, expireTime: Long) {
//CallerV2XWarningListenerManager.show(v2xType, direction, expireTime)

View File

@@ -249,11 +249,7 @@ public class LogItemAdapter extends AbsRecyclerAdapter<AbsViewBinder<LogLine>, L
protected void publishResults(CharSequence constraint, FilterResults results) {
//noinspection unchecked
mList = (List<LogLine>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetChanged();
}
notifyDataSetChanged();
}
}
}

View File

@@ -25,6 +25,7 @@ public class LogLine {
"\\): ");
private static final String filterPattern = "ResourceType|memtrack|android.os.Debug|BufferItemConsumer|DPM.*|MDM.*|ChimeraUtils|BatteryExternalStats.*|chatty.*|DisplayPowerController|WidgetHelper|WearableService|DigitalWidget.*|^ANDR-PERF-.*";
private static final String failPattern = "(^maxLineHeight.*)|(Failed to read.*)";
private int logLevel;
private String tag;
private String logOutput;
@@ -57,7 +58,7 @@ public class LogLine {
char logLevelChar = matcher.group(1).charAt(0);
String logText = originalLine.substring(matcher.end());
if (logText.matches("^maxLineHeight.*|Failed to read.*")) {
if (logText.matches(failPattern)) {
logLine.setLogLevel(convertCharToLogLevel('V'));
} else {
logLine.setLogLevel(convertCharToLogLevel(logLevelChar));

View File

@@ -95,7 +95,6 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
handler.set(HandlerThread("look-around-drawer").let { it.start(); Handler(it.looper) })
}
handler.get()?.removeCallbacks(this)
handler.get()?.post(this)
isSurfaceValid = true
}
@@ -109,187 +108,171 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
}
override fun run() {
var isTimedBlock = false
if (!isSurfaceValid) {
return
}
if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) {
return
}
val data = this.data ?: return
val targetX = data.targetX
val targetY = data.targetY
val targetWidth = data.targetWidth
val targetHeight = data.targetHeight
val bitmapWidth = data.bitmapWidth
val bitmapHeight = data.bitmapHeight
val scaleX = this.surfaceWidth * 1.0f / bitmapWidth
val scaleY = this.surfaceHeight * 1.0f / bitmapHeight
val bytes = data.data ?: return
val canvas = holder.lockCanvas()
try {
if (!isSurfaceValid) {
isTimedBlock = true
if (canvas == null) {
return
}
if (this.surfaceWidth <= 0 || this.surfaceHeight <= 0) {
isTimedBlock = true
return
}
val data = this.data ?: return
val targetX = data.targetX
val targetY = data.targetY
val targetWidth = data.targetWidth
val targetHeight = data.targetHeight
val bitmapWidth = data.bitmapWidth
val bitmapHeight = data.bitmapHeight
val scaleX = this.surfaceWidth * 1.0f / bitmapWidth
val scaleY = this.surfaceHeight * 1.0f / bitmapHeight
val bytes = data.data
if (bytes == null) {
isTimedBlock = true
return
}
val canvas = holder.lockCanvas()
//1. 绘制图片
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) ?: return
try {
if (canvas == null) {
isTimedBlock = true
return
canvas.save()
canvas.scale(scaleX, scaleY)
canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint)
} finally {
canvas.restore()
if (!bitmap.isRecycled) {
bitmap.recycle()
}
//1. 绘制图片
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
if (bitmap == null) {
isTimedBlock = true
return
}
//2. 绘制车的信息
val newTargetX = targetX * scaleX
val newTargetY = targetY * scaleY
val newTargetWidth = targetWidth * scaleX
val newTargetHeight = targetHeight * scaleY
try {
//2.1 绘制车前的转向角
canvas.save()
var steering = this.steering
if (abs(steering) < 1) {
steering = 0f
}
try {
canvas.save()
canvas.scale(scaleX, scaleY)
canvas.drawBitmap(bitmap, 0f, 0f, bitmapPaint)
} finally {
canvas.restore()
if (!bitmap.isRecycled) {
bitmap.recycle()
}
}
//2. 绘制车的信息
val newTargetX = targetX * scaleX
val newTargetY = targetY * scaleY
val newTargetWidth = targetWidth * scaleX
val newTargetHeight = targetHeight * scaleY
try {
//2.1 绘制车前的转向角
canvas.save()
var steering = this.steering
if (abs(steering) < 1) {
steering = 0f
}
if (steering == 0f) {
canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY)
routerPath.reset()
val halfX = newTargetWidth * 0.5f
var startX = - halfX
val startY= 0f
routerPath.moveTo(startX, startY)
var endX = startX
val endY = - newTargetY
routerPath.lineTo(endX, endY)
canvas.drawPath(routerPath, routerPaint)
startX += newTargetWidth
endX += newTargetWidth
routerPath.reset()
routerPath.moveTo(startX, startY)
routerPath.lineTo(endX, endY)
canvas.drawPath(routerPath, routerPaint)
} else {
val outerAngle = abs(steering * 1.0 / VEHICLE_STEERING_RATIO)
val radians = Math.toRadians(outerAngle)
val d = (newTargetHeight / tan(radians)).toFloat()
if (steering > 0) {
// 左打轮
// 将坐标原点平移到圆心
canvas.translate(newTargetX - (d - newTargetWidth), newTargetY + newTargetHeight)
//外圆半径
val outerR = (newTargetHeight / sin(radians)).toFloat()
//内圆半径
val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat()
val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0)
outerRect.set(-outerR, -outerR, outerR, outerR)
innerRect.set(-innerR, -innerR, innerR, innerR)
canvas.drawArc(outerRect, -outerAngle.toFloat(), -60f, false, routerPaint)
canvas.drawArc(innerRect, -innerAngle.toFloat(), -60f, false, routerPaint)
}
if (steering < 0) {
//右打轮
// 将坐标原点平移到圆心
canvas.translate(newTargetX + d, newTargetY + newTargetHeight)
//外圆半径
val outerR = (newTargetHeight / sin(radians)).toFloat()
//内圆半径
val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat()
val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0)
outerRect.set(-outerR, -outerR, outerR, outerR)
innerRect.set(-innerR, -innerR, innerR, innerR)
canvas.drawArc(outerRect, 180f + outerAngle.toFloat(), 60f, false, routerPaint)
canvas.drawArc(innerRect, 180f + innerAngle.toFloat(), 60f, false, routerPaint)
}
}
} finally {
canvas.restore()
}
try {
//2.2 绘制车周围盲区标定
canvas.save()
if (steering == 0f) {
canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY)
val halfTargetWidth = newTargetWidth * 0.5f
var startX = -halfTargetWidth
var startY = BROKE_LINE_LENGTH
routerPath.reset()
val halfX = newTargetWidth * 0.5f
var startX = - halfX
val startY= 0f
routerPath.moveTo(startX, startY)
var endX = startX
var endY = 0f
// 绘制左上角
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endX += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
val endY = - newTargetY
routerPath.lineTo(endX, endY)
canvas.drawPath(routerPath, routerPaint)
startX += newTargetWidth
endX += newTargetWidth
routerPath.reset()
routerPath.moveTo(startX, startY)
routerPath.lineTo(endX, endY)
canvas.drawPath(routerPath, routerPaint)
} else {
val outerAngle = abs(steering * 1.0 / VEHICLE_STEERING_RATIO)
val radians = Math.toRadians(outerAngle)
val d = (newTargetHeight / tan(radians)).toFloat()
if (steering > 0) {
// 左打轮
// 将坐标原点平移到圆心
canvas.translate(newTargetX - (d - newTargetWidth), newTargetY + newTargetHeight)
//外圆半径
val outerR = (newTargetHeight / sin(radians)).toFloat()
//内圆半径
val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat()
val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0)
outerRect.set(-outerR, -outerR, outerR, outerR)
innerRect.set(-innerR, -innerR, innerR, innerR)
canvas.drawArc(outerRect, -outerAngle.toFloat(), -60f, false, routerPaint)
canvas.drawArc(innerRect, -innerAngle.toFloat(), -60f, false, routerPaint)
}
// 绘制右上角
startX = halfTargetWidth - BROKE_LINE_LENGTH
startY = 0f
endX = halfTargetWidth
endY = 0f
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endY += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
//绘制左下角
startX = -halfTargetWidth
startY = newTargetHeight - BROKE_LINE_LENGTH
endX = startX
endY = newTargetHeight
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endX += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
//绘制右下角
startX = halfTargetWidth - BROKE_LINE_LENGTH
startY = newTargetHeight
endX = halfTargetWidth
endY = startY
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endY -= BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
} finally {
canvas.restore()
if (steering < 0) {
//右打轮
// 将坐标原点平移到圆心
canvas.translate(newTargetX + d, newTargetY + newTargetHeight)
//外圆半径
val outerR = (newTargetHeight / sin(radians)).toFloat()
//内圆半径
val innerR = sqrt((newTargetHeight * 1.0).pow(2.0) + ((d - newTargetWidth) * 1.0).pow(2.0)).toFloat()
val innerAngle = Math.toDegrees(asin(newTargetHeight / innerR) * 1.0)
outerRect.set(-outerR, -outerR, outerR, outerR)
innerRect.set(-innerR, -innerR, innerR, innerR)
canvas.drawArc(outerRect, 180f + outerAngle.toFloat(), 60f, false, routerPaint)
canvas.drawArc(innerRect, 180f + innerAngle.toFloat(), 60f, false, routerPaint)
}
}
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas)
}
canvas.restore()
}
try {
//2.2 绘制车周围盲区标定
canvas.save()
canvas.translate(newTargetX + newTargetWidth * 0.5f, newTargetY)
val halfTargetWidth = newTargetWidth * 0.5f
var startX = -halfTargetWidth
var startY = BROKE_LINE_LENGTH
var endX = startX
var endY = 0f
// 绘制左上角
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endX += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
// 绘制右上角
startX = halfTargetWidth - BROKE_LINE_LENGTH
startY = 0f
endX = halfTargetWidth
endY = 0f
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endY += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
//绘制左下角
startX = -halfTargetWidth
startY = newTargetHeight - BROKE_LINE_LENGTH
endX = startX
endY = newTargetHeight
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endX += BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
//绘制右下角
startX = halfTargetWidth - BROKE_LINE_LENGTH
startY = newTargetHeight
endX = halfTargetWidth
endY = startY
brokePath.reset()
brokePath.moveTo(startX, startY)
brokePath.lineTo(endX, endY)
endY -= BROKE_LINE_LENGTH
brokePath.lineTo(endX, endY)
canvas.drawPath(brokePath, brokePaint)
} finally {
canvas.restore()
}
} finally {
if (isTimedBlock) {
try {
Thread.sleep(2000)
} catch (ignore: Exception) { }
try {
if (canvas != null && holder.surface.isValid) {
holder.unlockCanvasAndPost(canvas)
}
isSurfaceValid = holder.surface.isValid
} catch (t: Throwable) {
t.printStackTrace()
}
handler.get().post(this)
}
}
@@ -304,6 +287,8 @@ class M1LookAroundView: SurfaceView, SurfaceHolder.Callback, Runnable, IMoGoChas
Log.d(TAG, "-- onEach ---:$it")
if (it.isValid()) {
data = it
handler.get()?.removeCallbacks(this@M1LookAroundView)
handler.get()?.post(this@M1LookAroundView)
}
}.collect()
}

View File

@@ -9,6 +9,7 @@ import androidx.constraintlayout.widget.ConstraintLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.msgbox.FMInfoMsg
import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean
import com.mogo.eagle.core.data.msgbox.MsgCategory
@@ -21,6 +22,7 @@ import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.utilcode.util.SoundPoolUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_driver_msg_box_bubble.view.*
@@ -96,6 +98,23 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor(
} else if(category == MsgCategory.SYS_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
//todo 过滤MAP系统异常报警
} else if(category == MsgCategory.FM_INFO){
CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true)
//属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音
val fmInfoMsg = msgBoxBean.bean as FMInfoMsg
if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP" //择机靠边停车
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP" //立刻舒适停车
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP" //就地紧急停车
){
//语音提示
try {
SoundPoolUtils.getSoundPool().playSoundWithRedId(context,R.raw.weak_net_tips)
}catch (e: Exception){
e.printStackTrace()
}
//展示消息
showData(msgBoxBean)
}
} else{
if(msgBoxBean.sourceType == DataSourceType.SUMMARY){
//在一次订单中汇总消息只展示一次

View File

@@ -45,9 +45,10 @@ class DriverMsgBoxListView @JvmOverloads constructor(
initView()
}
private val TAG = "DriverMsgBoxListView"
private var noticeList: ArrayList<MsgBoxBean> ?= null
private var ipcReportList: ArrayList<MsgBoxBean> ?= null
private var badCaseList: ArrayList<MsgBoxBean> ?= null
private var noticeList: ArrayList<MsgBoxBean> ?= null //通知消息列表
private var fmList: ArrayList<MsgBoxBean> ?= ArrayList() //FM信息消息列表
private var ipcReportList: ArrayList<MsgBoxBean> ?= null //车辆系统信息消息列表
private var badCaseList: ArrayList<MsgBoxBean> ?= null//录包消息列表
private var driverMsgBoxListAdapter: DriverMsgBoxListAdapter ?=null
private var linearLayoutManager: LinearLayoutManager ?= null
@@ -71,9 +72,11 @@ class DriverMsgBoxListView @JvmOverloads constructor(
//通知
tvMsgNotice.setOnClickListener {
tvMsgNotice.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.VISIBLE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.GONE
MsgBoxConfig.setUserRecord(0)
@@ -86,15 +89,36 @@ class DriverMsgBoxListView @JvmOverloads constructor(
}
}
//FM信息
tvMsgFm.setOnClickListener {
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.VISIBLE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.GONE
MsgBoxConfig.setUserRecord(1)
if(fmList == null){
rvMsgBoxList.visibility = View.GONE
}else{
driverMsgBoxListAdapter?.setData(fmList!!)
rvMsgBoxList.visibility = View.VISIBLE
rvMsgBoxList.scrollToPosition(0)
}
}
//车辆系统信息
tvMsgIpcReport.setOnClickListener {
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.VISIBLE
viewBadCaseDivider.visibility = View.GONE
MsgBoxConfig.setUserRecord(1)
MsgBoxConfig.setUserRecord(2)
if(ipcReportList == null){
rvMsgBoxList.visibility = View.GONE
}else{
@@ -107,12 +131,14 @@ class DriverMsgBoxListView @JvmOverloads constructor(
//录包
tvMsgBadCase.setOnClickListener {
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.msg_box_title_color))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.VISIBLE
MsgBoxConfig.setUserRecord(2)
MsgBoxConfig.setUserRecord(3)
if(badCaseList == null){
rvMsgBoxList.visibility = View.GONE
}else{
@@ -127,11 +153,14 @@ class DriverMsgBoxListView @JvmOverloads constructor(
fun notifyData(){
//获取当前Tab选择
when(MsgBoxConfig.getUserRecord()){
//通知消息
0 ->{
tvMsgNotice.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.VISIBLE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.GONE
if(noticeList==null){
@@ -142,11 +171,32 @@ class DriverMsgBoxListView @JvmOverloads constructor(
rvMsgBoxList.scrollToPosition(0)
}
}
1 ->{
//FM消息
1->{
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.VISIBLE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.GONE
if(fmList == null){
rvMsgBoxList.visibility = View.GONE
}else{
driverMsgBoxListAdapter?.setData(fmList!!)
rvMsgBoxList.visibility = View.VISIBLE
rvMsgBoxList.scrollToPosition(0)
}
}
//车辆系统信息消息
2 ->{
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.msg_box_title_color))
tvMsgBadCase.setTextColor(resources.getColor(R.color.color_FFFFFF))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.VISIBLE
viewBadCaseDivider.visibility = View.GONE
if(ipcReportList == null){
@@ -157,11 +207,14 @@ class DriverMsgBoxListView @JvmOverloads constructor(
rvMsgBoxList.scrollToPosition(0)
}
}
2 ->{
//录包消息
3 ->{
tvMsgNotice.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgFm.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgIpcReport.setTextColor(resources.getColor(R.color.color_FFFFFF))
tvMsgBadCase.setTextColor(resources.getColor(R.color.msg_box_title_color))
viewNoticeDivider.visibility = View.GONE
viewFmDivider.visibility = View.GONE
viewIpcReportDivider.visibility = View.GONE
viewBadCaseDivider.visibility = View.VISIBLE
if(badCaseList == null){
@@ -179,6 +232,7 @@ class DriverMsgBoxListView @JvmOverloads constructor(
override fun onDataChanged(category: MsgCategory, msgBoxList: MsgBoxBean) {
UiThreadHandler.post({
when (category) {
//通知
MsgCategory.NOTICE -> {
if(msgBoxList.sourceType == DataSourceType.SUMMARY){
//在一次订单中汇总消息只展示一次
@@ -196,18 +250,28 @@ class DriverMsgBoxListView @JvmOverloads constructor(
}
}
}
//FM信息
MsgCategory.FM_INFO -> {
fmList?.add(0,msgBoxList)
if(MsgBoxConfig.getUserRecord() == 1){
fmList?.let { driverMsgBoxListAdapter?.setData(it) }
}
}
//系统信息
MsgCategory.SYS_INFO -> {
ipcReportList?.add(0,msgBoxList)
if(MsgBoxConfig.getUserRecord() == 1){
if(MsgBoxConfig.getUserRecord() == 2){
ipcReportList?.let { driverMsgBoxListAdapter?.setData(it) }
}
}
//录包
MsgCategory.RECORD_BAG -> {
badCaseList?.add(0,msgBoxList)
if(MsgBoxConfig.getUserRecord() == 2){
if(MsgBoxConfig.getUserRecord() == 3){
badCaseList?.let { driverMsgBoxListAdapter?.setData(it) }
}
}
else -> {}
}
},UiThreadHandler.MODE.QUEUE)
}

View File

@@ -11,6 +11,8 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxBean
import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean
import com.mogo.eagle.core.data.msgbox.MsgBoxType
import com.mogo.eagle.core.data.msgbox.MsgCategory
import com.mogo.eagle.core.data.msgbox.VoiceMsg
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxEventListener
import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener
import com.mogo.eagle.core.function.api.order.IOrderListener
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
@@ -19,6 +21,7 @@ import com.mogo.eagle.core.function.call.order.CallerOrderListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.PassengerMsgBoxBubbleAdapter
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.layout_passenger_msg_box_bubble.view.*
@@ -31,13 +34,17 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener {
) : ConstraintLayout(context, attrs, defStyleAttr), IMsgBoxListener, IOrderListener,
IMsgBoxEventListener {
private val TAG = "PassengerMsgBoxBubbleView"
private val dataList :ArrayList<MsgBoxCountDownBean> = ArrayList()
private var passengerMsgBoxBubbleAdapter: PassengerMsgBoxBubbleAdapter ?= null
private var isShowData = true
private var isShowSummary = false //是否展示汇总消息
private var isCacheMsg = false //是否缓存消息
private var voiceIsShowing = false //小智语音消息是否正在展示
private var voiceMsgBean: MsgBoxCountDownBean ?= null //小智语音消息封装
init {
LayoutInflater.from(context).inflate(R.layout.layout_passenger_msg_box_bubble, this, true)
@@ -65,20 +72,96 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor(
if(category == MsgCategory.NOTICE){
if(msgBoxList.type == MsgBoxType.NOTICE || msgBoxList.type == MsgBoxType.V2X
|| msgBoxList.type == MsgBoxType.OBU){
if(msgBoxList.sourceType == DataSourceType.SUMMARY){
//在一次订单中汇总消息只展示一次
if(isShowSummary){
operationalData(msgBoxList)
isShowSummary = false
}
if(isCacheMsg){
//将消息缓存到未播放列表等待小智语音播放完成后取出播放
MsgBoxConfig.unPlayList.add(msgBoxList)
}else{
operationalData(msgBoxList)
//实时播放消息
notifyMsg(msgBoxList)
}
}
}
if(category == MsgCategory.VOICE_INFO){
if(msgBoxList.type == MsgBoxType.VOICE){
executeVoiceInfo(msgBoxList)
}
}
},UiThreadHandler.MODE.QUEUE)
}
/**
* 小智语音消息执行
*/
private fun executeVoiceInfo(msgBoxList: MsgBoxBean){
CallerLogger.d(TAG,"-----onStatusChange $msgBoxList")
val voiceMsg = msgBoxList.bean as VoiceMsg
if(!voiceMsg.isWakeUpEnd){
//有其他消息时,将其他消息缓存进未播放列表
voiceIsShowing = true
isCacheMsg = true
//开始展示消息
if(voiceMsgBean == null){
voiceMsgBean = MsgBoxCountDownBean(msgBoxList)
dataList.add(voiceMsgBean!!)
}else{
dataList.remove(voiceMsgBean)
voiceMsgBean!!.msgBoxBean = msgBoxList
dataList.add(voiceMsgBean!!)
}
passengerMsgBoxBubbleAdapter?.setData(dataList)
}
if(!voiceMsg.isWakeUp && voiceMsg.isWakeUpEnd){
//关闭消息展示
dataList.remove(voiceMsgBean)
passengerMsgBoxBubbleAdapter?.setData(dataList)
//如果未播放列表中有未播放的消息则陆续展示消息,新来的消息继续放到未播放列表中,
//如果未播放消息列表为空,则立刻改变状态,即使播放新消息
voiceIsShowing = false
handleCachedMsg()
}
}
/**
* 播放缓存消息
*/
private fun handleCachedMsg(){
if(MsgBoxConfig.unPlayList.isEmpty()){
isCacheMsg = false
}else{
//开始播放缓存未播放消息
val iterator = MsgBoxConfig.unPlayList.iterator()
while(iterator.hasNext()){
val msg = iterator.next()
if(passengerMsgBoxBubbleAdapter!!.getDataSize()<3){
notifyMsg(msg)
iterator.remove()
}
}
if(MsgBoxConfig.unPlayList.isEmpty()){
isCacheMsg = false
}
}
}
/**
* 通知新消息展示
*/
private fun notifyMsg(msgBoxList: MsgBoxBean){
if(msgBoxList.sourceType == DataSourceType.SUMMARY){
//在一次订单中汇总消息只展示一次
if(isShowSummary){
operationalData(msgBoxList)
isShowSummary = false
}
}else{
operationalData(msgBoxList)
}
}
/**
* 处理播放消息
*/
private fun operationalData(msgBoxList: MsgBoxBean){
MsgBoxConfig.noticeList.add(msgBoxList)
if(isShowData){
@@ -93,16 +176,28 @@ class PassengerMsgBoxBubbleView @JvmOverloads constructor(
super.onAttachedToWindow()
CallerMsgBoxListenerManager.addListener(TAG,this)
CallerOrderListenerManager.addListener(TAG,this)
CallerMsgBoxEventListenerManager.addListener(TAG,this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerMsgBoxListenerManager.removeListener(TAG)
CallerOrderListenerManager.removeListener(TAG)
CallerMsgBoxEventListenerManager.removeListener(TAG)
}
override fun onUpdateOrderStatus(inOrder: Boolean) {
isShowSummary = inOrder
}
/**
* 播放缓存消息
*/
override fun onHandleCachedMsg() {
if(voiceIsShowing){
return
}
handleCachedMsg()
}
}

View File

@@ -12,19 +12,18 @@ import androidx.annotation.Nullable;
public class SharpView extends View {
private int mWidth =0; //三角形的宽度
private int mHeight =0; //三角形的高度
private Context mContext;
private int mWidth = 0; //三角形的宽度
private int mHeight = 0; //三角形的高度
private final Paint paint = new Paint();
private final Path path = new Path();
public SharpView(Context context) {
super(context);
this.mContext=context;
initView();
}
public SharpView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
this.mContext=context;
initView();
}
@@ -32,28 +31,27 @@ public class SharpView extends View {
mWidth = 25;
mHeight = 25;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(mWidth,mHeight);
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//创建画笔
Paint paint = new Paint();
paint.setColor(Color.parseColor("#FFFFFFFF"));
paint.setAntiAlias(true); //抗锯齿
paint.setStyle(Paint.Style.FILL);//实线
//创建路径
Path path = new Path();
path.moveTo(0,mHeight);
path.lineTo(mWidth,mHeight);
path.lineTo(mWidth/2,0);
path.moveTo(0, mHeight);
path.lineTo(mWidth, mHeight);
path.lineTo(mWidth / 2.0f, 0);
path.close();//闭合路径
//画在画布上
canvas.drawPath(path,paint);
canvas.drawPath(path, paint);
}
}

View File

@@ -19,6 +19,8 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.msgbox.MsgBoxConfig
import com.mogo.eagle.core.function.msgbox.MsgFmData
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.TimeUtils
@@ -42,6 +44,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
private val v2x: Int = 3
private val report: Int = 4
private val summary: Int = 5
private val fm: Int = 6
private var changeViewListener: ChangeViewListener?=null
@@ -86,6 +89,10 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_summary,parent,false)
return BubbleSummaryHolder(view)
}
fm -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_fm,parent,false)
return BubbleFmHolder(view)
}
else -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_msg_bubble_v2x,parent,false)
return BubbleV2XHolder(view)
@@ -133,6 +140,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
holder.tvOperationDoorContent.text = operationDoorMsg.content
}
}
//系统信息消息
is BubbleReportHolder -> {
data?.let {
val msgBoxBean = it[position].msgBoxBean
@@ -149,6 +157,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
}
}
}
//云公告消息
is BubbleNoticeHolder -> {
data?.let {
val msgBoxBean = it[position].msgBoxBean.bean
@@ -188,6 +197,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
}
}
}
//V2X消息
is BubbleV2XHolder -> {
data?.let {
val msgBoxBean = it[position].msgBoxBean
@@ -206,6 +216,7 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
}
}
}
//汇总消息
is BubbleSummaryHolder -> {
data?.let {
val summaryMsg = it[position].msgBoxBean.bean as V2XMsg
@@ -213,6 +224,41 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
holder.tvSummaryContent.text = summaryMsg.content
}
}
//FM信息
is BubbleFmHolder ->{
data?.let {
val fmMsg = it[position].msgBoxBean.bean as FMInfoMsg
holder.tvBubbleFmFault.text = MsgFmData.getFmPolicyName(fmMsg.policyCode)
if(fmMsg.policyTime == null){
holder.tvBubbleFmTime.text = TimeUtils.millis2String(it[position].msgBoxBean.timestamp,getHourMinFormat())
}else{
holder.tvBubbleFmTime.text = TimeUtils.millis2String(fmMsg.policyTime!!,getHourMinFormat())
}
if(fmMsg.fmInfoList?.size == 0){
holder.tvBubbleFmFaultAction.text = "建议操作:暂无"
}else{
var curFaultLevel = 0 //默认级别遍历数组找出级别最高的level数越小大级别越高
fmMsg.fmInfoList?.forEach { faultInfo ->
if(faultInfo.faultActionCount>0){
faultInfo.faultActionList.forEach {actionCode ->
//获取建议操作级别,得到建议操作级别最高的操作
if(MsgFmData.FaultAction.getFaultLevel(actionCode) > curFaultLevel){
curFaultLevel = MsgFmData.FaultAction.getFaultLevel(actionCode)
}
}
}
}
val faultAction = MsgFmData.FaultAction.getFaultAction(curFaultLevel)
//当出现多个建议操作时,按照整车下电重启、请求人工驾驶接管、请求平行驾驶接管、系统重启、联系硬件工程师、
// 联系运维工程师、联系软件工程师优先级递减的顺序,只展示最高优先级的内容
if(curFaultLevel == 0){
holder.tvBubbleFmFaultAction.text = "建议操作:暂无"
}else{
holder.tvBubbleFmFaultAction.text = "${faultAction}(${MsgFmData.FaultAction.getFaultActionCode(curFaultLevel)})"
}
}
}
}
}
val msgBoxBean: MsgBoxCountDownBean = data!![position]
@@ -260,6 +306,8 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
notice
}else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){
summary
}else if(data!![position].msgBoxBean.type == MsgBoxType.FMINFO){
fm
} else{
v2x
}
@@ -320,6 +368,13 @@ class DriverMsgBoxBubbleAdapter(private val activity: Activity) : RecyclerView.A
var tvSummaryTime: TextView = itemView.findViewById(R.id.tvSummaryTime)
}
//FM消息
class BubbleFmHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var tvBubbleFmFault: TextView = itemView.findViewById(R.id.tvBubbleFmFault)
var tvBubbleFmFaultAction: TextView = itemView.findViewById(R.id.tvBubbleFmFaultAction)
var tvBubbleFmTime: TextView = itemView.findViewById(R.id.tvBubbleFmTime)
}
fun setChangeListener(listener: ChangeViewListener){
changeViewListener = listener
}

View File

@@ -18,11 +18,13 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.msgbox.MsgFmData
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.ResourceUtils.getDrawable
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.utilcode.util.ToastUtils
/**
* @author XuXinChao
@@ -41,8 +43,9 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
private val operationDoorSwitchFail: Int = 13
private val notice: Int = 2
private val v2x: Int = 3
private val report: Int = 5
private val record: Int = 6
private val fm: Int = 4 //FM信息
private val report: Int = 5 //系统信息
private val record: Int = 6 //录包
private val summary: Int = 8
//Error
@@ -61,16 +64,24 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
when (viewType) {
//录包
record -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_bad_case, parent, false)
return BadCaseHolder(view)
}
//系统信息
report -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_msg_box_ipc_report, parent, false)
return MsgBoxIpcReportHolder(view)
}
//FM信息
fm -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_msg_box_fm,parent,false)
return FmInfoHolder(view)
}
operation -> {
val view = LayoutInflater.from(parent.context)
.inflate(R.layout.item_msg_box_operation, parent, false)
@@ -112,6 +123,7 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
when (holder) {
//录包
is BadCaseHolder -> {
data?.let {
holder.tvBagReceiveTime.text =
@@ -119,12 +131,237 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
holder.tvBagRecordTime.text =
"时间:${TimeUtils.millis2String(it[position].timestamp)}"
val msgBoxBean = it[position]
val recordBagMsg = msgBoxBean.bean as RecordBagMsg
holder.tvRecordCheck.setOnClickListener {
//打开被动录包弹窗
CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean, activity, false)
if(recordBagMsg.isShow){
ToastUtils.showShort("当前录包上报面板已打开,请勿重复操作")
}else{
//打开被动录包弹窗
CallerDevaToolsManager.onReceiveBadCaseRecord(msgBoxBean, activity, false)
recordBagMsg.isShow = true
}
}
}
}
//FM信息
is FmInfoHolder -> {
data?.let {
val fmInfoMsg = it[position].bean as FMInfoMsg
//时间显示
holder.tvFmTimeOpen.text =
"时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
holder.tvFmTimeNormal.text =
"时间:${fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1) }}"
holder.tvFmTime.text =
fmInfoMsg.policyTime?.let { it1 -> TimeUtils.millis2String(it1,getHourMinFormat()) }
//不同级别的Icon显示
if(fmInfoMsg.policyCode == "FM_DP_ONLY_WARNING"){
//警示
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_warning_open))
}else if(fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT1"
|| fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT2"
|| fmInfoMsg.policyCode == "FM_DP_SPEED_LIMIT3"){
//降速行驶
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_reduce_open))
}else if(fmInfoMsg.policyCode == "FM_DP_PNC_CHOOSE_STOP"
|| fmInfoMsg.policyCode == "FM_DP_COMFORTABLE_STOP"
|| fmInfoMsg.policyCode == "FM_DP_EMERGENCY_STOP"){
//安全停车
holder.ivFmImageNormal.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_normal))
holder.ivFmImageOpen.setImageDrawable(getDrawable(R.drawable.icon_fm_stop_open))
}
//Title
holder.tvFmTitleNormal.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
holder.tvFmTitleOpen.text = MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)
//建议操作
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
//建议操作暂无
holder.tvFmActionOpen.text = "建议操作:暂无"
holder.tvFmActionNormal.text = "建议操作:暂无"
}else{
val receiveFaultLevel = ArrayList<Int>()
fmInfoMsg.fmInfoList!!.forEach { info ->
if(info.faultActionCount != 0){
info.faultActionList.forEach { action ->
//如果不包含此故障Level则进行添加
if(!receiveFaultLevel.contains(MsgFmData.FaultAction.getFaultLevel(action)) && MsgFmData.FaultAction.getFaultLevel(action)!=0){
receiveFaultLevel.add(MsgFmData.FaultAction.getFaultLevel(action))
}
}
}
}
//对faultLevel集合进行排序按照顺序输出建议操作
if(receiveFaultLevel.size > 0){
val faultActionStr: StringBuilder = StringBuilder()
faultActionStr.append("建议操作:")
receiveFaultLevel.sort()
receiveFaultLevel.reverse()
receiveFaultLevel.forEach {level->
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank()){
faultActionStr.append(MsgFmData.FaultAction.getFaultAction(level))
}
if(MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){
faultActionStr.append("(")
faultActionStr.append(MsgFmData.FaultAction.getFaultActionCode(level))
faultActionStr.append(")")
}
if(MsgFmData.FaultAction.getFaultAction(level).isNotBlank() || MsgFmData.FaultAction.getFaultActionCode(level).isNotBlank()){
faultActionStr.append("/")
}
}
if(faultActionStr.length > 5){
if(faultActionStr.endsWith("/")){
faultActionStr.deleteCharAt(faultActionStr.lastIndex)
}
holder.tvFmActionOpen.text = faultActionStr.toString()
holder.tvFmActionNormal.text = faultActionStr.toString()
}else{
holder.tvFmActionOpen.text = "建议操作:暂无"
holder.tvFmActionNormal.text = "建议操作:暂无"
}
}else{
holder.tvFmActionOpen.text = "建议操作:暂无"
holder.tvFmActionNormal.text = "建议操作:暂无"
}
}
//故障策略
holder.tvFmFaultOpen.text = "故障策略:${MsgFmData.getFmPolicyName(fmInfoMsg.policyCode)}(${fmInfoMsg.policyCode})"
//故障原因
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
holder.tvFmReasonOpen.text = "故障原因:暂无"
}else{
val fmFaultReason = StringBuilder()
fmFaultReason.append("故障原因:")
for((index,info) in fmInfoMsg.fmInfoList!!.withIndex()){
fmFaultReason.append(info.faultName)
if(info.faultId.isNotBlank()){
fmFaultReason.append("(")
fmFaultReason.append(info.faultId)
fmFaultReason.append(")")
}
if(index!=(fmInfoMsg.fmInfoList!!.size-1)){
fmFaultReason.append("/")
}
}
holder.tvFmReasonOpen.text = fmFaultReason.toString()
}
//故障后果
if(fmInfoMsg.fmInfoList.isNullOrEmpty()){
holder.tvFmResultOpen.text = "故障后果:暂无"
}else{
val fmFaultResult = StringBuilder()
fmFaultResult.append("故障后果:")
fmInfoMsg.fmInfoList!!.forEach { info->
if(info.faultResultCount != 0){
info.faultResultList.forEach { result->
if(MsgFmData.FaultResult.getResultDefine(result).isNotBlank()){
fmFaultResult.append(MsgFmData.FaultResult.getResultDefine(result))
}
if(result.isNotBlank()){
fmFaultResult.append("(")
fmFaultResult.append(result)
fmFaultResult.append(")")
}
if(MsgFmData.FaultResult.getResultDefine(result).isNotBlank() || result.isNotBlank()){
fmFaultResult.append("/")
}
}
}
}
if(fmFaultResult.endsWith("/")){
holder.tvFmResultOpen.text = fmFaultResult.deleteCharAt(fmFaultResult.lastIndex).toString()
}else{
holder.tvFmResultOpen.text = "故障后果:暂无"
}
}
//对布局进行展开折叠操作
if(fmInfoMsg.isShow){
holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds(
getDrawable(R.drawable.icon_msg_close),
null,
null,
null
)
holder.tvFmStatusSelect.text = "折叠"
holder.ivFmImageNormal.visibility = View.GONE
holder.tvFmTitleNormal.visibility = View.GONE
holder.tvFmTimeNormal.visibility = View.GONE
holder.tvFmActionNormal.visibility = View.GONE
holder.ivFmImageOpen.visibility = View.VISIBLE
holder.tvFmTitleOpen.visibility = View.VISIBLE
holder.tvFmTimeOpen.visibility = View.VISIBLE
holder.tvFmActionOpen.visibility = View.VISIBLE
holder.tvFmFaultOpen.visibility = View.VISIBLE
holder.tvFmReasonOpen.visibility = View.VISIBLE
holder.tvFmResultOpen.visibility = View.VISIBLE
}else{
holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds(
getDrawable(R.drawable.icon_msg_open),
null,
null,
null
)
holder.tvFmStatusSelect.text = "展开"
holder.ivFmImageNormal.visibility = View.VISIBLE
holder.tvFmTitleNormal.visibility = View.VISIBLE
holder.tvFmTimeNormal.visibility = View.VISIBLE
holder.tvFmActionNormal.visibility = View.VISIBLE
holder.ivFmImageOpen.visibility = View.GONE
holder.tvFmTitleOpen.visibility = View.GONE
holder.tvFmTimeOpen.visibility = View.GONE
holder.tvFmActionOpen.visibility = View.GONE
holder.tvFmFaultOpen.visibility = View.GONE
holder.tvFmReasonOpen.visibility = View.GONE
holder.tvFmResultOpen.visibility = View.GONE
}
holder.tvFmStatusSelect.setOnClickListener{
if(!fmInfoMsg.isShow){
fmInfoMsg.isShow = true
holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds(
getDrawable(R.drawable.icon_msg_close),
null,
null,
null
)
holder.tvFmStatusSelect.text = "折叠"
holder.ivFmImageNormal.visibility = View.GONE
holder.tvFmTitleNormal.visibility = View.GONE
holder.tvFmTimeNormal.visibility = View.GONE
holder.tvFmActionNormal.visibility = View.GONE
holder.ivFmImageOpen.visibility = View.VISIBLE
holder.tvFmTitleOpen.visibility = View.VISIBLE
holder.tvFmTimeOpen.visibility = View.VISIBLE
holder.tvFmActionOpen.visibility = View.VISIBLE
holder.tvFmFaultOpen.visibility = View.VISIBLE
holder.tvFmReasonOpen.visibility = View.VISIBLE
holder.tvFmResultOpen.visibility = View.VISIBLE
}else{
fmInfoMsg.isShow = false
holder.tvFmStatusSelect.setCompoundDrawablesWithIntrinsicBounds(
getDrawable(R.drawable.icon_msg_open),
null,
null,
null
)
holder.tvFmStatusSelect.text = "展开"
holder.ivFmImageNormal.visibility = View.VISIBLE
holder.tvFmTitleNormal.visibility = View.VISIBLE
holder.tvFmTimeNormal.visibility = View.VISIBLE
holder.tvFmActionNormal.visibility = View.VISIBLE
holder.ivFmImageOpen.visibility = View.GONE
holder.tvFmTitleOpen.visibility = View.GONE
holder.tvFmTimeOpen.visibility = View.GONE
holder.tvFmActionOpen.visibility = View.GONE
holder.tvFmFaultOpen.visibility = View.GONE
holder.tvFmReasonOpen.visibility = View.GONE
holder.tvFmResultOpen.visibility = View.GONE
}
}
}
}
//系统信息
is MsgBoxIpcReportHolder -> {
data?.let { it ->
val reportMsgBox = it[position]
@@ -434,7 +671,10 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
report
} else if (data!![position].type == MsgBoxType.RECORD) {
record
} else {
} else if(data!![position].type == MsgBoxType.FMINFO){
fm
}
else {
v2x
}
}
@@ -446,6 +686,23 @@ class DriverMsgBoxListAdapter(private val activity: Activity) :
var tvRecordCheck: TextView = itemView.findViewById(R.id.tvRecordCheck)
}
//FM信息
class FmInfoHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var ivFmImageNormal: ImageView = itemView.findViewById(R.id.ivFmImageNormal) //故障级别图标
var tvFmTitleNormal: TextView = itemView.findViewById(R.id.tvFmTitleNormal) //标题展示故障策略
var tvFmTimeNormal: TextView = itemView.findViewById(R.id.tvFmTimeNormal) //时间
var tvFmStatusSelect: TextView = itemView.findViewById(R.id.tvFmStatusSelect) //展开折叠按钮
var tvFmActionNormal: TextView = itemView.findViewById(R.id.tvFmActionNormal) //建议操作
var tvFmTime: TextView = itemView.findViewById(R.id.tvFmTime) //时间
var ivFmImageOpen: ImageView = itemView.findViewById(R.id.ivFmImageOpen) //展开时图标
var tvFmTitleOpen: TextView = itemView.findViewById(R.id.tvFmTitleOpen) //标题文案为故障策略
var tvFmTimeOpen: TextView = itemView.findViewById(R.id.tvFmTimeOpen) //发生时间
var tvFmActionOpen: TextView = itemView.findViewById(R.id.tvFmActionOpen) //建议操作
var tvFmFaultOpen: TextView = itemView.findViewById(R.id.tvFmFaultOpen) //故障策略
var tvFmReasonOpen: TextView = itemView.findViewById(R.id.tvFmReasonOpen) //故障原因
var tvFmResultOpen: TextView = itemView.findViewById(R.id.tvFmResultOpen) //后果
}
//车辆系统信息
class MsgBoxIpcReportHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var ivReportImageNormal: ImageView = itemView.findViewById(R.id.ivReportImageNormal)

View File

@@ -12,14 +12,14 @@ import androidx.recyclerview.widget.RecyclerView
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.EventTypeEnumNew
import com.mogo.eagle.core.data.msgbox.*
import com.mogo.eagle.core.utilcode.mogo.glide.GlideApp
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform
import com.mogo.eagle.core.utilcode.util.TimeUtils
import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat
import com.mogo.eagle.core.widget.AlignTextView
import com.mogo.eagle.core.widget.AlignTwoTextView
import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout
/**
@@ -34,6 +34,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
private val notice: Int = 1
private val v2x: Int = 2
private val summary: Int = 3
private val voice: Int = 4
fun setData(data: ArrayList<MsgBoxCountDownBean>){
this.data = data
@@ -43,6 +44,17 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
notifyDataSetChanged()
}
/**
* 获取列表数据个数
*/
fun getDataSize(): Int{
return if(data.isNullOrEmpty()){
0
}else{
data!!.size
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
return when (viewType) {
notice -> {
@@ -53,6 +65,11 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_summary,parent,false)
BubbleSummaryHolder(view)
}
//小智语音
voice -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_voice,parent,false)
BubbleVoiceHolder(view)
}
else -> {
val view = LayoutInflater.from(parent.context).inflate(R.layout.item_passenger_msg_box_v2x,parent,false)
BubbleV2XHolder(view)
@@ -108,23 +125,44 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
}
}
}
//小智语音消息
is BubbleVoiceHolder -> {
data?.let {
val voiceMsg = it[position].msgBoxBean.bean as VoiceMsg
if(voiceMsg.isResp){
//小智说的
holder.tvVoiceRes.text = voiceMsg.msg
holder.tvVoiceRes.visibility = View.VISIBLE
holder.tvPassengerVoiceContent.visibility = View.GONE
}else{
//用户说的
holder.tvPassengerVoiceContent.text = voiceMsg.msg
holder.tvVoiceRes.visibility = View.GONE
holder.tvPassengerVoiceContent.visibility = View.VISIBLE
}
}
}
}
val msgBoxBean: MsgBoxCountDownBean = data!![position]
msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),1000){
override fun onTick(p0: Long) {
if(msgBoxBean.msgBoxBean.type != MsgBoxType.VOICE){
msgBoxBean.countDownTimer =object: CountDownTimer(CallerMsgBoxManager.getDismissTime(),CallerMsgBoxManager.getDismissTime()){
override fun onTick(p0: Long) {
}
}
override fun onFinish() {
data?.remove(msgBoxBean)
notifyDataSetChanged()
override fun onFinish() {
data?.remove(msgBoxBean)
notifyDataSetChanged()
// notifyItemRemoved(index)
// notifyItemRangeChanged(index,recordTypeEntity.size-index)
}
//通知消息盒子可以展示新的缓存消息
CallerMsgBoxEventListenerManager.invokeHandleCachedMsg()
}
}
msgBoxBean.countDownTimer?.start()
}
msgBoxBean.countDownTimer?.start()
}
override fun getItemCount() = data?.size ?: 0
@@ -134,7 +172,9 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
notice
}else if(data!![position].msgBoxBean.type == MsgBoxType.V2X && data!![position].msgBoxBean.sourceType == DataSourceType.SUMMARY){
summary
} else{
}else if(data!![position].msgBoxBean.type == MsgBoxType.VOICE){
voice
}else{
v2x
}
}
@@ -160,4 +200,10 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView
var tvPassengerSummaryTime: TextView = itemView.findViewById(R.id.tvPassengerSummaryTime)
}
//小智语音消息
class BubbleVoiceHolder(itemView: View): RecyclerView.ViewHolder(itemView){
var tvPassengerVoiceContent: AlignTextView = itemView.findViewById(R.id.tvPassengerVoiceContent)
var tvVoiceRes: AlignTwoTextView = itemView.findViewById(R.id.tvVoiceRes)
}
}

View File

@@ -5,6 +5,7 @@ import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocRece
import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean.DISPATCH_TYPE_START;
import static com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBean.DISPATCH_TYPE_STOP;
import android.annotation.SuppressLint;
import android.content.Context;
import com.mogo.commons.voice.AIAssist;
@@ -12,6 +13,7 @@ import com.mogo.eagle.core.data.biz.dispatch.DispatchAdasAutoPilotLocReceiverBea
public class DispatchDialogManager {
@SuppressLint("StaticFieldLeak")
private static volatile DispatchDialogManager manager;
private static final byte[] obj = new byte[0];
private final Context mContext;

View File

@@ -51,11 +51,15 @@ import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuConnectListener
import com.mogo.eagle.core.function.api.datacenter.obu.IMoGoObuInfoListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsFuncConfigListener
import com.mogo.eagle.core.function.api.devatools.IMoGoDevaToolsListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_DEMO
import com.mogo.eagle.core.function.api.hmi.view.IViewControlListener.Companion.FUNC_MODE_RAIN
import com.mogo.eagle.core.function.api.setting.ISopSettingListener
import com.mogo.eagle.core.function.call.autopilot.*
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsFuncConfigListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager
import com.mogo.eagle.core.function.call.obu.CallerObuApiManager
import com.mogo.eagle.core.function.call.obu.CallerObuConnectListenerManager
@@ -124,7 +128,7 @@ internal class DebugSettingView @JvmOverloads constructor(
IMoGoChassisThrottleStateListener,
IMoGoSweeperFutianCleanSystemListener,
IMoGoObuInfoListener,
ISopSettingListener {
ISopSettingListener, IViewControlListener {
private val TAG = "DebugSettingView"
@@ -708,6 +712,10 @@ internal class DebugSettingView @JvmOverloads constructor(
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode)
CallerSopSettingManager.invokeDemoModeListener(isChecked)
CallerHmiViewControlListenerManager.invokeFuncMode(
FUNC_MODE_DEMO,
FunctionBuildConfig.isDemoMode
)
if (!FunctionBuildConfig.isDemoMode) {
//关闭美化模式时,通知工控机
CallerAutoPilotControlManager.setIPCDemoMode(FunctionBuildConfig.isDemoMode)
@@ -724,10 +732,10 @@ internal class DebugSettingView @JvmOverloads constructor(
}
tbIsStrictMode?.also {
it.isChecked = SharedPrefs.getInstance(Utils.getApp())
it.isChecked = SharedPrefsMgr.getInstance(Utils.getApp())
.getBoolean("MOGO_STRICT_MODE_ENABLED", false)
it.setOnCheckedChangeListener { _, isChecked ->
SharedPrefs.getInstance(Utils.getApp())
SharedPrefsMgr.getInstance(Utils.getApp())
.putBoolean("MOGO_STRICT_MODE_ENABLED", isChecked)
scope.launch {
ToastUtils.showShort("配置生效, 2秒后重启应用...")
@@ -1040,7 +1048,7 @@ internal class DebugSettingView @JvmOverloads constructor(
private fun setEagleEyeConfigListener() {
//初始化刹车加速度阈值信息
val brakeThreshold = SharedPrefsMgr.getInstance(context)
.getFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5F)
.getFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, FunctionBuildConfig.accThreshold)
etInputBrakeThreshold.setText(brakeThreshold.toString())
etInputBrakeThreshold.text?.let { etInputBrakeThreshold.setSelection(brakeThreshold.toString().length) }
//设置刹车加速度阈值信息
@@ -1054,6 +1062,7 @@ internal class DebugSettingView @JvmOverloads constructor(
if (thresholdStrFloat < 0) {
SharedPrefsMgr.getInstance(context)
.putFloat(MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, thresholdStrFloat)
FunctionBuildConfig.accThreshold = thresholdStrFloat
ToastUtils.showShort("刹车阈值设置成功")
} else {
ToastUtils.showShort("刹车阈值加速度值应小于0")
@@ -1311,11 +1320,9 @@ internal class DebugSettingView @JvmOverloads constructor(
*/
tbSelfLog.setOnCheckedChangeListener { _, isChecked ->
if (isChecked) {
LogUtils.getConfig().isLogSwitch = false
Logger.init(LogLevel.OFF)
MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = false
} else {
LogUtils.getConfig().isLogSwitch = true
Logger.init(LogLevel.DEBUG)
MoGoAiCloudClient.getInstance().aiCloudClientConfig.isShowDebugLog = true
}
@@ -1679,21 +1686,10 @@ internal class DebugSettingView @JvmOverloads constructor(
*/
tvServerEnvironment.text = "当前服务器环境:${AppConfigInfo.netMode} -- ${
when (AppConfigInfo.netMode) {
2 -> {
"测试环境"
}
3 -> {
"生产环境"
}
4 -> {
"演示环境"
}
else -> {
"未知环境"
}
2 -> "测试环境"
3 -> "生产环境"
4 -> "演示环境"
else -> "未知环境"
}
}"
@@ -1784,18 +1780,17 @@ internal class DebugSettingView @JvmOverloads constructor(
}
tvCmdbCarInfoContent.text =
SharedPrefsMgr.getInstance(context).getString(SharedPrefsConstants.CAR_INFO) ?: ""
//APP升级功能
tvAppHost.text = "HOST地址" + SharedPrefsMgr.getInstance(context)
.getString(SharedPrefsConstants.HOST_ADDRESS) ?: ""
.getString(SharedPrefsConstants.HOST_ADDRESS)
tvAppContent.text = "APP升级数据" + SharedPrefsMgr.getInstance(context)
.getString(SharedPrefsConstants.APP_UPGRADE_CONTENT) ?: ""
.getString(SharedPrefsConstants.APP_UPGRADE_CONTENT)
tvCarInfo.text =
"GPS时间${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" +
"GPS时间${(mGnssInfo?.satelliteTime?.times(1000))}\n" +
"自车经纬度:\n${mGnssInfo?.longitude}\n${mGnssInfo?.latitude}\n"
tvCarInfoCopy.text =
"GPS时间${(mGnssInfo?.satelliteTime?.times(1000))?.toLong()}\n" +
"GPS时间${(mGnssInfo?.satelliteTime?.times(1000))}\n" +
"自车经纬度:\n${mGnssInfo?.longitude}\n${mGnssInfo?.latitude}\n"
tvIdentifyInfo.text =
@@ -2305,4 +2300,14 @@ internal class DebugSettingView @JvmOverloads constructor(
tbCarAperture.isChecked = status
}
override fun updateFuncMode(tag: String, boolean: Boolean) {
super.updateFuncMode(tag, boolean)
if (tag == FUNC_MODE_DEMO) {
tbIsDemoMode.isChecked = FunctionBuildConfig.isDemoMode
}
if (tag == FUNC_MODE_RAIN) {
tbIsDemoMode.isChecked = FunctionBuildConfig.isRainMode
}
}
}

View File

@@ -33,6 +33,7 @@ import com.mogo.eagle.core.function.call.vehicle.CallerSweeperModeListenerManage
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.function.hmi.ui.tools.DockerRebootDialog
import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog
import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager
import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.vehicle.SweeperVehicleConfigUtils
@@ -123,24 +124,19 @@ internal class SOPSettingView @JvmOverloads constructor(
scV2XSwitch.setOnCheckedChangeListener { _, isChecked ->
FunctionBuildConfig.v2xMainSwitch = isChecked
hmiAction("SOP V2X总开关, ", isChecked)
Log.i(TAG, "SOP V2X总开关,$isChecked")
if (isChecked) {
//V2N总开关
scV2NSwitch.isChecked = FunctionBuildConfig.v2nMainSwitch
hmiAction("SOP V2N总开关, ", FunctionBuildConfig.v2nMainSwitch)
Log.i(TAG, "SOP V2N总开关, ${FunctionBuildConfig.v2nMainSwitch}")
//V2I总开关
scV2ISwitch.isChecked = HmiBuildConfig.isShowObuV2iView
hmiAction("SOP V2I总开关, ", HmiBuildConfig.isShowObuV2iView)
Log.i(TAG, "SOP V2I总开关, ${HmiBuildConfig.isShowObuV2iView}")
//V2V总开关
scObuV2vView.isChecked = HmiBuildConfig.isShowObuV2vView
hmiAction("SOP V2V总开关, ", HmiBuildConfig.isShowObuV2vView)
Log.i(TAG, "SOP V2V总开关, ${HmiBuildConfig.isShowObuV2vView}")
//obu总开关
scObu.isChecked = obuConnectStatus
hmiAction("SOP obu总开关, ", obuConnectStatus)
Log.i(TAG, "SOP obu总开关, $obuConnectStatus")
if (obuConnectStatus) {
CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP)
}
@@ -148,19 +144,15 @@ internal class SOPSettingView @JvmOverloads constructor(
//V2N总开关
scV2NSwitch.isChecked = false
hmiAction("SOP V2N总开关, ", false)
Log.i(TAG, "SOP V2N总开关, false")
//V2I总开关
scV2ISwitch.isChecked = false
hmiAction("SOP V2I总开关, ", false)
Log.i(TAG, "SOP V2I总开关, false")
//V2V总开关
scObuV2vView.isChecked = false
hmiAction("SOP V2V总开关, ", false)
Log.i(TAG, "SOP V2V总开关, false")
//obu总开关
scObu.isChecked = false
hmiAction("SOP OBU控制总开关, ", false)
Log.i(TAG, "SOP OBU控制总开关, false")
//断开链接
CallerObuApiManager.disConnectObu()
}
@@ -184,32 +176,32 @@ internal class SOPSettingView @JvmOverloads constructor(
//V2N新链路
scNewV2NData.isChecked = FunctionBuildConfig.isNewV2NData
hmiAction("SOP 是否是V2N新链路(云->工控机->App)", FunctionBuildConfig.isNewV2NData)
Log.i(TAG, "SOP 是否是V2N新链路(云->工控机->App), ${FunctionBuildConfig.isNewV2NData}")
//V2N场景进PNC
scV2nPnc.isChecked = FunctionBuildConfig.isV2NPnc
hmiAction("SOP V2N场景进PNC, ", FunctionBuildConfig.isV2NPnc)
Log.i(TAG, "SOP V2N场景进PNC, ${FunctionBuildConfig.isV2NPnc}")
CallerAutoPilotControlManager.sendV2nToPncCmd(FunctionBuildConfig.isV2NPnc)
//绿波通行
scGreenWaveSop.isChecked = HmiBuildConfig.isShowGreenWaveView
hmiAction("SOP obu绿波通行, ", HmiBuildConfig.isShowGreenWaveView)
Log.i(TAG, "SOP obu绿波通行, ${HmiBuildConfig.isShowGreenWaveView}")
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "1".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_GREENWAVE_WARNING,
"1".toByteArray()
)
} else {
//V2N新链路
scNewV2NData.isChecked = false
hmiAction("SOP 是否是V2N新链路(云->工控机->App)", false)
Log.i(TAG, "SOP 是否是V2N新链路(云->工控机->App), false")
//V2N场景进PNC
scV2nPnc.isChecked = false
hmiAction("SOP V2N场景进PNC, ", false)
Log.i(TAG, "SOP V2N场景进PNC, false")
CallerAutoPilotControlManager.sendV2nToPncCmd(false)
//绿波通行
scGreenWaveSop.isChecked = false
hmiAction("SOP obu绿波通行, ", false)
Log.i(TAG, "SOP obu绿波通行, false")
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "0".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_GREENWAVE_WARNING,
"0".toByteArray()
)
}
scNewV2NData.isEnabled = isChecked
scV2nPnc.isEnabled = isChecked
@@ -231,32 +223,32 @@ internal class SOPSettingView @JvmOverloads constructor(
//V2I场景进PNC
scV2iPnc.isChecked = FunctionBuildConfig.isV2IPnc
hmiAction("SOP V2I场景进PNC, ", FunctionBuildConfig.isV2IPnc)
Log.i(TAG, "SOP V2I场景进PNC,${FunctionBuildConfig.isV2IPnc}")
CallerAutoPilotControlManager.sendV2iToPncCmd(FunctionBuildConfig.isV2IPnc)
//闯红灯预警
scRunRedLightSop.isChecked = HmiBuildConfig.isShowRunRedLightView
hmiAction("SOP obu闯红灯预警, ", HmiBuildConfig.isShowRunRedLightView)
Log.i(TAG, "SOP obu闯红灯预警, ${HmiBuildConfig.isShowRunRedLightView}")
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_RUNREDLIGHT_WARNING,
"1".toByteArray()
)
//路侧弱势交通参与者
scObuWeaknessTrafficSop.isChecked = HmiBuildConfig.isShowObuWeaknessTrafficView
hmiAction("SOP obu弱势交通控制, ", HmiBuildConfig.isShowObuWeaknessTrafficView)
Log.i(TAG, "SOP obu弱势交通控制, ${HmiBuildConfig.isShowObuWeaknessTrafficView}")
} else {
//V2I场景进PNC
scV2iPnc.isChecked = false
CallerAutoPilotControlManager.sendV2iToPncCmd(false)
hmiAction("SOP V2I场景进PNC, ", false)
Log.i(TAG, "SOP V2I场景进PNC, false")
//闯红灯预警
scRunRedLightSop.isChecked = false
hmiAction("SOP obu闯红灯预警, ", false)
Log.i(TAG, "SOP obu闯红灯预警, false")
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "0".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_RUNREDLIGHT_WARNING,
"0".toByteArray()
)
//路侧弱势交通参与者
scObuWeaknessTrafficSop.isChecked = false
hmiAction("SOP obu弱势交通控制, ", false)
Log.i(TAG, "SOP obu弱势交通控制, false")
}
scV2iPnc.isEnabled = isChecked
scRunRedLightSop.isEnabled = isChecked
@@ -274,7 +266,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP 是否是V2N新链路(云->工控机->App)", isChecked)
Log.i(TAG, "SOP 是否是V2N新链路(云->工控机->App) ${isChecked}")
FunctionBuildConfig.isNewV2NData = isChecked
}
@@ -285,7 +276,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP V2N场景进PNC, ", isChecked)
Log.i(TAG, "SOP V2N场景进PNC, $isChecked")
CallerAutoPilotControlManager.sendV2nToPncCmd(isChecked)
FunctionBuildConfig.isV2NPnc = isChecked
}
@@ -297,12 +287,17 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP obu绿波通行, ", isChecked)
Log.i(TAG, "SOP obu绿波通行, $isChecked")
HmiBuildConfig.isShowGreenWaveView = isChecked
if (HmiBuildConfig.isShowGreenWaveView) {
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "1".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_GREENWAVE_WARNING,
"1".toByteArray()
)
} else {
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_GREENWAVE_WARNING, "0".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_GREENWAVE_WARNING,
"0".toByteArray()
)
}
}
@@ -313,7 +308,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP V2I场景进PNC, ", isChecked)
Log.i(TAG, "SOP V2I场景进PNC, $isChecked")
CallerAutoPilotControlManager.sendV2iToPncCmd(isChecked)
FunctionBuildConfig.isV2IPnc = isChecked
}
@@ -325,12 +319,17 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP obu闯红灯预警, ", isChecked)
Log.i(TAG, "SOP obu闯红灯预警, $isChecked")
HmiBuildConfig.isShowRunRedLightView = isChecked
if (HmiBuildConfig.isShowRunRedLightView) {
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "1".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_RUNREDLIGHT_WARNING,
"1".toByteArray()
)
} else {
CallerTelematicManager.sendMsgToAllClients(TelematicConstant.OBU_RUNREDLIGHT_WARNING, "0".toByteArray())
CallerTelematicManager.sendMsgToAllClients(
TelematicConstant.OBU_RUNREDLIGHT_WARNING,
"0".toByteArray()
)
}
}
@@ -341,7 +340,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP obu弱势交通控制, ", isChecked)
Log.i(TAG, "SOP obu弱势交通控制, $isChecked")
HmiBuildConfig.isShowObuWeaknessTrafficView = isChecked
}
@@ -352,7 +350,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP obuV2V开关, ", isChecked)
Log.i(TAG, "SOP obuV2V开关, $isChecked")
HmiBuildConfig.isShowObuV2vView = isChecked
}
@@ -364,7 +361,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP OBU控制总开关, ", isChecked)
Log.i(TAG, "SOP OBU控制总开关, $isChecked")
if (isChecked) {
CallerObuApiManager.resetObuIpAddress(MogoObuConst.OBU_DEFAULT_IP)
} else {
@@ -383,7 +379,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scMarkingObstacles.isChecked = FunctionBuildConfig.isPNCWarning
scMarkingObstacles.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 危险障碍物颜色标记开关, ", isChecked)
Log.i(TAG, "SOP 危险障碍物颜色标记开关, $isChecked")
FunctionBuildConfig.isPNCWarning = isChecked
}
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
@@ -394,7 +389,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scRouteDynamicEffect.isChecked = HmiBuildConfig.isShowRouteStrategy
scRouteDynamicEffect.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 引导线动态效果, ", isChecked)
Log.i(TAG, "SOP 引导线动态效果, $isChecked")
HmiBuildConfig.isShowRouteStrategy = isChecked
}
@@ -417,7 +411,6 @@ internal class SOPSettingView @JvmOverloads constructor(
CallerMapUIServiceManager.getMapUIController()?.setIsDrawPointCloud(isChecked)
CallerSopSettingManager.invokePointCloudListener(isChecked)
hmiAction("SOP 是否渲染点云数据, ", isChecked)
Log.i(TAG, "SOP 是否渲染点云数据, $isChecked")
}
//自车光圈
@@ -427,7 +420,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scCarAperture.isChecked = true
CallerMapUIServiceManager.getMapUIController()?.setDisplayAnimEnable(true)
hmiAction("SOP 是否展示自车光圈,", FunctionBuildConfig.isDisplayAnimEnable)
Log.i(TAG, "SOP 是否展示自车光圈,${FunctionBuildConfig.isDisplayAnimEnable}")
} else {
scCarAperture.isChecked = FunctionBuildConfig.isDisplayAnimEnable
}
@@ -435,7 +427,6 @@ internal class SOPSettingView @JvmOverloads constructor(
CallerMapUIServiceManager.getMapUIController()?.setDisplayAnimEnable(isChecked)
CallerSopSettingManager.invokeCarApertureListener(isChecked)
hmiAction("SOP 是否展示自车光圈,", isChecked)
Log.i(TAG, "SOP 是否展示自车光圈,$isChecked")
if (!compoundButton.isPressed) {
return@setOnCheckedChangeListener
}
@@ -451,7 +442,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scObstacleAvoidance.isChecked = FunctionBuildConfig.isDetouring
scObstacleAvoidance.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 绕障类功能开关, ", isChecked)
Log.i(TAG, "SOP 绕障类功能开关, $isChecked")
CallerAutoPilotControlManager.sendDetouring(isChecked)
FunctionBuildConfig.isDetouring = isChecked
}
@@ -463,10 +453,12 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP 演示模式开关, ", !FunctionBuildConfig.isDemoMode)
Log.i(TAG, "SOP 演示模式开关, ${!FunctionBuildConfig.isDemoMode}")
FunctionBuildConfig.isDemoMode = !FunctionBuildConfig.isDemoMode
CallerAutoPilotControlManager.setDemoMode(FunctionBuildConfig.isDemoMode)
CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_DEMO, FunctionBuildConfig.isDemoMode)
CallerHmiViewControlListenerManager.invokeFuncMode(
FUNC_MODE_DEMO,
FunctionBuildConfig.isDemoMode
)
CallerSopSettingManager.invokeDemoModeListener(isChecked)
if (!FunctionBuildConfig.isDemoMode) {
//关闭美化模式时,通知工控机
@@ -485,7 +477,6 @@ internal class SOPSettingView @JvmOverloads constructor(
return@setOnCheckedChangeListener
}
hmiAction("SOP 雨天模式开关, ", isChecked)
Log.i(TAG, "SOP 雨天模式开关, $isChecked")
FunctionBuildConfig.isRainMode = isChecked
CallerAutoPilotControlManager.setRainMode(isChecked)
CallerHmiViewControlListenerManager.invokeFuncMode(FUNC_MODE_RAIN, isChecked)
@@ -502,7 +493,6 @@ internal class SOPSettingView @JvmOverloads constructor(
FunctionBuildConfig.isWeakNetSlowDown = isChecked
CallerAutoPilotControlManager.sendWeakNetSlowDown(isChecked)
hmiAction("SOP 弱网减速停车, ", isChecked)
Log.i(TAG, "SOP 弱网减速停车, $isChecked")
}
//故障减速停车
@@ -511,7 +501,6 @@ internal class SOPSettingView @JvmOverloads constructor(
FunctionBuildConfig.isFaultSlowDown = isChecked
CallerAutoPilotControlManager.sendBreakdownSlowDown(isChecked)
hmiAction("SOP 故障减速停车, ", isChecked)
Log.i(TAG, "SOP 故障减速停车, $isChecked")
}
//融合模式
rgFusionMode.setOnCheckedChangeListener { _, p1 ->
@@ -538,11 +527,13 @@ internal class SOPSettingView @JvmOverloads constructor(
}
}
hmiAction("SOP 融合模式, ", FunctionBuildConfig.fusionMode)
Log.i(TAG, "SOP 融合模式, ${FunctionBuildConfig.fusionMode}")
CallerAutoPilotControlManager.sendFusionMode(FunctionBuildConfig.fusionMode)
}
}
private var overTakeEditText: String = ""
private var overTakeEditDel = false
/**
* 其他类别开关设置
*/
@@ -551,7 +542,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scTrafficLight.isChecked = !HmiBuildConfig.isShowTrafficLightView
scTrafficLight.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 红绿灯标识开关, ", isChecked)
Log.i(TAG, "SOP 红绿灯标识开关, $isChecked")
if (isChecked) {
CallerHmiManager.showTrafficLightView()
} else {
@@ -563,13 +553,18 @@ internal class SOPSettingView @JvmOverloads constructor(
scSpeedLimit.isChecked = HmiBuildConfig.isShowLimitingVelocityView
scSpeedLimit.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 限速标识开关, ", isChecked)
Log.i(TAG, "SOP 限速标识开关, $isChecked")
if (isChecked) {
HmiBuildConfig.isShowLimitingVelocityView = true
CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG, View.VISIBLE)
CallerHmiViewControlListenerManager.invokeVisible(
IViewControlListener.LimitingVelocityView_TAG,
View.VISIBLE
)
} else {
HmiBuildConfig.isShowLimitingVelocityView = false
CallerHmiViewControlListenerManager.invokeVisible(IViewControlListener.LimitingVelocityView_TAG, View.GONE)
CallerHmiViewControlListenerManager.invokeVisible(
IViewControlListener.LimitingVelocityView_TAG,
View.GONE
)
}
}
@@ -577,7 +572,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scIPCReport.isChecked = FunctionBuildConfig.isReportWarning
scIPCReport.setOnCheckedChangeListener { _, isChecked ->
hmiAction("SOP 是否开启异常上报, ", isChecked)
Log.i(TAG, "SOP 是否开启异常上报, $isChecked")
FunctionBuildConfig.isReportWarning = isChecked
}
@@ -603,7 +597,6 @@ internal class SOPSettingView @JvmOverloads constructor(
scShowBagRecordWindow.setOnCheckedChangeListener { _, isChecked ->
FunctionBuildConfig.isShowBagRecordWindow = isChecked
hmiAction("SOP 是否展示被动触发的录包弹窗, ", isChecked)
Log.i(TAG, "SOP 是否展示被动触发的录包弹窗, $isChecked")
}
// 清扫车业务模式切换
@@ -670,7 +663,7 @@ internal class SOPSettingView @JvmOverloads constructor(
}
btnSpeedSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble())
CallerAutoPilotControlManager.sendDetouringSpeed(FunctionBuildConfig.detouringSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("变道绕障的目标障碍物速度阈值设置成功")
hmiAction("SOP 变道绕障的目标障碍物速度阈值设置", "成功")
@@ -680,14 +673,77 @@ internal class SOPSettingView @JvmOverloads constructor(
}
}
ivSpeedOverTakeReduce.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed <= 3) {
ToastUtils.showShort("阈值最小可为3 m/s")
} else {
FunctionBuildConfig.overTakeSpeed -= 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
ivSpeedOverTakeAdd.setOnClickListener {
if (FunctionBuildConfig.overTakeSpeed >= 12.5) {
ToastUtils.showShort("阈值最大可为12.5 m/s")
} else {
FunctionBuildConfig.overTakeSpeed += 0.5f
tvOverTakeLimit.text = "${FunctionBuildConfig.overTakeSpeed} m/s"
}
hmiAction("SOP 超车目标障碍物速度阈值", FunctionBuildConfig.overTakeSpeed)
}
btnSpeedOverTakeSet.setOnClickListener {
val isSuccess =
CallerAutoPilotControlManager.sendOvertakeMaxSpeed(FunctionBuildConfig.overTakeSpeed.toDouble())
if (isSuccess == true) {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置成功")
hmiAction("SOP 超车目标障碍物速度阈值设置", "成功")
} else {
ToastUtils.showShort("SOP 超车目标障碍物速度阈值设置失败")
hmiAction("SOP 超车目标障碍物速度阈值设置", "失败")
}
}
if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)) {
tvSpeedThresholdTitle.visibility = View.GONE
ivSpeedReduce.visibility = View.GONE
tvSpeed.visibility = View.GONE
ivSpeedAdd.visibility = View.GONE
btnSpeedSet.visibility = View.GONE
tvSpeedOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeReduce.visibility = View.GONE
tvOverTakeLimit.visibility = View.GONE
ivSpeedOverTakeAdd.visibility = View.GONE
btnSpeedOverTakeSet.visibility = View.GONE
}
val virtualTaskPullTaskInterval = CallerUnmannedListenerManager.getVirtualTaskPullTaskInterval()
rbFive.isChecked = virtualTaskPullTaskInterval == 5
rbFifteen.isChecked = virtualTaskPullTaskInterval == 15
rbThirty.isChecked = virtualTaskPullTaskInterval == 30
rbFortyFive.isChecked = virtualTaskPullTaskInterval == 45
rgPullTime.setOnCheckedChangeListener { _, checkedId ->
when (checkedId) {
R.id.rbFortyFive -> {
CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(45)
}
R.id.rbThirty -> {
CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(30)
}
R.id.rbFifteen -> {
CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(15)
}
R.id.rbFive -> {
CallerUnmannedListenerManager.dispatchVirtualTaskPullTaskInterval(5)
}
}
}
rgPullTime.visibility =
if(AppIdentityModeUtils.isTaxiDriver(FunctionBuildConfig.appIdentityMode))
View.VISIBLE
else
View.GONE
/**
* 魔方sop运营相关配置
*/
@@ -695,7 +751,10 @@ internal class SOPSettingView @JvmOverloads constructor(
val mf = CallerDevaToolsManager.mofang()
if (mf != null) {
mfStatusLayout.setClickEnabled(true)
mfStatusLayout.setClickedTextAndTag(if (mf.isConnected()) "断开魔方连接" else "开始连接魔方", if (mf.isConnected()) 0 else 1)
mfStatusLayout.setClickedTextAndTag(
if (mf.isConnected()) "断开魔方连接" else "开始连接魔方",
if (mf.isConnected()) 0 else 1
)
mf.registerMoFangStatusListener(TAG, this)
mfStatusLayout.setOnClickCallback {
val tag = it.tag as? Int
@@ -735,17 +794,17 @@ internal class SOPSettingView @JvmOverloads constructor(
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
//添加 业务配置监听
CallerDevaToolsFuncConfigListenerManager.registerDevaToolsFuncConfigListener(
FuncBizConfig.FOUNDATION, TAG, true, this
FuncBizConfig.FOUNDATION, TAG, true, this
)
CallerHmiViewControlListenerManager.addListener(TAG, this)
CallerAutopilotGetParamResponseDispatcher.addListener(TAG, this)
//查询融合模式
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.FUSION_MODE)
CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.OVERTAKE_MAX_SPEED)
//雨天、美化、点云设置同步
CallerSopSettingManager.addListener(TAG, this)
}
@@ -763,7 +822,10 @@ internal class SOPSettingView @JvmOverloads constructor(
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
// 移除 业务配置监听
CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(FuncBizConfig.FOUNDATION, TAG)
CallerDevaToolsFuncConfigListenerManager.unRegisterDevaToolsFuncConfigListener(
FuncBizConfig.FOUNDATION,
TAG
)
CallerHmiViewControlListenerManager.removeListener(TAG)
CallerAutopilotGetParamResponseDispatcher.removeListener(TAG)
CallerDevaToolsManager.mofang()?.unRegisterMoFangStatusListener(this)
@@ -862,9 +924,9 @@ internal class SOPSettingView @JvmOverloads constructor(
* 工控机配置参数获取
*/
override fun onGetParamResp(
header: MessagePad.Header,
getParamResp: MessagePad.SetParamReq,
adasParam: AdasParam
header: MessagePad.Header,
getParamResp: MessagePad.SetParamReq,
adasParam: AdasParam
) {
//融合模式
ThreadUtils.runOnUiThread {
@@ -874,27 +936,26 @@ internal class SOPSettingView @JvmOverloads constructor(
//全融合模式
rgFusionMode.check(R.id.rbFullIntegration)
}
2 -> {
//盲区模式
rgFusionMode.check(R.id.rbBlind)
}
3 -> {
//超视距模式
rgFusionMode.check(R.id.rbBeyondSight)
}
4 -> {
//透传模式
rgFusionMode.check(R.id.rbTransparent)
}
5 -> {
//纯路侧模式
rgFusionMode.check(R.id.rbPureRoad)
}
}
val overTakeSpeed = adasParam.overtakeMaxSpeed
tvOverTakeLimit.text = "$overTakeSpeed m/s"
}
}
}

View File

@@ -15,6 +15,7 @@ import com.mogo.eagle.core.data.deva.bindingcar.IPCUpgradeStateInfo
import com.mogo.eagle.core.data.deva.bizconfig.FuncBizConfig
import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.autopilot.CallerAutopilotCarConfigListenerManager
@@ -251,6 +252,12 @@ internal class AutoPilotAndCheckView @JvmOverloads constructor(
private fun initOchView() {
actvLoginout.onClick {
if (CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING
|| CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING
) {
ToastUtils.showShort("请稍后退出")
return@onClick
}
EventBus.getDefault().post(EventLogout(EventLogout.LOGOUT_TYPE))
//将消息盒子操作记录还原
MsgBoxConfig.setUserRecord(0)

View File

@@ -10,7 +10,7 @@ import com.mogo.eagle.core.data.temp.EventLogout
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.kotlin.onClick
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.util.SharedPrefs
import com.mogo.eagle.core.utilcode.mogo.storage.SharedPrefsMgr
import com.mogo.eagle.core.utilcode.util.StringUtils
import kotlinx.android.synthetic.main.view_och_bus_operation.view.*
import org.greenrobot.eventbus.EventBus
@@ -28,7 +28,7 @@ class BusOperationView @JvmOverloads constructor(
init {
LayoutInflater.from(context).inflate(R.layout.view_och_bus_operation,this,true)
context?.let {
actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account",""))
actvAccountPhone.text = phoneMask(SharedPrefsMgr.getInstance(it).getString("och_account",""))
}
clickPersonalRightView()
clickQRBtn()
@@ -69,7 +69,7 @@ class BusOperationView @JvmOverloads constructor(
override fun onAttachedToWindow() {
super.onAttachedToWindow()
context?.let {
actvAccountPhone.text = phoneMask(SharedPrefs.getInstance(it).getString("och_account",""))
actvAccountPhone.text = phoneMask(SharedPrefsMgr.getInstance(it).getString("och_account",""))
}
}

View File

@@ -1,6 +1,8 @@
package com.mogo.eagle.core.function.hmi.ui.utils
import com.mogo.eagle.core.data.deva.chain.ChainConstant
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.zhjt.service.chain.ChainLog
class HmiActionLog {
@@ -8,12 +10,13 @@ class HmiActionLog {
companion object {
@ChainLog(
linkChainLog = ChainConstant.CHAIN_TYPE_HMI,
linkChainLog = ChainConstant.CHAIN_TYPE_STATUS,
linkCode = ChainConstant.CHAIN_SOURCE_HMI,
nodeAliasCode = ChainConstant.CHAIN_CODE_HMI_ACTIONS,
paramIndexes = [0, 1]
)
fun hmiAction(data: Any, data1: Any) {
CallerLogger.d(M_HMI + data.toString(), data1)
}
}

View File

@@ -103,7 +103,7 @@ class PncActionsView @JvmOverloads constructor(
it.drivingAction.number
)
&& mTrafficLightResult != null
&& getWaitTrafficLightTime().isNotBlank()
&& hasRedLight()
) {
actions += ",预计${getWaitTrafficLightTime()}秒后通过"
} else {
@@ -133,11 +133,15 @@ class PncActionsView @JvmOverloads constructor(
mTrafficLightResult = trafficLightResult
}
private fun hasRedLight(): Boolean {
return mTrafficLightResult != null
&& mTrafficLightResult!!.currentRoadTrafficLight() != null
&& mTrafficLightResult!!.currentRoadTrafficLight()!!.isRed()
&& mTrafficLightResult!!.currentRoadTrafficLight()!!.time() > 0
}
private fun getWaitTrafficLightTime(): String {
return if (mTrafficLightResult != null
&& mTrafficLightResult!!.currentRoadTrafficLight() != null
&& mTrafficLightResult!!.currentRoadTrafficLight()!!.isRed()
) {
return if (hasRedLight()) {
mTrafficLightResult!!.currentRoadTrafficLight()!!.time().toString()
} else {
""

View File

@@ -46,7 +46,7 @@ class SteeringBrakeView(context: Context, attrs: AttributeSet?) : ConstraintLayo
}
override fun onChassisLocationWGS84(gnssInfo: MogoLocation) {
//设置刹车信息,小于默认认为是刹车 //todo 优化sp获取不要每次回调都去调用sp
//设置刹车信息,小于默认认为是刹车 //todo emArrow 优化sp获取不要每次回调都去调用sp
brakeLight =
if (gnssInfo.acceleration < SharedPrefsMgr.getInstance(Utils.getApp()).getFloat(
MoGoConfig.BRAKE_ACCELERATION_THRESHOLD, -2.5f
@@ -61,7 +61,7 @@ class SteeringBrakeView(context: Context, attrs: AttributeSet?) : ConstraintLayo
"---onAutopilotLightSwitchData ---Acceleration = " + gnssInfo.acceleration + "-- brakeLight = " + brakeLight
)
ThreadUtils.runOnUiThread {
if (!isShowTurnLight) { //在不展示转向灯的情况下,展示车辆刹车的动效
if (!isShowTurnLight) { //在不展示转向灯的情况下,展示车辆刹车的动效 todo emArrow 逻辑放入地图
brakeView.visibility = View.VISIBLE
brakeView.setBrakeLight(brakeLight)
} else {

View File

@@ -3,7 +3,6 @@ package com.mogo.eagle.core.function.hmi.ui.vehicle
import android.content.Context
import android.os.CountDownTimer
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
@@ -21,6 +20,8 @@ import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager.saveMsgBox
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_HMI
import com.mogo.eagle.core.utilcode.util.SoundPoolUtils
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.zhjt.mogo.adas.data.bean.MogoReport
@@ -55,13 +56,10 @@ class TakeOverView @JvmOverloads constructor(
}
override fun onAutopilotStatusResponse(state: Int) {
Log.i(TAG, "onAutopilotStatusResponse state=$state")
if(state == 7){
isParallel = true
Log.i(TAG, "onAutopilotStatusResponse isParallel status=true")
}else if(state == 0 || state == 1){
isParallel = false
Log.i(TAG, "onAutopilotStatusResponse isParallel status=false")
}
}
@@ -119,10 +117,10 @@ class TakeOverView @JvmOverloads constructor(
//弱网
MogoReport.Code.Error.EPARALLEL.AICLOUD_NETWORK_WEAK,
MogoReport.Code.Error.EPARALLEL.AICLOUD_CONNECTION_ERROR -> {
Log.i(TAG, "收到弱网上报,当前自驾状态=$isParallel")
CallerLogger.i(M_HMI + TAG, "收到弱网上报,当前自驾状态=$isParallel")
//如果是平行驾驶状态下,提示弱网接管
if(isParallel){
Log.i(TAG,"是平行驾驶状态下,提示弱网接管")
CallerLogger.i(M_HMI + TAG,"是平行驾驶状态下,提示弱网接管")
if(AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode)){
//M1仅做提示音和消息盒子无语音播报和提示接管动画
showM1ParallelDrivingWarning(EventTypeEnumNew.NETWORK_WEAK_EVENT.poiType,

View File

@@ -53,7 +53,6 @@ class BatteryView : View , IMoGoSkinModeChangeListener {
) : super(context, attrs, defStyleAttr) {
}
@SuppressLint("NewApi")
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
setMeasuredDimension(width.toInt(), height.toInt())

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.module.status.MogoStatusManager
@@ -76,6 +77,16 @@ class RomaBusView @JvmOverloads constructor(
}
}
override fun romaViewStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
if(status){
this.visibility = View.VISIBLE
} else {
this.visibility = View.GONE
}
}
}
override fun romaStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
click = true

View File

@@ -6,7 +6,6 @@ import android.os.Looper
import android.os.Message
import android.text.Html
import android.util.AttributeSet
import android.util.Log
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
@@ -91,7 +90,6 @@ class RomaDistanceView @JvmOverloads constructor(
override fun romaDistance(distance: String) {
super.romaDistance(distance)
dis = distance.toDouble().toInt()
Log.i(TAG, "romaDistance:$dis")
}
override fun onDetachedFromWindow() {

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.module.status.MogoStatusManager
import com.mogo.eagle.core.function.api.map.roma.IMoGoRomaListener
@@ -67,6 +68,29 @@ class RomaPassengerView @JvmOverloads constructor(
}
}
override fun romaViewStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
if(status){
this.visibility = View.VISIBLE
} else {
this.visibility = View.GONE
}
}
}
/**
* 外部调用visible时进行判断
*/
fun updateVisible(visible: Boolean){
if(visible){
if(CallerMapRomaListener.isRange()){
this.visibility = View.VISIBLE
}
}else{
this.visibility = View.GONE
}
}
override fun romaStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
click = true

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import androidx.appcompat.content.res.AppCompatResources
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.commons.module.status.MogoStatusManager
@@ -76,6 +77,16 @@ class RomaTaxiView @JvmOverloads constructor(
}
}
override fun romaViewStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
if(status){
this.visibility = View.VISIBLE
} else {
this.visibility = View.GONE
}
}
}
override fun romaStatus(status: Boolean) {
ThreadUtils.runOnUiThread {
click = true

View File

@@ -22,13 +22,13 @@ import com.mogo.eagle.core.function.hmi.R;
public class SpeedChartView extends View {
//中心的文字描述
private String mDes = "KM/H";
private final String mDes = "KM/H";
//根据数据显示的圆弧Paint
private Paint mArcPaint;
//圆弧颜色
private int mArcColor;
//圆弧的画笔的宽度
private float mStrokeWith = getResources().getDimension(R.dimen.module_ext_arcView_stroke_with);
private final float mStrokeWith = getResources().getDimension(R.dimen.module_ext_arcView_stroke_with);
//文字描述的paint
private Paint mTextPaint;
@@ -37,9 +37,9 @@ public class SpeedChartView extends View {
//当前数据
private int currentValue;
//最大数据
private int maxValue = 240;
private final int maxValue = 240;
//圆弧背景的开始和结束间的夹角大小
private float mAngle = 270;
private final float mAngle = 270;
//上次绘制圆弧夹角
private float lastAngle = 0;
@@ -73,13 +73,13 @@ public class SpeedChartView extends View {
mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
//绘制中心的数值
mTextPaint.getTextBounds(mValue, 0, mValue.length(), mRect);
canvas.drawText(mValue, getWidth() / 2, getHeight() / 2 + mRect.height() / 2 - 10, mTextPaint);
canvas.drawText(mValue, getWidth() / 2.0f, getHeight() / 2.0f + mRect.height() / 2.0f - 10, mTextPaint);
mTextPaint.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
//绘制中心文字描述
mTextPaint.setTextSize(getResources().getDimension(R.dimen.module_ext_arcView_des_text_size));
mTextPaint.getTextBounds(mDes, 0, mDes.length(), mRect);
canvas.drawText(mDes, getWidth() / 2, getHeight() * 17 / 20 + mRect.height() / 2, mTextPaint);
canvas.drawText(mDes, getWidth() / 2.0f, getHeight() * 17.0f / 20.0f + mRect.height() / 2.0f, mTextPaint);
}
private void drawArc(Canvas canvas) {

View File

@@ -365,7 +365,7 @@ class SystemVersionView @JvmOverloads constructor(
* HQ、M1 MAP350开始弃用其他车型MAP360开始弃用
*/
override fun onAutopilotStatusRespByQuery(status: SystemStatusInfo.StatusInfo) {
Log.i(TAG, "hdMapVer=" + status.hdMapVer)
CallerLogger.i(M_HMI + TAG, "hdMapVer=" + status.hdMapVer)
//hdMapVer返回示例/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改对原609场景修改为6091、6092、6201、 6202四种细分场景并对通往园区路口改为619
if (status.hdMapVer != null && status.hdMapVer.isNotEmpty()) {
//对地图版本进行截取
@@ -384,7 +384,7 @@ class SystemVersionView @JvmOverloads constructor(
* @param statusInf 数据
*/
override fun onSystemStatus(statusInf: SsmInfo.SsmStatusInf) {
Log.i(TAG, "hdMapVer=" + statusInf.hdMapVer)
CallerLogger.i(M_HMI + TAG, "hdMapVer=" + statusInf.hdMapVer)
//hdMapVer返回示例/home/mogo/autopilot/share/hadmap_engine/data/hadmap_data/db.sqlite|bj|2.2.7|对bus路线上的junction进行修改对原609场景修改为6091、6092、6201、 6202四种细分场景并对通往园区路口改为619
if (statusInf.hdMapVer != null && statusInf.hdMapVer.isNotEmpty()) {
//对地图版本进行截取

View File

@@ -0,0 +1,12 @@
package com.mogo.eagle.core.function.main
import java.util.concurrent.atomic.AtomicBoolean
class ARouterUtils {
companion object {
@JvmField
var isInit = AtomicBoolean(false)
}
}

View File

@@ -1,11 +1,14 @@
package com.mogo.eagle.core.function.main
import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.net.Uri
import android.os.Bundle
import android.provider.Settings
import android.view.*
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
import android.widget.FrameLayout
import androidx.recyclerview.widget.LinearLayoutManager
import com.kwai.koom.base.MonitorManager.addMonitorConfig
@@ -31,7 +34,6 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiFloatViewManager
import com.mogo.eagle.core.function.call.hmi.CallerHmiManager
import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager.getMapUIController
import com.mogo.eagle.core.function.call.setting.CallerRequestActivityHandleManager
import com.mogo.eagle.core.function.call.startup.CallerStartUpManager.initStageTwo
import com.mogo.eagle.core.function.hmi.R
@@ -39,6 +41,7 @@ import com.mogo.eagle.core.function.hmi.ui.widget.StatusBarView
import com.mogo.eagle.core.function.main.modules.MogoModulesManager
import com.mogo.eagle.core.function.main.windowview.FloatingViewHandler
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i
import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant
@@ -50,7 +53,8 @@ import com.mogo.map.listener.IMogoMapListener
import com.mogo.map.listener.MogoMapListenerHandler.Companion.mogoMapListenerHandler
import com.mogo.map.uicontroller.EnumMapUI
import com.zhjt.service.chain.ChainLog
import kotlinx.android.synthetic.main.module_main_activity_main.*
import kotlinx.android.synthetic.main.module_main_activity_main.module_main_id_cover_up
import kotlinx.android.synthetic.main.module_main_activity_main.rvConnectInfo
import java.io.File
@@ -358,7 +362,7 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
}
@ChainLog(
linkChainLog = ChainConstant.CHAIN_TYPE_INIT_STATUS,
linkChainLog = ChainConstant.CHAIN_TYPE_STATUS,
linkCode = ChainConstant.CHAIN_SOURCE_INIT,
nodeAliasCode = ChainConstant.CHAIN_CODE_REQUEST_PERMISSION,
paramIndexes = [0, 1]
@@ -379,10 +383,32 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
if (requestCode == MainPresenter.MOGO_PERMISSION_REQUEST_CODE) {
var isAllGranted = true
// 判断是否所有的权限都已经授予了
for (grant in grantResults) {
val reasong = StringBuffer()
grantResults.forEachIndexed { index, grant ->
if (grant != PackageManager.PERMISSION_GRANTED) {
isAllGranted = false
break
when (permissions[index]) {
Manifest.permission.RECORD_AUDIO -> {
reasong.append("录音机、")
}
Manifest.permission.BLUETOOTH -> {
reasong.append("蓝牙、")
}
Manifest.permission.READ_EXTERNAL_STORAGE -> {
reasong.append("读取外部文件、")
}
Manifest.permission.WRITE_EXTERNAL_STORAGE -> {
reasong.append("写入外部文件、")
}
Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION -> {
if(!reasong.contains("定位")){
reasong.append("定位、")
}
}
else -> {}
}
}
}
if (isAllGranted) {
@@ -390,7 +416,12 @@ open class MainActivity : MvpActivity<MainView?, MainPresenter?>(), MainView,
} else {
// 弹出对话框告诉用户需要权限的原因, 并引导用户去应用权限管理中手动打开权限按钮
if (!isFirst) {
PermissionsDialogUtils.openAppDetails(this, null, REQUEST_CODE_DIALOG)
if (reasong.isNotEmpty()) {
val substring = reasong.substring(0, reasong.length - 2)
PermissionsDialogUtils.openAppDetails(this, substring, REQUEST_CODE_DIALOG)
}else {
PermissionsDialogUtils.openAppDetails(this, null, REQUEST_CODE_DIALOG)
}
isFirst = true
}
}

View File

@@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.main;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_START_UP;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_INIT;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_INIT_STATUS;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_STATUS;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAIN;
@@ -12,7 +12,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import androidx.annotation.NonNull;
@@ -150,7 +149,7 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
}
@ChainLog(
linkChainLog = CHAIN_TYPE_INIT_STATUS,
linkChainLog = CHAIN_TYPE_STATUS,
linkCode = CHAIN_SOURCE_INIT,
nodeAliasCode = CHAIN_CODE_START_UP,
paramIndexes = {0}
@@ -205,7 +204,6 @@ public class MainLauncherActivity extends MainActivity implements IMogoIntentLis
@Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.d(TAG, " --- onConfigurationChanged --");
}
@Override

View File

@@ -5,7 +5,6 @@ import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_MAI
import android.content.Context;
import com.bytedance.boost_multidex.BoostMultiDex;
import com.mogo.cloud.socket.SocketBuildConfig;
import com.mogo.commons.AbsMogoApplication;
import com.mogo.commons.debug.DebugConfig;
import com.mogo.commons.module.MogoModule;
@@ -15,14 +14,12 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.data.constants.MogoServicePaths;
import com.mogo.eagle.core.function.api.chat.biz.ChatConsts;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager;
import com.mogo.eagle.core.function.call.startup.CallerStartUpManager;
import com.mogo.eagle.core.function.main.threadopt.ThreadOptInitializer;
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils;
import com.mogo.eagle.core.utilcode.mogo.AppLaunchTimeUtils;
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger;
import java.lang.reflect.Field;
/**
* 默认初始化一些基础服务配置
*/
@@ -80,6 +77,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
ThreadOptInitializer.init();
/*如果是主进程**/
// if (ProcessUtils.isMainProcess(this)) {
AppLaunchTimeUtils.beginTimeCalculate(AppLaunchTimeUtils.COLD_START);

View File

@@ -77,7 +77,8 @@ public class MainPresenter extends Presenter<MainView> {
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_LOCATION_EXTRA_COMMANDS,
Manifest.permission.ACCESS_FINE_LOCATION
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION,
}, MOGO_PERMISSION_REQUEST_CODE);
}

View File

@@ -2,7 +2,7 @@ package com.mogo.eagle.core.function.main;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_CODE_START_UP;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_SOURCE_INIT;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_INIT_STATUS;
import static com.mogo.eagle.core.data.deva.chain.ChainConstant.CHAIN_TYPE_STATUS;
import static com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.M_HMI;
import android.bluetooth.BluetoothAdapter;
@@ -13,7 +13,6 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
@@ -135,7 +134,7 @@ public class PassengerLauncherActivity extends MainActivity implements IMogoInte
}
@ChainLog(
linkChainLog = CHAIN_TYPE_INIT_STATUS,
linkChainLog = CHAIN_TYPE_STATUS,
linkCode = CHAIN_SOURCE_INIT,
nodeAliasCode = CHAIN_CODE_START_UP,
paramIndexes = {0}
@@ -199,7 +198,6 @@ public class PassengerLauncherActivity extends MainActivity implements IMogoInte
Method isConnectedMethod = BluetoothDevice.class.getDeclaredMethod("isConnected", (Class[]) null);
isConnectedMethod.setAccessible(true);
// boolean isConnected = (boolean) isConnectedMethod.invoke(device, (Object[]) null);
Log.d(TAG, "-- device.getName() = " + device.getName()); //device.getAddress()
if (device.getName().equals("MINI_KEYBOARD")) {
SharedPrefsMgr.getInstance(getContext()).putString("BLUETOOTH", device.getName());
}

View File

@@ -1,29 +0,0 @@
package com.mogo.eagle.core.function.main
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.BarUtils
import com.mogo.eagle.core.widget.TextureVideoView
/**
* 视频广告 TODO 测试用的,可删除
*/
class VideoAdAtc : AppCompatActivity() {
// private lateinit var svpFrame: TextureVideoView
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// setContentView(R.layout.activity_video_ad_atc)
//
// svpFrame = findViewById(R.id.svp_frame)
//
// val url = "android.resource://" + packageName + "/" + R.raw.mogo_ad
// svpFrame.videoPath = url
// svpFrame.start()
//
// BarUtils.hideStatusBarAndSticky(this.window)
// }
}

View File

@@ -150,40 +150,32 @@ public class MogoModulesManager implements MogoModulesHandler {
@Override
public void onDestroy() {
if (mModuleFunctionProviders != null) {
Collection<IMoGoFunctionProvider> modules = mModuleFunctionProviders.values();
if (modules != null) {
for (IMoGoFunctionProvider module : modules) {
try {
CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName());
module.onDestroy();
} catch (Exception e) {
CallerLogger.e(M_HMI + TAG, e + " onDestroy");
}
Collection<IMoGoFunctionProvider> fModules = mModuleFunctionProviders.values();
if (!fModules.isEmpty()) {
for (IMoGoFunctionProvider module : fModules) {
try {
CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName());
module.onDestroy();
} catch (Exception e) {
CallerLogger.e(M_HMI + TAG, e + " onDestroy");
}
}
mModuleNameFunctionProviders.clear();
}
if (mModuleFunctionProviders != null) {
mModuleFunctionProviders.clear();
}
if (mModuleFunctionServerProviders != null) {
Collection<IMoGoFunctionServerProvider> modules = mModuleFunctionServerProviders.values();
if (modules != null) {
for (IMoGoFunctionServerProvider module : modules) {
try {
CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName());
module.onDestroy();
} catch (Exception e) {
CallerLogger.e(M_HMI + TAG, e + " onDestroy");
}
mModuleNameFunctionProviders.clear();
mModuleFunctionProviders.clear();
Collection<IMoGoFunctionServerProvider> fsModules = mModuleFunctionServerProviders.values();
if (!fsModules.isEmpty()) {
for (IMoGoFunctionServerProvider module : fsModules) {
try {
CallerLogger.d(M_HMI + TAG, "destroy module: " + module.getFunctionName());
module.onDestroy();
} catch (Exception e) {
CallerLogger.e(M_HMI + TAG, e + " onDestroy");
}
}
mModuleNameFunctionProviders.clear();
}
if (mModuleFunctionServerProviders != null) {
mModuleFunctionServerProviders.clear();
}
mModuleNameFunctionProviders.clear();
mModuleFunctionServerProviders.clear();
mActivity = null;
}
}

View File

@@ -0,0 +1,77 @@
package com.mogo.eagle.core.function.main.threadopt;
import android.os.Looper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.os.HandlerCompat;
import com.mogo.eagle.core.data.config.FunctionBuildConfig;
import com.mogo.eagle.core.function.api.devatools.perf.IMoGoCpuUsageProvider;
import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager;
import com.mogo.eagle.core.function.main.ARouterUtils;
import com.mogo.thread.opt.core.ThreadManager;
import com.mogo.thread.opt.core.annotation.Keep;
import com.mogo.thread.opt.core.config.ThreadConfig;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Keep
public class ThreadOptInitializer {
private static final ThreadConfig.TaskExecuteListener listener = new ThreadConfig.TaskExecuteListener() {
private volatile boolean recorded = false;
@Override
public boolean isEnabled() {
return FunctionBuildConfig.isSupportJunkDetect;
}
@Override
public void onExecutorBefore(@NonNull ThreadConfig.TaskType taskType, @Nullable Object task, @Nullable String desc) {
if (!recorded && ARouterUtils.isInit.get()) {
IMoGoCpuUsageProvider usage = CallerDevaToolsManager.INSTANCE.usage();
if (usage != null) {
recorded = true;
HandlerCompat.createAsync(Looper.getMainLooper()).post(usage::onMainThreadLaunched);
usage.onProcessLaunched();
}
}
if (recorded) {
IMoGoCpuUsageProvider usage = CallerDevaToolsManager.INSTANCE.usage();
if (usage != null) {
usage.updateOtherThreadTime();
}
}
}
@Override
public void onExecutorAfter(@NonNull ThreadConfig.TaskType taskType, @Nullable Object task, @Nullable String desc) {
if (recorded) {
IMoGoCpuUsageProvider usage = CallerDevaToolsManager.INSTANCE.usage();
if (usage != null) {
usage.updateOtherThreadTime();
}
}
}
@Override
public void onExecutorStateChanged(@NonNull ThreadPoolExecutor threadPoolExecutor, int core, int max, int active, long completed) {}
};
public static void init() {
ThreadConfig.Builder builder = new ThreadConfig.Builder();
builder.minKeepAliveTime(1, TimeUnit.SECONDS);
builder.maxKeepAliveTime(10, TimeUnit.SECONDS);
builder.listener(listener);
ThreadManager.INSTANCE.init(builder);
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -1,16 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/road_video_bg"
tools:context="com.mogo.eagle.core.function.main.VideoAdAtc">
<com.mogo.eagle.core.widget.TextureVideoView
android:id="@+id/svp_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,198 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_804"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#53000000"
app:roundLayoutRadius="@dimen/dp_24"
android:layout_gravity="center_horizontal"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_30"
android:layout_marginTop="@dimen/dp_7"
android:layout_marginBottom="@dimen/dp_7"
>
<!--故障级别图标-->
<ImageView
android:id="@+id/ivFmImageNormal"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_110"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginBottom="@dimen/dp_25"
android:layout_marginStart="@dimen/dp_25"
/>
<!--标题展示故障策略-->
<TextView
android:id="@+id/tvFmTitleNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/ivFmImageNormal"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginStart="@dimen/dp_23"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/sp_32"
/>
<!--时间-->
<TextView
android:id="@+id/tvFmTimeNormal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmTitleNormal"
app:layout_constraintLeft_toLeftOf="@id/tvFmTitleNormal"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:layout_marginTop="@dimen/dp_5"
android:lineSpacingMultiplier="1.2"
/>
<!--展开折叠按钮-->
<TextView
android:id="@+id/tvFmStatusSelect"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="展开"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/sp_24"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
android:layout_marginTop="@dimen/dp_25"
android:layout_marginEnd="@dimen/dp_25"
android:background="@drawable/bg_msg_status_select"
android:drawableStart="@drawable/icon_msg_open"
android:drawablePadding="@dimen/dp_10"
android:paddingStart="@dimen/dp_15"
android:paddingEnd="@dimen/dp_15"
android:paddingTop="@dimen/dp_5"
android:paddingBottom="@dimen/dp_5"
/>
<!--建议操作-->
<TextView
android:id="@+id/tvFmActionNormal"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmTimeNormal"
app:layout_constraintLeft_toLeftOf="@id/tvFmTimeNormal"
app:layout_constraintRight_toRightOf="@id/tvFmStatusSelect"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_5"
android:layout_marginBottom="@dimen/dp_25"
android:textColor="#B3FFFFFF"
android:gravity="start"
android:textSize="@dimen/sp_28"
android:maxLines="1"
android:ellipsize="end"
android:lineSpacingMultiplier="1.2"
/>
<!--时间-->
<TextView
android:id="@+id/tvFmTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/tvFmStatusSelect"
app:layout_constraintBottom_toBottomOf="@id/tvFmStatusSelect"
app:layout_constraintRight_toLeftOf="@id/tvFmStatusSelect"
android:layout_marginEnd="@dimen/dp_20"
android:textColor="#80FFFFFF"
android:textSize="@dimen/sp_24"
android:lineSpacingMultiplier="1.2"
/>
<!--展开时图标-->
<ImageView
android:id="@+id/ivFmImageOpen"
android:layout_width="@dimen/dp_44"
android:layout_height="@dimen/dp_44"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginTop="@dimen/dp_20"
android:layout_marginStart="@dimen/dp_20"
android:visibility="gone"
/>
<!--标题文案为故障策略-->
<TextView
android:id="@+id/tvFmTitleOpen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="@id/ivFmImageOpen"
app:layout_constraintBottom_toBottomOf="@id/ivFmImageOpen"
app:layout_constraintLeft_toRightOf="@id/ivFmImageOpen"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/sp_32"
android:layout_marginStart="@dimen/dp_10"
android:visibility="gone"
/>
<!--发生时间-->
<TextView
android:id="@+id/tvFmTimeOpen"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/ivFmImageOpen"
app:layout_constraintLeft_toLeftOf="@id/ivFmImageOpen"
android:layout_marginTop="@dimen/dp_10"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
/>
<!--建议操作-->
<TextView
android:id="@+id/tvFmActionOpen"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmTimeOpen"
app:layout_constraintLeft_toLeftOf="@id/tvFmTimeOpen"
app:layout_constraintRight_toRightOf="@id/tvFmStatusSelect"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
android:gravity="start"
/>
<!--故障策略-->
<TextView
android:id="@+id/tvFmFaultOpen"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmActionOpen"
app:layout_constraintLeft_toLeftOf="@id/tvFmActionOpen"
app:layout_constraintRight_toRightOf="@id/tvFmStatusSelect"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
android:gravity="start"
/>
<!--故障原因-->
<TextView
android:id="@+id/tvFmReasonOpen"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmFaultOpen"
app:layout_constraintLeft_toLeftOf="@id/tvFmFaultOpen"
app:layout_constraintRight_toRightOf="@id/tvFmStatusSelect"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
android:gravity="start"
/>
<!--后果-->
<TextView
android:id="@+id/tvFmResultOpen"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvFmReasonOpen"
app:layout_constraintLeft_toLeftOf="@id/tvFmReasonOpen"
app:layout_constraintRight_toRightOf="@id/tvFmStatusSelect"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/dp_15"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:lineSpacingMultiplier="1.2"
android:visibility="gone"
android:gravity="start"
/>
</com.mogo.eagle.core.widget.RoundConstraintLayout>

View File

@@ -138,10 +138,11 @@
<TextView
android:id="@+id/tvReportTypeOpen"
android:layout_width="wrap_content"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvReportTimeOpen"
app:layout_constraintLeft_toLeftOf="@id/tvReportTimeOpen"
app:layout_constraintRight_toRightOf="@id/tvStatusSelect"
android:textColor="#B3FFFFFF"
android:textSize="28dp"
android:lineSpacingMultiplier="1.2"

View File

@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundCanClickConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/clFmLayout"
android:layout_width="@dimen/dp_804"
android:layout_height="@dimen/dp_160"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#53000000"
app:roundLayoutRadius="@dimen/dp_24"
android:layout_gravity="center_horizontal"
android:layout_marginTop="@dimen/dp_7"
android:layout_marginBottom="@dimen/dp_7"
>
<ImageView
android:id="@+id/ivBubbleFmImage"
android:layout_width="@dimen/dp_110"
android:layout_height="@dimen/dp_110"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:layout_marginStart="@dimen/dp_25"
android:src="@drawable/icon_fm_stop_normal"
/>
<TextView
android:id="@+id/tvBubbleFmFault"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/ivBubbleFmImage"
app:layout_constraintBottom_toTopOf="@id/tvBubbleFmFaultAction"
android:layout_marginStart="@dimen/dp_25"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/sp_32"
/>
<TextView
android:id="@+id/tvBubbleFmFaultAction"
android:layout_width="@dimen/dp_0"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/tvBubbleFmFault"
app:layout_constraintLeft_toLeftOf="@id/tvBubbleFmFault"
app:layout_constraintRight_toRightOf="@id/tvBubbleFmTime"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="@dimen/dp_6"
android:textColor="#B3FFFFFF"
android:textSize="@dimen/sp_28"
android:maxLines="2"
android:ellipsize="end"
android:gravity="start"
/>
<TextView
android:id="@+id/tvBubbleFmTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@id/tvBubbleFmFault"
app:layout_constraintBottom_toBottomOf="@id/tvBubbleFmFault"
android:layout_marginEnd="@dimen/dp_25"
android:textColor="#80FFFFFF"
android:textSize="@dimen/sp_24"
/>
</com.mogo.eagle.core.widget.RoundCanClickConstraintLayout>

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8"?>
<com.mogo.eagle.core.widget.RoundCanClickConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="@dimen/dp_600"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#8CF5FAFF"
app:roundLayoutRadius="24dp"
android:layout_marginTop="16dp"
android:layout_marginBottom="16dp"
android:paddingStart="@dimen/dp_20"
android:paddingEnd="@dimen/dp_20"
>
<com.mogo.eagle.core.widget.AlignTextView
android:id="@+id/tvPassengerVoiceContent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_32"
android:layout_marginTop="@dimen/dp_54"
android:layout_marginBottom="@dimen/dp_54"
android:layout_marginStart="@dimen/dp_49"
android:layout_marginEnd="@dimen/dp_49"
android:maxWidth="@dimen/dp_502"
android:textStyle="bold"
android:gravity="start"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:visibility="gone"
/>
<com.mogo.eagle.core.widget.AlignTwoTextView
android:id="@+id/tvVoiceRes"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/sp_32"
android:layout_marginTop="@dimen/dp_54"
android:textColor="@color/voice_resp"
android:layout_marginBottom="@dimen/dp_54"
android:layout_marginStart="@dimen/dp_49"
android:layout_marginEnd="@dimen/dp_49"
android:maxWidth="@dimen/dp_502"
android:textStyle="bold"
android:gravity="start"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:visibility="gone"
/>
</com.mogo.eagle.core.widget.RoundCanClickConstraintLayout>

View File

@@ -8,11 +8,11 @@
<TextView
android:id="@+id/tvMsgNotice"
android:layout_width="288dp"
android:layout_height="90dp"
android:layout_width="@dimen/dp_216"
android:layout_height="@dimen/dp_90"
android:text="通知"
android:textColor="@color/msg_box_title_color"
android:textSize="38dp"
android:textSize="@dimen/sp_38"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
android:gravity="center"
@@ -29,15 +29,39 @@
/>
<TextView
android:id="@+id/tvMsgIpcReport"
android:layout_width="288dp"
android:layout_height="90dp"
android:text="车辆系统信息"
android:id="@+id/tvMsgFm"
android:layout_width="@dimen/dp_216"
android:layout_height="@dimen/dp_90"
android:text="FM信息"
android:textColor="#FFFFFFFF"
android:textSize="38dp"
android:textSize="@dimen/sp_38"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/tvMsgNotice"
app:layout_constraintRight_toLeftOf="@id/tvMsgIpcReport"
/>
<View
android:id="@+id/viewFmDivider"
android:layout_width="62.7dp"
android:layout_height="5dp"
android:background="@drawable/bg_msg_box_divider"
app:layout_constraintLeft_toLeftOf="@id/tvMsgFm"
app:layout_constraintRight_toRightOf="@id/tvMsgFm"
app:layout_constraintBottom_toBottomOf="@id/tvMsgFm"
android:visibility="gone"
/>
<TextView
android:id="@+id/tvMsgIpcReport"
android:layout_width="@dimen/dp_216"
android:layout_height="@dimen/dp_90"
android:text="系统信息"
android:textColor="#FFFFFFFF"
android:textSize="@dimen/sp_38"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toRightOf="@id/tvMsgFm"
app:layout_constraintRight_toLeftOf="@id/tvMsgBadCase"
/>
@@ -54,11 +78,11 @@
<TextView
android:id="@+id/tvMsgBadCase"
android:layout_width="288dp"
android:layout_height="90dp"
android:layout_width="@dimen/dp_216"
android:layout_height="@dimen/dp_90"
android:text="录包"
android:textColor="#FFFFFFFF"
android:textSize="38dp"
android:textSize="@dimen/sp_38"
android:gravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toRightOf="parent"
@@ -78,10 +102,10 @@
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvMsgBoxList"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_height="@dimen/dp_0"
app:layout_constraintTop_toBottomOf="@id/tvMsgIpcReport"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginTop="20dp"
android:layout_marginTop="@dimen/dp_20"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>

View File

@@ -24,7 +24,6 @@
android:layout_width="120dp"
android:layout_height="35dp"
android:gravity="center"
android:text="123"
android:textColor="@color/color_FFFFFF"
android:textSize="@dimen/dp_30"
android:textStyle="bold"

View File

@@ -77,4 +77,9 @@
<color name="hmi_check_keyboard_input_field">#FF282F62</color>
<color name="bus_autopilot_text_color_normal">#FFFFFF</color>
<color name="dialog_bg_color_90_percent">#E63B4577</color>
<color name="voice_user_start">#FF005EA0</color>
<color name="voice_user_end">#FF1E32D9</color>
<color name="voice_resp">#243959</color>
</resources>

View File

@@ -94,4 +94,6 @@
<!--清扫车模式切换-->
<string name="sweeper_mode_change_title">清扫业务模式切换提示</string>
<string name="sweeper_mode_change_tips">请确认是否要切换清扫业务切换将自动重启APP?</string>
<string name="pull_time_title">Taxi无人化演练任务拉取时间间隔</string>
</resources>