[6.5.0]feat: 通用事件弹框,增加支持 文本/图片/直播拉流 三种形式展示;

refactor: 优化 通过公交站点 计算逻辑;
feat: 通过公交站点,增加调式面板按钮 动态控制是否展示 计算范围边界点在高精地图绘制;
feat: 增加定义 事件类型 通过公交站点 他车逆行;
This commit is contained in:
aibingbing
2024-07-02 16:27:30 +08:00
parent 9b5a965fc2
commit 1df3e6637e
16 changed files with 299 additions and 69 deletions

View File

@@ -81,6 +81,7 @@ dependencies {
compileOnly project(':core:function-impl:mogo-core-function-datacenter')
implementation project(':foudations:mogo-commons')
api project(':core:mogo-core-res')
implementation project(':core:mogo-core-utils')
compileOnly project(':core:mogo-core-function-call')
}

View File

@@ -1382,6 +1382,14 @@ internal class DebugSettingView @JvmOverloads constructor(
HmiBuildConfig.isShowRouteStrategy = isChecked
}
/**
* 通过公交站计算范围边界点 面板控制
*/
tbBusStationStrategyBorderPoint.isChecked = HmiBuildConfig.isShowBusStationStrategyBorderPoint
tbBusStationStrategyBorderPoint.setOnCheckedChangeListener { _, isChecked ->
HmiBuildConfig.isShowBusStationStrategyBorderPoint = isChecked
}
btnThresholdDefine.setOnClickListener {
try {
accelerationThresholdNum = etThreshold.text.toString().toDouble()

View File

@@ -14,19 +14,24 @@ import androidx.lifecycle.lifecycleScope
import com.mogo.commons.utils.MogoAnalyticUtils
import com.mogo.commons.voice.AIAssist
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.data.v2x.RoadV2NEventType
import com.mogo.eagle.core.data.v2x.RoadV2NEventWindowBean
import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener
import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager
import com.mogo.eagle.core.function.call.hmi.CallerRoadV2NEventWindowListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils
import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.eagle.core.utilcode.util.DateTimeUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerEventContent
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerIconHint
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerLivePlay
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.containerImageAndLiveVideo
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.contentImageView
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.ivClose
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.ivV2XImage
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.livePlayView
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.roundRoadV2NEventContainer
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.tvV2XHintContent
import kotlinx.android.synthetic.main.hmi_view_road_v2n_event_window.view.tvV2XTimeStr
@@ -47,7 +52,7 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
const val TAG = "RoadV2NEventWindowView"
const val ANALYTICS_KEY = "hmi_road_event_window_view"
public fun trackEvent(msg: String) {
fun trackEvent(msg: String) {
ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) {
val map: MutableMap<String, Any> = HashMap()
map["msg"] = msg
@@ -69,6 +74,11 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
LayoutInflater.from(context).inflate(R.layout.hmi_view_road_v2n_event_window, this, true)
}
val dismissRunnable = Runnable {
CallerLogger.i(TAG, "dismissRunnable")
visibility = View.GONE
}
private fun initView() {
if (isPassengerScreen) {
val layoutParam =
@@ -85,17 +95,17 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
val padding = AutoSizeUtils.dp2px(context, 37f)
roundRoadV2NEventContainer.setPadding(padding, padding, padding, padding)
val containerEventLayoutParams =
val containerIconHintLayoutParams =
containerIconHint.layoutParams as ConstraintLayout.LayoutParams
containerEventLayoutParams.width = LayoutParams.MATCH_PARENT
containerEventLayoutParams.height = LayoutParams.WRAP_CONTENT
containerEventLayoutParams.setMargins(
containerIconHintLayoutParams.width = LayoutParams.MATCH_PARENT
containerIconHintLayoutParams.height = LayoutParams.WRAP_CONTENT
containerIconHintLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 50f),
AutoSizeUtils.dp2px(context, 40f),
AutoSizeUtils.dp2px(context, 50f),
0
)
containerIconHint.layoutParams = containerEventLayoutParams
containerIconHint.layoutParams = containerIconHintLayoutParams
val ivV2XImageLayoutParams = ivV2XImage.layoutParams as RelativeLayout.LayoutParams
ivV2XImageLayoutParams.width = AutoSizeUtils.dp2px(context, 69f)
@@ -105,22 +115,25 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
val tvV2XHintContentLayoutParams =
tvV2XHintContent.layoutParams as RelativeLayout.LayoutParams
tvV2XHintContentLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 30f), 0, 0, 0
AutoSizeUtils.dp2px(context, 30f), 0,
AutoSizeUtils.dp2px(context, 15f), 0
)
tvV2XHintContent.layoutParams = tvV2XHintContentLayoutParams
tvV2XHintContent.setTextColor(Color.parseColor("#131415"))
val containerLivePlayLayoutParams =
containerLivePlay.layoutParams as ConstraintLayout.LayoutParams
containerLivePlayLayoutParams.width = AutoSizeUtils.dp2px(context, 498f)
containerLivePlayLayoutParams.height = AutoSizeUtils.dp2px(context, 298f)
containerLivePlayLayoutParams.setMargins(
val containerImageAndLiveVideoLayoutParams =
containerImageAndLiveVideo.layoutParams as ConstraintLayout.LayoutParams
containerImageAndLiveVideoLayoutParams.width = AutoSizeUtils.dp2px(context, 498f)
containerImageAndLiveVideoLayoutParams.height = AutoSizeUtils.dp2px(context, 298f)
containerImageAndLiveVideoLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 51f),
AutoSizeUtils.dp2px(context, 30f),
AutoSizeUtils.dp2px(context, 51f),
0
)
containerLivePlay.layoutParams = containerLivePlayLayoutParams
containerImageAndLiveVideo.layoutParams = containerImageAndLiveVideoLayoutParams
contentImageView.setRadius(AutoSizeUtils.dp2px(context, 36f).toFloat())
val tvV2XTimeStrLayoutParams =
tvV2XTimeStr.layoutParams as ConstraintLayout.LayoutParams
@@ -169,17 +182,17 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
val padding = AutoSizeUtils.dp2px(context, 0f)
roundRoadV2NEventContainer.setPadding(padding, padding, padding, padding)
val containerEventLayoutParams =
val containerIconHintLayoutParams =
containerIconHint.layoutParams as ConstraintLayout.LayoutParams
containerEventLayoutParams.width = LayoutParams.MATCH_PARENT
containerEventLayoutParams.height = LayoutParams.WRAP_CONTENT
containerEventLayoutParams.setMargins(
containerIconHintLayoutParams.width = LayoutParams.MATCH_PARENT
containerIconHintLayoutParams.height = LayoutParams.WRAP_CONTENT
containerIconHintLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 30f),
AutoSizeUtils.dp2px(context, 31f),
AutoSizeUtils.dp2px(context, 30f),
0
)
containerIconHint.layoutParams = containerEventLayoutParams
containerIconHint.layoutParams = containerIconHintLayoutParams
val ivV2XImageLayoutParams = ivV2XImage.layoutParams as RelativeLayout.LayoutParams
ivV2XImageLayoutParams.width = AutoSizeUtils.dp2px(context, 84f)
@@ -191,23 +204,25 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
tvV2XHintContentLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 32f),
0,
0,
AutoSizeUtils.dp2px(context, 15f),
0
)
tvV2XHintContent.layoutParams = tvV2XHintContentLayoutParams
tvV2XHintContent.setTextColor(Color.parseColor("#FFFFFF"))
val containerLivePlayLayoutParams =
containerLivePlay.layoutParams as ConstraintLayout.LayoutParams
containerLivePlayLayoutParams.width = AutoSizeUtils.dp2px(context, 540f)
containerLivePlayLayoutParams.height = AutoSizeUtils.dp2px(context, 300f)
containerLivePlayLayoutParams.setMargins(
val containerImageAndLiveVideoLayoutParams =
containerImageAndLiveVideo.layoutParams as ConstraintLayout.LayoutParams
containerImageAndLiveVideoLayoutParams.width = AutoSizeUtils.dp2px(context, 540f)
containerImageAndLiveVideoLayoutParams.height = AutoSizeUtils.dp2px(context, 300f)
containerImageAndLiveVideoLayoutParams.setMargins(
AutoSizeUtils.dp2px(context, 30f),
AutoSizeUtils.dp2px(context, 30f),
AutoSizeUtils.dp2px(context, 30f),
0
)
containerLivePlay.layoutParams = containerLivePlayLayoutParams
containerImageAndLiveVideo.layoutParams = containerImageAndLiveVideoLayoutParams
contentImageView.setRadius(AutoSizeUtils.dp2px(context, 12f).toFloat())
val tvV2XTimeStrLayoutParams =
tvV2XTimeStr.layoutParams as ConstraintLayout.LayoutParams
@@ -256,6 +271,7 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
override fun show(dataBean: RoadV2NEventWindowBean) {
trackEvent("show --> ${dataBean.toString()}")
UiThreadHandler.removeCallbacks(dismissRunnable)
UiThreadHandler.post {
currentEventUUID = dataBean.eventId
ivV2XImage.setImageDrawable(
@@ -271,12 +287,35 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
AIAssist.getInstance(context)
.speakTTSVoiceWithLevel(dataBean.hintStr, AIAssist.LEVEL0)
}
val cityCode =
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode
containerLivePlay.startRoadCameraLive(dataBean.eventId,
dataBean.cameraIp, dataBean.lon, dataBean.lat, cityCode
)
when (dataBean.eventType) {
RoadV2NEventType.TEXT -> {
containerImageAndLiveVideo.visibility = View.GONE
contentImageView.visibility = View.GONE
livePlayView.visibility = View.GONE
}
RoadV2NEventType.IMAGE -> {
containerImageAndLiveVideo.visibility = View.VISIBLE
contentImageView.visibility = View.VISIBLE
livePlayView.visibility = View.GONE
GlideImageLoader.getInstance()
.displayImage(dataBean.contentImageUrl, contentImageView)
}
RoadV2NEventType.LIVE_VIDEO -> {
containerImageAndLiveVideo.visibility = View.VISIBLE
contentImageView.visibility = View.GONE
livePlayView.visibility = View.VISIBLE
val cityCode =
CallerChassisLocationWGS84ListenerManager.getChassisLocationWGS84().cityCode
livePlayView.startRoadCameraLive(
dataBean.eventId,
dataBean.cameraIp, dataBean.lon, dataBean.lat, cityCode
)
}
}
visibility = View.VISIBLE
UiThreadHandler.postDelayed(dismissRunnable, 10 * 1000L)
}
}
@@ -286,8 +325,9 @@ class RoadV2NEventWindowView @JvmOverloads constructor(
if (eventId == currentEventUUID) {
visibility = View.GONE
currentEventUUID = ""
containerLivePlay.stopRoadCameraLive()
livePlayView.stopRoadCameraLive()
trackEvent("dismiss --> eventId=${eventId}, 执行dismiss")
UiThreadHandler.removeCallbacks(dismissRunnable)
} else {
trackEvent("dismiss --> eventId=${eventId}, 跳过dismiss")
}

View File

@@ -34,17 +34,19 @@
android:layout_height="@dimen/dp_69"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:scaleType="fitXY"
tools:src="@drawable/v2x_icon_shigong_zhandao" />
<TextView
android:id="@+id/tvV2XHintContent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginStart="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_10"
android:layout_toRightOf="@+id/ivV2XImage"
android:ellipsize="end"
android:gravity="start"
android:layout_centerVertical="true"
android:maxLines="2"
android:textColor="#131415"
android:textSize="@dimen/dp_32"
@@ -52,17 +54,37 @@
tools:text="前方150米 道路施工 前方150米 道路施工 前方150米 道路施工" />
</RelativeLayout>
<com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventLivePlayView
android:id="@+id/containerLivePlay"
<FrameLayout
android:id="@+id/containerImageAndLiveVideo"
android:layout_width="@dimen/dp_498"
android:layout_height="@dimen/dp_298"
android:layout_marginStart="@dimen/dp_51"
android:layout_marginTop="@dimen/dp_30"
android:layout_marginEnd="@dimen/dp_51"
android:visibility="visible"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/containerIconHint" />
app:layout_constraintTop_toBottomOf="@id/containerIconHint">
<com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventLivePlayView
android:id="@+id/livePlayView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView
android:id="@+id/contentImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:visibility="visible"
app:miv_radius="@dimen/dp_36"
app:miv_shape="round"
tools:src="@drawable/bg_v2x_bus_station" />
</FrameLayout>
<TextView
android:id="@+id/tvV2XTimeStr"
@@ -80,7 +102,7 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/containerLivePlay"
app:layout_constraintTop_toBottomOf="@id/containerImageAndLiveVideo"
tools:text="更新时间10:38:20" />
<ImageView

View File

@@ -1474,6 +1474,18 @@
android:textOn="关闭「引导线动态效果」"
android:textSize="@dimen/dp_24" />
<ToggleButton
android:id="@+id/tbBusStationStrategyBorderPoint"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_columnWeight="1"
android:layout_margin="2dp"
android:gravity="center"
android:padding="@dimen/dp_20"
android:textOff="绘制「通过公交站计算范围边界点」"
android:textOn="关闭「通过公交站计算范围边界点」"
android:textSize="@dimen/dp_24" />
<androidx.appcompat.widget.AppCompatEditText
android:id="@+id/etThreshold"
android:layout_width="wrap_content"