[6.5.0]feat: 通用事件弹框,增加支持 文本/图片/直播拉流 三种形式展示;
refactor: 优化 通过公交站点 计算逻辑; feat: 通过公交站点,增加调式面板按钮 动态控制是否展示 计算范围边界点在高精地图绘制; feat: 增加定义 事件类型 通过公交站点 他车逆行;
This commit is contained in:
@@ -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')
|
||||
}
|
||||
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user