From 3c6d06978c40206ba1329a59628aa8a3edb8b323 Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 6 May 2025 19:26:51 +0800 Subject: [PATCH] =?UTF-8?q?[8.0.0]=20[fea]=20[=E8=B7=9D=E7=A6=BB=E7=9B=AE?= =?UTF-8?q?=E7=9A=84=E5=9C=B0500m=20=E6=8F=90=E7=A4=BA]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../presenter/BaseTaxiPassengerPresenter.kt | 2 + .../passenger/ui/TaxiPassengerBaseFragment.kt | 8 +- .../passenger/ui/aiview/AIMessageManager.kt | 8 ++ .../passenger/ui/aiview/AIViewModel.kt | 33 +++++--- .../aiview/AutomaticExplorationViewModel.kt | 25 +++++- .../ui/aiview/adapter/AIMessageAdapter.kt | 2 + .../ui/aiview/adapter/AIMessageViewHolder.kt | 76 +++++++++++++++++-- .../ui/aiview/bean/AssistantMessage.kt | 7 ++ .../passenger/ui/evaluate/EvaluateView.kt | 4 - .../src/main/res/layout/taxi_p_evaluate.xml | 44 ++++------- 10 files changed, 156 insertions(+), 53 deletions(-) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt index 857ff12a7d..05fa7351fc 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/presenter/BaseTaxiPassengerPresenter.kt @@ -21,6 +21,7 @@ import com.mogo.och.unmanned.passenger.bean.TaxiPassengerOrdersInServiceQueryRes import com.mogo.och.unmanned.passenger.callback.IOCHTaxiPassengerOrderStatusCallback import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel import com.mogo.och.unmanned.passenger.ui.TaxiPassengerBaseFragment +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager /** * @author: wangmingjun @@ -129,6 +130,7 @@ class BaseTaxiPassengerPresenter(view: TaxiPassengerBaseFragment?) : mView?.showOrHideArrivedEndLayout(false) overMapViewClear() + AIMessageManager.clearData() } TaxiOrderStatusEnum.Cancel -> { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt index d16762a0c9..06eeed44f7 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt @@ -23,6 +23,8 @@ import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R import com.mogo.och.unmanned.passenger.presenter.BaseTaxiPassengerPresenter +import com.mogo.och.unmanned.passenger.ui.aiview.AIMessageManager +import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import com.mogo.och.unmanned.passenger.ui.arrived.ArrivedView import com.mogo.och.unmanned.passenger.ui.bar.LeftBarView import com.mogo.och.unmanned.passenger.ui.bottom.BottomBar @@ -336,7 +338,11 @@ class TaxiPassengerBaseFragment : showOrHide(true,"Debug 按钮") } override fun setEvaluateView(){ - + val automaticExploration = AIMessage.EvaluateData(System.currentTimeMillis().toString(),"",true) + AIMessageManager.post(automaticExploration) + RxUtils.createSubscribe { + AIMessageManager.clearData() + } } /** diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt index 51fea51056..566f8ebb66 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIMessageManager.kt @@ -42,6 +42,12 @@ object AIMessageManager { } } + fun clearData(){ + messageListeners.forEach { callback -> + callback.clear() + } + } + /** * 消息监听器接口。 */ @@ -52,5 +58,7 @@ object AIMessageManager { * @param msg 接收到的消息。 */ fun onReceive(msg: AIMessage) + + fun clear() } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt index 5644067e07..fde35297c8 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AIViewModel.kt @@ -63,9 +63,9 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList "你说", ) - private val orderListener = object : OrderListener{ + private val orderListener = object : OrderListener { override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { - if(order?.orderStatus== TaxiOrderStatusEnum.ArriveAtEnd.code){ + if (order?.orderStatus == TaxiOrderStatusEnum.ArriveAtEnd.code) { synchronized(msgList) { msgList.clear() _messagesFlow.value = msgList.toList() @@ -74,16 +74,16 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList } } - private val locationCallback = object : IMoGoChassisLocationGCJ02Listener{ + private val locationCallback = object : IMoGoChassisLocationGCJ02Listener { override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) { mogoLocation?.let { - V2XRepository.provideLocation(it,0) + V2XRepository.provideLocation(it, 0) } } } - private val wakeUpListener = object :WakeUpListener{ + private val wakeUpListener = object : WakeUpListener { override fun wakeupSuccess() { onWakeUp() WakeUpManager.stopWakeup() @@ -96,8 +96,8 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList } fun setViewCallback(aiView: AiViewCallback) { - OrderModel.setOrderStatusCallback(TAG,orderListener) - OchLocationManager.addGCJ02Listener(TAG,1,locationCallback) + OrderModel.setOrderStatusCallback(TAG, orderListener) + OchLocationManager.addGCJ02Listener(TAG, 1, locationCallback) AIMessageManager.registerListener(this) WakeUpManager.setWakeUpListener(wakeUpListener) mgSpeech.weakUpListener = this @@ -137,7 +137,7 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList WakeUpManager.setWakeUpListener(null) mgSpeech.stopWeakUp() llmResultJob?.cancel() - OrderModel.setOrderStatusCallback(TAG,null) + OrderModel.setOrderStatusCallback(TAG, null) OchLocationManager.removeGCJ02Listener(TAG) super.onCleared() } @@ -154,6 +154,10 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList updateMsg(msg) } + override fun clear() { + clearMsg() + } + private fun handleMsg(newMessage: AIMessage) { val existingIndex = findMessageIndex(newMessage.id) if (existingIndex != -1) { @@ -169,14 +173,14 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList private fun handleExistingMessage(index: Int, newMessage: AIMessage) { val oldMessage = msgList[index] - + if (shouldSkipUpdate(oldMessage, newMessage)) { return } - + newMessage.showTimestamp = oldMessage.showTimestamp msgList[index] = newMessage - + speakMessageIfNeeded(newMessage, isLastMessage = msgList.last() == newMessage) } @@ -310,6 +314,13 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList } } + private fun clearMsg() { + synchronized(msgList) { + msgList.clear() + _messagesFlow.value = msgList.toList() + } + } + fun getQuestionsRandomIndex(): Int { return tipsQuestions.indexOf(tipsQuestions.random()) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt index 0f35b4c1f0..153b91e0d2 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/AutomaticExplorationViewModel.kt @@ -2,12 +2,17 @@ package com.mogo.och.unmanned.passenger.ui.aiview import android.os.CountDownTimer import androidx.lifecycle.ViewModel +import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.bridge.distance.IDistanceListener +import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.data.taxi.BaseOrderBean import com.mogo.och.data.taxi.TaxiOrderStatusEnum import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage @@ -17,7 +22,8 @@ import com.mogo.och.unmanned.taxi.utils.order.OrderModel /** * 自动探查 */ -class AutomaticExplorationViewModel: ViewModel(), OrderListener, IMsgBoxListener { +class AutomaticExplorationViewModel: ViewModel(), OrderListener, IMsgBoxListener, + IDistanceListener { companion object{ private const val TAG = "AutomaticExplorationViewModel" @@ -31,6 +37,7 @@ class AutomaticExplorationViewModel: ViewModel(), OrderListener, IMsgBoxListener fun init(){ OrderModel.setOrderStatusCallback(TAG,this) CallerMsgBoxListenerManager.addListener(TAG,this) + TrajectoryAndDistanceManager.addDistanceListener(TAG, this) } override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { @@ -141,4 +148,20 @@ class AutomaticExplorationViewModel: ViewModel(), OrderListener, IMsgBoxListener AIMessageManager.post(automaticExploration) } + private val orderShowEvaluate = "SHOWEVALUATE" + + override fun distanceCallback(distance: Float) { + if(distance<=500) { + OrderModel.orderBean?.orderNo?.let { + val string = SharedPrefsMgr.getInstance().getString(orderShowEvaluate) + if (StringUtils.isEmpty(string) || !string.equals(it)) { + val automaticExploration = AIMessage.EvaluateData(System.currentTimeMillis().toString(),"",true) + AIMessageManager.post(automaticExploration) + SharedPrefsMgr.getInstance().putString(orderShowEvaluate, it) + } + } + } + + } + } \ 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 40d5794339..bf20535f64 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 @@ -24,6 +24,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa 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)) AIMessage.TYPE_AUTOMATIC_EXPLORATION -> AutomaticExplorationViewHolder(inflater.inflate(R.layout.item_ai_automatic_exploration,parent,false)) + AIMessage.TYPE_EVALUATE -> EvaluateViewViewHolder(inflater.inflate(R.layout.taxi_p_evaluate,parent,false)) else -> throw IllegalArgumentException("Invalid view type") } } @@ -40,6 +41,7 @@ class AIMessageAdapter : ListAdapter(MessageDiffCa is AIMessage.RoadV2NEvent -> AIMessage.TYPE_ROAD_V2N is AIMessage.RoadCrossRoam -> AIMessage.TYPE_ROAD_CROSS is AIMessage.AutomaticExploration -> AIMessage.TYPE_AUTOMATIC_EXPLORATION + is AIMessage.EvaluateData -> AIMessage.TYPE_EVALUATE 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 efcdf5b179..a4576e846b 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,22 +1,19 @@ package com.mogo.och.unmanned.passenger.ui.aiview.adapter +import android.animation.Animator +import android.animation.AnimatorListenerAdapter import android.animation.ObjectAnimator import android.animation.ValueAnimator import android.content.Context import android.graphics.Rect -import android.os.CountDownTimer 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 -import android.widget.RelativeLayout import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.graphics.toColorInt import androidx.recyclerview.widget.LinearLayoutManager @@ -30,17 +27,19 @@ import com.mogo.eagle.core.function.hmi.ui.notice.exploration.AutomaticExplorati 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.kotlin.onClick 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 -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.widget.RoundConstraintLayout -import com.mogo.och.common.module.wigets.OchRoundImageView +import com.mogo.och.common.module.utils.FrameAnimatorContainer +import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import com.mogo.och.unmanned.taxi.passenger.R import com.youth.banner.Banner import com.youth.banner.indicator.CircleIndicator import com.youth.banner.transformer.ScaleInTransformer +import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great +import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low import java.text.SimpleDateFormat import java.util.Date import java.util.Locale @@ -352,6 +351,67 @@ class AutomaticExplorationViewHolder(binding: View) : MessageViewHolder(binding) } + +class EvaluateViewViewHolder(binding: View) : MessageViewHolder(binding) { + private var ivEvaluateGreat: ImageView = binding.findViewById(R.id.iv_evaluate_great) + private var ivEvaluateLow: ImageView = binding.findViewById(R.id.iv_evaluate_low) + private var ivEvaluateGreatAni: FrameAnimatorContainer?=null + + init { + } + + override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { + if(item is AIMessage.EvaluateData){ + if(item.isFirst){ + VoiceNotice.showNotice("行程即将结束咯~小智很想知道您的体验如何呢", AIAssist.LEVEL2) + ivEvaluateGreat.setImageResource(R.drawable.arrive_dest_great_000) + ivEvaluateLow.scaleY = 1f + } + } + ivEvaluateGreat.onClick { + if(item is AIMessage.EvaluateData) { + if (item.isFirst) { + if (ivEvaluateGreatAni == null) { + ivEvaluateGreatAni = FrameAnimatorContainer( + R.array.taxi_p_arrive_dest_great, + 31, + ivEvaluateGreat, + isOnce = true + ) + ivEvaluateGreatAni?.start() + + } else { + ivEvaluateGreatAni?.reStart() + } + ivEvaluateGreatAni?.setOnAnimStopListener(object : + FrameAnimatorContainer.OnAnimationStoppedListener { + override fun AnimationStopped() { + + } + }) + VoiceNotice.showNotice("感谢您的认可,我们会再接再厉", AIAssist.LEVEL2) + item.isFirst = false + } + } + } + ivEvaluateLow.onClick { + if(item is AIMessage.EvaluateData) { + if (item.isFirst) { + ivEvaluateLow.pivotX = (ivEvaluateLow.width / 2).toFloat() + ivEvaluateLow.pivotY = ivEvaluateLow.height.toFloat() + ivEvaluateLow.animate().scaleY(1.2f).scaleX(1.2f).setListener(object : + AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + VoiceNotice.showNotice("感谢您的反馈,我们会继续努力!", AIAssist.LEVEL2) + } + }).duration = 1000 + item.isFirst = false + } + } + } + } +} + private class NoScrollLayoutManager(context: Context?) : LinearLayoutManager(context) { override fun canScrollVertically(): Boolean { return false 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 1c72c3c7d9..e46dac59fe 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 @@ -25,6 +25,7 @@ sealed class AIMessage( const val TYPE_ROAD_V2N = 7 const val TYPE_ROAD_CROSS = 8 const val TYPE_AUTOMATIC_EXPLORATION = 9 + const val TYPE_EVALUATE = 10 } data class Scan( @@ -160,4 +161,10 @@ sealed class AIMessage( override val title: String ): AIMessage(id,title) + data class EvaluateData( + override val id: String, + override val title: String, + var isFirst:Boolean = true + ): AIMessage(id,title) + } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt index 9f4ffb599c..87a1292d32 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/evaluate/EvaluateView.kt @@ -16,7 +16,6 @@ import com.mogo.och.common.module.utils.FrameAnimatorContainer import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.common.module.voice.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_close import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low @@ -94,9 +93,6 @@ class EvaluateView : ConstraintLayout, EvaluateViewModel.EvaluateCallback { isFirat = false } } - iv_close.onClick { - visibility = GONE - } } diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml index 926249621d..df647cb839 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_evaluate.xml @@ -1,8 +1,8 @@ - @@ -10,10 +10,8 @@ - - - - - - \ No newline at end of file + + + \ No newline at end of file