diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/PassengerV2NEventView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/PassengerV2NEventView.kt index a9ad3ddcf8..5e4613c2a8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/PassengerV2NEventView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/PassengerV2NEventView.kt @@ -3,12 +3,19 @@ package com.mogo.eagle.core.function.hmi.ui.v2n import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.data.road.RoadV2NEventWindowBean +import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener +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.util.DateTimeUtils import kotlinx.android.synthetic.main.hmi_view_passenger_v2n_event.view.containerLivePlay +import kotlinx.android.synthetic.main.hmi_view_passenger_v2n_event.view.ivClose import kotlinx.android.synthetic.main.hmi_view_passenger_v2n_event.view.ivPassengerV2XImage import kotlinx.android.synthetic.main.hmi_view_passenger_v2n_event.view.tvPassengerV2XContent import kotlinx.android.synthetic.main.hmi_view_passenger_v2n_event.view.tvPassengerV2XTime @@ -20,7 +27,7 @@ class PassengerV2NEventView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr) { +) : ConstraintLayout(context, attrs, defStyleAttr), IRoadV2NEventWindowListener { companion object { const val TAG = "PassengerV2NEventView" @@ -30,6 +37,8 @@ class PassengerV2NEventView @JvmOverloads constructor( AppIdentityModeUtils.isPassenger(FunctionBuildConfig.appIdentityMode) } + private var currentEventUUID: String = "" + init { LayoutInflater.from(context).inflate(R.layout.hmi_view_passenger_v2n_event, this, true) initView() @@ -42,25 +51,48 @@ class PassengerV2NEventView @JvmOverloads constructor( ) else ContextCompat.getDrawable(context, R.drawable.bg_v2n_event_driver) - //TODO - ivPassengerV2XImage.setImageDrawable( - ContextCompat.getDrawable( - context, - R.drawable.v2x_icon_shigong_zhandao - ) - ) - tvPassengerV2XContent.text = "前方150米 道路施工 前方150米 道路施工 前方150米 道路施工" - tvPassengerV2XTime.text = "更新时间:10:38:20" - containerLivePlay.startPlay("https://video.zhidaozhixing.com/hy/LI_008_070.flv?txSecret=28ece9ad0bd67d06a7d391ed42264a99&txTime=66922502") + ivClose.setOnClickListener { + visibility = View.GONE + } } override fun onAttachedToWindow() { super.onAttachedToWindow() - //CallerMsgBoxEventListenerManager.addListener(TAG,this) + CallerRoadV2NEventWindowListenerManager.addListener(TAG, this) } override fun onDetachedFromWindow() { super.onDetachedFromWindow() - //CallerMsgBoxEventListenerManager.removeListener(TAG) + CallerRoadV2NEventWindowListenerManager.removeListener(TAG) + } + + override fun show(dataBean: RoadV2NEventWindowBean) { + currentEventUUID = dataBean.uuid + + //TODO + ivPassengerV2XImage.setImageDrawable( + ContextCompat.getDrawable( + context, + dataBean.iconResId + ) + ) + tvPassengerV2XContent.text = dataBean.hintStr + tvPassengerV2XTime.text = + "更新时间:${DateTimeUtils.getTimeText(dataBean.timestamp, DateTimeUtils.HH_mm_ss)}" + containerLivePlay.startPlay("https://video.zhidaozhixing.com/hy/LI_008_070.flv?txSecret=28ece9ad0bd67d06a7d391ed42264a99&txTime=66922502") + if (dataBean.isNeedTTS) { + AIAssist.getInstance(context) + .speakTTSVoiceWithLevel(dataBean.hintStr, AIAssist.LEVEL0) + } + visibility = View.VISIBLE + } + + override fun dismiss(eventId: String) { + if (eventId == currentEventUUID) { + visibility = View.GONE + currentEventUUID = "" + //TODO + //停止播放 + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/V2NEventLivePlayView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/V2NEventLivePlayView.kt index b7e93ca65d..094c1520ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/V2NEventLivePlayView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/v2n/V2NEventLivePlayView.kt @@ -186,5 +186,13 @@ class V2NEventLivePlayView @JvmOverloads constructor( override fun onDetachedFromWindow() { super.onDetachedFromWindow() stopLoading() + try { + svpPlayer?.gsyVideoManager?.stop() + } catch (e: Exception) { + CallerLogger.w( + "${SceneConstant.M_HMI}$TAG", + "onDetachedFromWindow, e=${e.message}" + ) + } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png new file mode 100644 index 0000000000..9e3b259a2c Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/hmi_v2n_event_icon_close_passenger.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_passenger_v2n_event.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_passenger_v2n_event.xml index c8e902495b..6fc547d18d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_passenger_v2n_event.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/hmi_view_passenger_v2n_event.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="@dimen/dp_600" android:layout_height="wrap_content" - android:background="@drawable/bg_v2n_event_driver"> + android:background="@drawable/hmi_v2n_event_bg_passenger"> + + \ No newline at end of file diff --git a/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadV2NEventWindowBean.kt b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadV2NEventWindowBean.kt new file mode 100644 index 0000000000..d94a964cbf --- /dev/null +++ b/core/mogo-core-data/src/main/java/com/mogo/eagle/core/data/road/RoadV2NEventWindowBean.kt @@ -0,0 +1,17 @@ +package com.mogo.eagle.core.data.road + +/** + * 路侧道路事件 弹框 + */ +data class RoadV2NEventWindowBean( + var uuid: String, //当前事件弹框 ID, show时生成,用于dismiss时使用 + var timestamp: Long = 0, //事件发生事件戳 + var iconResId: Int, //事件icon resource id + var hintStr: String, //事件提示文案 + var isNeedTTS: Boolean = false, //事件文案是否需要同步tts + var cameraIp: String // 路侧carema ip,用于请求获取拉流地址 +) { + override fun toString(): String { + return "RoadV2NEventWindowBean(id='$uuid', timestamp=$timestamp, iconResId=$iconResId, hintStr='$hintStr', isNeedTTS=$isNeedTTS, cameraIp='$cameraIp')" + } +} \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt new file mode 100644 index 0000000000..8d4244662c --- /dev/null +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/hmi/v2n/IRoadV2NEventWindowListener.kt @@ -0,0 +1,13 @@ +package com.mogo.eagle.core.function.api.hmi.v2n + +import com.mogo.eagle.core.data.road.RoadV2NEventWindowBean + +/** + * 路侧道路事件弹框, 调用接口 + */ +interface IRoadV2NEventWindowListener { + + fun show(dataBean: RoadV2NEventWindowBean) + + fun dismiss(eventId: String) +} \ No newline at end of file diff --git a/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt new file mode 100644 index 0000000000..266ccae0d6 --- /dev/null +++ b/core/mogo-core-function-call/src/main/java/com/mogo/eagle/core/function/call/hmi/CallerRoadV2NEventWindowListenerManager.kt @@ -0,0 +1,37 @@ +package com.mogo.eagle.core.function.call.hmi + +import com.mogo.eagle.core.data.road.RoadV2NEventWindowBean +import com.mogo.eagle.core.function.api.hmi.v2n.IRoadV2NEventWindowListener +import com.mogo.eagle.core.function.call.base.CallerBase +import java.util.UUID + +/** + * 路侧V2N事件弹框 调用者管理类 + */ +object CallerRoadV2NEventWindowListenerManager : CallerBase() { + + fun show( + timestamp: Long, + iconResId: Int, + hintStr: String, + isNeedTTS: Boolean, + cameraIp: String + ): String { + val uuid = UUID.randomUUID().toString() + val data = RoadV2NEventWindowBean(uuid, timestamp, iconResId, hintStr, isNeedTTS, cameraIp) + M_LISTENERS.forEach { + val listener = it.value + listener.show(data) + } + return uuid + } + + fun dismiss(uuid: String) { + M_LISTENERS.forEach { + val listener = it.value + listener.dismiss( + uuid + ) + } + } +} \ No newline at end of file