diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt index 12620386eb..f1f18053bd 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AiView.kt @@ -49,6 +49,7 @@ class AiView @JvmOverloads constructor( private var viewModel:AIViewModel?=null private var pncActionsModel:PNCActionsViewModel ?= null private var roadV2NEventModel:RoadV2NEventViewModel ?= null + private var roadCrossRoamModel:RoadCrossRoamViewModel ?= null private var aiAnimator: BigFrameAnimatorContainer?=null private var aiAnimatorBg: BigFrameAnimatorContainer?=null @@ -230,6 +231,10 @@ class AiView @JvmOverloads constructor( ViewModelProvider(it)[RoadV2NEventViewModel::class.java] } roadV2NEventModel?.init() + roadCrossRoamModel = findViewTreeViewModelStoreOwner()?.let{ + ViewModelProvider(it)[RoadCrossRoamViewModel::class.java] + } + roadCrossRoamModel?.init(context) } private fun startListInfo(){ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt new file mode 100644 index 0000000000..c7f836ed4d --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/RoadCrossRoamViewModel.kt @@ -0,0 +1,73 @@ +package com.mogo.och.unmanned.passenger.ui.aiview + +import android.content.Context +import android.view.View +import androidx.lifecycle.ViewModel +import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.function.api.map.road.IMoGoMapRoadListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.autopilot.CallerServicesEventManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiViewControlListenerManager +import com.mogo.eagle.core.function.call.map.CallerMapIdentifyManager +import com.mogo.eagle.core.function.call.map.CallerMapRoadListenerManager +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage + +class RoadCrossRoamViewModel: ViewModel(), IMoGoMapRoadListener { + + companion object{ + const val TAG = "RoadCrossRoamViewModel" + } + + private lateinit var mContext: Context + + fun init(context: Context){ + CallerMapRoadListenerManager.addListener(TAG, this) + mContext = context + } + + override fun onCrossDevice(trigger: Boolean) { + super.onCrossDevice(trigger) + if(trigger){ + show() + } + } + + private fun show(){ + // 没有路线不做提示 + if (CallerAutoPilotStatusListenerManager.getLineId() == 0L) { + CallerLogger.d(TAG, "没有路线不做提示") + return + } + // 处于漫游模式下不做处理 + if (CallerMapIdentifyManager.roam.second) { + if (CallerMapIdentifyManager.roam.first != TAG) { + ToastUtils.showLong("正在漫游中,不展示路口漫游") + } + CallerLogger.d(TAG, "正在漫游中,不展示路口漫游") + return + } + // 首页被遮挡不做提示 + if (!CallerHmiViewControlListenerManager.getMainPageVisible()) { + CallerLogger.d(TAG, "attachView return , mainPageVisible is false") + return + } + // 没有路侧设备,不做处理 + CallerLogger.d(TAG, "命中,attachView") + val cross = CallerMapRoadListenerManager.getCrossEndInfo() + if (cross.isNullOrEmpty()) { + CallerLogger.d(TAG, "未触发,路口ID:$cross") + return + } + if (AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + val disStr = "为您提供路口全息影像,助力出行" + AIAssist.getInstance(mContext).speakTTSVoiceWithLevel(disStr, AIAssist.NEW_LEVEL_2) + } + CallerServicesEventManager.updateServicesNum(CallerServicesEventManager.ServiceType.ROAD) + AIMessageManager.post(AIMessage.RoadCrossRoam(System.currentTimeMillis().toString(),"")) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt index dc897f88ec..5655944627 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageAdapter.kt @@ -22,6 +22,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa AIMessage.TYPE_QA -> QAViewHolder(inflater.inflate(R.layout.item_ai_msg_qa, parent, false)) AIMessage.TYPE_PNC_ACTION -> PNCActionViewHolder(inflater.inflate(R.layout.item_ai_pnc_action,parent,false)) AIMessage.TYPE_ROAD_V2N -> RoadV2NEventViewHolder(inflater.inflate(R.layout.item_ai_road_v2n_event,parent,false)) + AIMessage.TYPE_ROAD_CROSS ->RoadCrossRoamViewHolder(inflater.inflate(R.layout.item_ai_road_cross_roam,parent,false)) else -> throw IllegalArgumentException("Invalid view type") } } @@ -36,6 +37,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa is AIMessage.Warning -> AIMessage.TYPE_WARNING is AIMessage.PNCAction -> AIMessage.TYPE_PNC_ACTION is AIMessage.RoadV2NEvent -> AIMessage.TYPE_ROAD_V2N + is AIMessage.RoadCrossRoam -> AIMessage.TYPE_ROAD_CROSS else -> AIMessage.TYPE_EVENT } } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt index 6fabe4cc6e..ccd78303db 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/adapter/AIMessageViewHolder.kt @@ -1,11 +1,15 @@ package com.mogo.och.unmanned.passenger.ui.aiview.adapter import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.graphics.Rect import android.text.TextUtils import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.view.animation.LinearInterpolator import android.widget.FrameLayout import android.widget.ImageView import android.widget.LinearLayout @@ -14,12 +18,15 @@ import android.widget.TextView import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.graphics.toColorInt +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.v2x.RoadV2NEventType import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84ListenerManager import com.mogo.eagle.core.function.hmi.ui.v2n.RoadV2NEventLivePlayView +import com.mogo.eagle.core.function.view.MapRoamView +import com.mogo.eagle.core.function.view.RoadCrossRoamListAdapter import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView import com.mogo.eagle.core.utilcode.util.DateTimeUtils @@ -235,7 +242,66 @@ class RoadV2NEventViewHolder(binding: View) : MessageViewHolder(binding){ } +class RoadCrossRoamViewHolder(binding: View) : MessageViewHolder(binding){ + private var ivZhiRoadRoamSet: ImageView = binding.findViewById(R.id.ivZhiRoadRoamSet) + private var ivZhiRoadRoamView: ImageView = binding.findViewById(R.id.ivZhiRoadRoamView) + private var tvRoadRoamTitle: TextView = binding.findViewById(R.id.tvRoadRoamTitle) + private var mapRoamView: MapRoamView = binding.findViewById(R.id.mapRoamView) + private var clScanningBg: ConstraintLayout = binding.findViewById(R.id.clScanningBg) + private var ivCoverRoam: ImageView = binding.findViewById(R.id.ivCoverRoam) + private var lvRoadCrossRoamTip: RecyclerView = binding.findViewById(R.id.lvRoadCrossRoamTip) + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.RoadCrossRoam){ + lvRoadCrossRoamTip.layoutManager = NoScrollLayoutManager(itemView.context) + lvRoadCrossRoamTip.addItemDecoration(object : RecyclerView.ItemDecoration() { + override fun getItemOffsets( + outRect: Rect, + view: View, + parent: RecyclerView, + state: RecyclerView.State + ) { + super.getItemOffsets(outRect, view, parent, state) + outRect.bottom = 24 + } + }) + mapRoamView.openRoam() + lvRoadCrossRoamTip.adapter = RoadCrossRoamListAdapter(itemView.context, true) + // 创建横向移动的动画 + val animator = + ObjectAnimator.ofFloat( + ivCoverRoam, + "translationX", + -120f, + 540f + ) + animator.duration = 1500 // 设置动画持续时间,单位为毫秒 + animator.repeatCount = 6 + animator.repeatMode = ValueAnimator.RESTART // 设置动画来回移动 + animator.start() + val rotationAnim = ObjectAnimator.ofFloat(ivZhiRoadRoamView, "rotation", 0f, 360f) + rotationAnim.repeatCount = 9 + rotationAnim.repeatMode = ValueAnimator.RESTART + rotationAnim.duration = 1000 + rotationAnim.interpolator = LinearInterpolator() + rotationAnim.start() + tvRoadRoamTitle.setTextColor(itemView.context.getColor(R.color.color_131415)) + + } + } + +} + +private class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { + override fun canScrollVertically(): Boolean { + return false + } + + override fun canScrollHorizontally(): Boolean { + return false + } +} fun interface OnItemClickListener { fun onItemClick(item: AIMessage, position: Int) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt index 3c24dedc4c..d1ec4be663 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AssistantMessage.kt @@ -23,6 +23,7 @@ sealed class AIMessage( const val TYPE_WARNING = 5 const val TYPE_PNC_ACTION = 6 const val TYPE_ROAD_V2N = 7 + const val TYPE_ROAD_CROSS = 8 } data class Scan( @@ -148,4 +149,9 @@ sealed class AIMessage( var lat: Double, //事件坐标-纬度 ):AIMessage(id,title,tts) + data class RoadCrossRoam( + override val id: String, + override val title: String + ): AIMessage(id,title) + } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png new file mode 100644 index 0000000000..206f9c8d9e Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/icon_cover_line.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml new file mode 100644 index 0000000000..d6ca80b3a9 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_road_cross_roam.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml index 486a23ac03..46f75fa938 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml @@ -74,27 +74,6 @@ app:fusionLightUser="passenger" /> - - - - - -