diff --git a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt index 7b3f59e796..41e7d46828 100644 --- a/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt +++ b/OCH/charter/driver/src/main/java/com/magic/mogo/och/charter/model/DriverM1Model.kt @@ -1,7 +1,6 @@ package com.magic.mogo.och.charter.model import android.content.Context -import android.net.ConnectivityManager import com.alibaba.android.arouter.utils.TextUtils import com.amap.api.maps.model.LatLng import com.elegant.network.utils.GsonUtil @@ -13,8 +12,6 @@ import com.magic.mogo.och.charter.callback.IDriverM1ControllerStatusCallback import com.magic.mogo.och.charter.constant.CharterConst import com.magic.mogo.och.charter.manager.CharterTrajectoryManager import com.magic.mogo.och.charter.net.DriverM1ServiceManager -import com.mogo.commons.module.intent.IMogoIntentListener -import com.mogo.commons.module.intent.IntentManager import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters @@ -66,7 +63,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.DPOrderClosedMsg import com.mogo.och.common.module.manager.stopside.StopSideManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.* -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.data.bean.LineInfo /** @@ -663,7 +660,7 @@ class DriverM1Model { DriverM1ServiceManager.queryCurrentServiceStatus(mContext ,object: OchCommonServiceCallback { override fun onSuccess(data: QueryBusinessStatusResponse?) { - if (data == null || data.code != 0 || data.data.equals(mCurrentBusinessStatus)){ + if (data == null || data.code != 0 || data.data == mCurrentBusinessStatus){ d(SceneConstant.M_CHARTER_D + TAG, "data is null or data not change" ) return } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt index c41d5cf874..5c2b04d58c 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/CharterPassengerModel.kt @@ -55,7 +55,7 @@ import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.PinYinUtil -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import io.reactivex.Observable import io.reactivex.disposables.Disposable import io.reactivex.schedulers.Schedulers diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/MusicModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/MusicModel.kt index c035b0ed4a..d35a67219a 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/MusicModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/model/MusicModel.kt @@ -2,15 +2,16 @@ package com.mogo.och.charter.passenger.model import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.utilcode.util.TAG -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.PlayState import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.common.module.biz.media.MediaManager import com.mogo.och.common.module.utils.RxUtils import io.reactivex.disposables.Disposable object MusicModel : IOchAutopilotStatusListener, IOrderStatusChangeListener { + + private const val TAG = "MusicModel" + init { CharterPassengerModel.setStatusChangeListener(TAG,this) //自动驾驶状态监听 @@ -23,36 +24,21 @@ object MusicModel : IOchAutopilotStatusListener, IOrderStatusChangeListener { override fun onAutopilotStatusResponse(state: Int) { + // 自驾状态变化 第一次进入自驾 如果音乐属于暂停状态 开始播放 如果没有播放就播放第一首 if(state==IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) { val string = SharedPrefsMgr.getInstance().getString(startMusicWithOrderKey) if (string == null) { CharterPassengerModel.getCurrentOrderInfo()?.let { RxUtils.disposeSubscribe(stopMusicDisposable) SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) - AuditionManager.musicList.forEach {music-> - if(music.state==PlayState.Pause){ - AuditionManager.toggle(music) - return - } - } - if(!AuditionManager.isPlaying()) { - AuditionManager.playFirst() - } + MediaManager.Audition.replayOrplayFirst() } } else { CharterPassengerModel.getCurrentOrderInfo()?.let { if (it.orderNo != string) { RxUtils.disposeSubscribe(stopMusicDisposable) SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) - AuditionManager.musicList.forEach {music-> - if(music.state==PlayState.Pause){ - AuditionManager.toggle(music) - return - } - } - if(!AuditionManager.isPlaying()) { - AuditionManager.playFirst() - } + MediaManager.Audition.replayOrplayFirst() } } } @@ -69,7 +55,7 @@ object MusicModel : IOchAutopilotStatusListener, IOrderStatusChangeListener { CharterPassengerModel.getCurrentOrderInfo()?.let { RxUtils.disposeSubscribe(stopMusicDisposable) stopMusicDisposable = RxUtils.createSubscribe(60_000) { - AuditionManager.stop() + MediaManager.Audition.stop() } } } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt index 89fbd4c520..c94d8a673c 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/presenter/BusPassengerPresenter.kt @@ -39,7 +39,7 @@ import com.mogo.och.bridge.device.callback.LightAirconditionDoorCallback import com.mogo.och.common.module.manager.stopside.OCHPlanningActionsCallback import com.mogo.och.common.module.manager.stopside.StopSideStatus import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.common.module.wigets.toast.ToastCharterUtils import me.jessyan.autosize.utils.AutoSizeUtils import java.util.concurrent.ConcurrentHashMap diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/receive/DriverMessage.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/receive/DriverMessage.kt index 3ce7503eb8..ed2160557b 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/receive/DriverMessage.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/receive/DriverMessage.kt @@ -1,6 +1,5 @@ package com.mogo.och.charter.passenger.receive -import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -21,7 +20,7 @@ import com.mogo.och.common.module.manager.socket.lan.bean.ChangeDestMsg import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.SoundPoolHelper -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.skin.utils.SkinResources object DriverMessage: IReceivedMsgListener { diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/bottom/impl/MusicCheckView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/bottom/impl/MusicCheckView.kt index 5b88a42404..59d392c0e3 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/bottom/impl/MusicCheckView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/bottom/impl/MusicCheckView.kt @@ -14,9 +14,10 @@ import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition import com.mogo.och.charter.passenger.R -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import kotlinx.android.synthetic.main.charter_p_bottom_music.view.aciv_center_image import kotlinx.android.synthetic.main.charter_p_bottom_music.view.actv_title import kotlinx.android.synthetic.main.charter_p_bottom_music.view.aciv_playing @@ -27,7 +28,7 @@ open class MusicCheckView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), AuditionManager.MusicDataChangeListener { +) : ConstraintLayout(context, attrs, defStyleAttr), MusicDataChangeListener { companion object { private const val TAG = "StopSiteView" @@ -87,11 +88,12 @@ open class MusicCheckView @JvmOverloads constructor( actv_title.setTextColor(context.getColor(R.color.charter_p_090f28)) aciv_center_image.setImageResource(normalDrawable) - if(AuditionManager.isPlaying()){ + + if(MediaManager.Audition.isPlaying()==true){ default_info.visibility = View.GONE aciv_playing.visibility = View.VISIBLE aciv_playing_bg.visibility = View.VISIBLE - AuditionManager.musicDataPlaying?.let { + MediaManager.Audition.getPlaying()?.let { Glide.with(context) .load(it.coverHeadImageUrl) .apply(RequestOptions().placeholder(R.drawable.charter_p_music_bg_relax_head)) @@ -140,7 +142,7 @@ open class MusicCheckView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - AuditionManager.addDataChangeListener(TAG,this) + MediaManager.Audition.addListener(TAG,this) parent?.let { if (parent is ConstraintLayout) { if (backageViewId > 0) { @@ -155,7 +157,7 @@ open class MusicCheckView @JvmOverloads constructor( override fun onDetachedFromWindow() { super.onDetachedFromWindow() - AuditionManager.removeDataChangeListener(TAG) + MediaManager.Audition.removeListener(TAG) } override fun updateState(oldData: MusicData?, musicData: MusicData) { diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/dialogfragment/NoviceGuidanceFragment.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/dialogfragment/NoviceGuidanceFragment.kt index 95ef2ead38..7b2eae26b7 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/dialogfragment/NoviceGuidanceFragment.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/dialogfragment/NoviceGuidanceFragment.kt @@ -20,7 +20,7 @@ import com.mogo.och.charter.passenger.R import com.mogo.och.charter.passenger.model.CharterPassengerModel import com.mogo.och.charter.passenger.presenter.BusPassengerPresenter import com.mogo.och.charter.passenger.presenter.CharterPassengerNoviceGuidancePresenter -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.skin.utils.SkinResources import kotlinx.android.synthetic.main.charter_p_novice_guidance_fragment.include_welcome import kotlinx.android.synthetic.main.charter_p_novice_guidance_fragment.include_welcome_01 diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/MusicControlView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/MusicControlView.kt index e149293200..466c206b8a 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/MusicControlView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/MusicControlView.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.och.charter.passenger.R import com.mogo.och.charter.passenger.ui.music.list.MusicListView -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MusicData import kotlinx.android.synthetic.main.charter_p_music.view.mlv_list import kotlinx.android.synthetic.main.charter_p_music.view.mpv_music_info diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListItemAdapter.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListItemAdapter.kt index 9db6901ac1..52a5a4598a 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListItemAdapter.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListItemAdapter.kt @@ -13,8 +13,8 @@ import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.charter.passenger.R -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import me.jessyan.autosize.AutoSizeCompat /** @@ -83,7 +83,7 @@ class MusicListItemAdapter( holder.musicName.setTypeface(null,Typeface.NORMAL) } - if (musicData.state==PlayState.Playing) { + if (musicData.state== PlayState.Playing) { holder.musicPlayState.visibility = View.VISIBLE }else{ holder.musicPlayState.visibility = View.GONE @@ -105,7 +105,7 @@ class MusicListItemAdapter( notifyItemInserted(dataList.size) } - fun upDateMusicData(oldData: MusicData?,musicData: MusicData) { + fun upDateMusicData(oldData: MusicData?, musicData: MusicData) { dataList.forEachIndexed { index, musicDataIn -> if (musicDataIn.id==musicData.id) { musicDataIn.state = musicData.state @@ -143,7 +143,7 @@ class MusicListItemAdapter( } interface ClickListener { - fun clickItem(musicData: MusicData,position: Int) + fun clickItem(musicData: MusicData, position: Int) } } \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListView.kt index df45abfece..73c55683fc 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListView.kt @@ -9,7 +9,7 @@ import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.charter.passenger.R -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MusicData import kotlinx.android.synthetic.main.charter_p_music_list.view.rv_music_list class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillback, @@ -64,7 +64,7 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb lineAdapter.addOneData(it) } - override fun updateMusicData(oldData: MusicData?,musicData: MusicData) { + override fun updateMusicData(oldData: MusicData?, musicData: MusicData) { lineAdapter.upDateMusicData(oldData,musicData) CallerLogger.d(TAG,"${Thread.currentThread().name}----更新数据${oldData}-----${musicData}") } @@ -73,7 +73,7 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb lineAdapter.setSelect(nextMusicData,preMusicData) } - override fun clickItem(musicData: MusicData,position: Int) { + override fun clickItem(musicData: MusicData, position: Int) { // 通知主页面去显示详情 this.checkListener?.checkItem(musicData) } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt index ae13884abf..0679c371bf 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/list/MusicListViewModel.kt @@ -3,29 +3,23 @@ package com.mogo.och.charter.passenger.ui.music.list import androidx.lifecycle.ViewModel import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData -class MusicListViewModel : ViewModel(), - AuditionManager.MusicDataChangeListener { +class MusicListViewModel : ViewModel(), MusicDataChangeListener { private val TAG = MusicListViewModel::class.java.simpleName private var viewCallback: IMusicListViewCaLillback? = null - init { - - } - fun setDistanceCallback(viewCallback: IMusicListViewCaLillback) { this.viewCallback = viewCallback - viewCallback.addAllData(AuditionManager.musicList) - CallerLogger.d(TAG,"初始化音乐${AuditionManager.musicList.size}") - AuditionManager.addDataChangeListener(TAG,this) + MediaManager.Audition.addListener(TAG,this) } override fun onCleared() { - AuditionManager.removeDataChangeListener(TAG) + MediaManager.Audition.removeListener(TAG) super.onCleared() this.viewCallback = null } @@ -33,10 +27,15 @@ class MusicListViewModel : ViewModel(), interface IMusicListViewCaLillback { fun addAllData(data:MutableList) fun addOneData(it: MusicData) - fun updateMusicData(oldData: MusicData?,musicData: MusicData) + fun updateMusicData(oldData: MusicData?, musicData: MusicData) fun upDateSelectMusic(nextMusicData: MusicData, preMusicData: MusicData?) } + override fun onDataDis(musicList: MutableList) { + viewCallback?.addAllData(musicList) + CallerLogger.d(TAG,"初始化音乐${musicList.size}") + } + override fun addOneData(it: MusicData) { CallerLogger.d(TAG,"添加音乐:${it.songName}--${it.path}") UiThreadHandler.post({ @@ -44,7 +43,7 @@ class MusicListViewModel : ViewModel(), }, UiThreadHandler.MODE.QUEUE) } - override fun updateState(oldData: MusicData?,musicData: MusicData) { + override fun updateState(oldData: MusicData?, musicData: MusicData) { UiThreadHandler.post({ viewCallback?.updateMusicData(oldData, musicData) }, UiThreadHandler.MODE.QUEUE) diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingView.kt index 9c2c870f7b..48ce0fcfb9 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingView.kt @@ -17,8 +17,8 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.TimeTransformUtils import com.mogo.och.charter.passenger.R import com.mogo.och.charter.passenger.ui.music.list.MusicListViewModel -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.mogo.och.common.module.utils.DateTimeUtil import kotlinx.android.synthetic.main.charter_p_music_playing.view.iv_music_cover import kotlinx.android.synthetic.main.charter_p_music_playing.view.iv_music_cover_bg @@ -123,7 +123,7 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi tv_tag.text = musicData.tag.first() tv_playing_time.text = DateTimeUtil.second2Time(0) tv_playing_during.text = TimeTransformUtils.stringForTime(musicData.duration.toInt()) - if(musicData.state==PlayState.Playing){ + if(musicData.state== PlayState.Playing){ iv_toggle.setImageResource(R.drawable.charter_p_music_pause) startAnimal() }else{ @@ -168,7 +168,7 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi } override fun setPlayOrpause(it: MusicData) { - if(it.state==PlayState.Playing){ + if(it.state== PlayState.Playing){ iv_toggle.setImageResource(R.drawable.charter_p_music_pause) startAnimal() }else{ @@ -193,7 +193,7 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi tv_playing_during.text = TimeTransformUtils.stringForTime(duration.toInt()) } - override fun setSelect(currentMusicData: MusicData,preMusicData: MusicData?) { + override fun setSelect(currentMusicData: MusicData, preMusicData: MusicData?) { viewListModel?.selectMusic(currentMusicData,preMusicData) } diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt index 17e3061624..d4acba8349 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/music/playing/MusicPlayingViewModel.kt @@ -3,32 +3,39 @@ package com.mogo.och.charter.passenger.ui.music.playing import androidx.lifecycle.ViewModel import com.elegant.utils.UiThreadHandler import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData -class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListener { +class MusicPlayingViewModel : ViewModel(), MusicDataChangeListener { private val TAG = MusicPlayingViewModel::class.java.simpleName private var viewCallback: IMusicPlayingViewCallback? = null - private var checkMusicData:MusicData?=null + private var checkMusicData: MusicData?=null - init { - - } + private val musicDataList = mutableListOf() fun setDistanceCallback(viewCallback: IMusicPlayingViewCallback) { this.viewCallback = viewCallback - AuditionManager.addDataChangeListener(TAG,this) + MediaManager.Audition.addListener(TAG,this) } override fun onCleared() { super.onCleared() - AuditionManager.removeDataChangeListener(TAG) + MediaManager.Audition.removeListener(TAG) this.viewCallback = null } + override fun onDataDis(musicList: MutableList) { + musicDataList.addAll(musicDataList) + } + + override fun addOneData(it: MusicData) { + musicDataList.add(it) + } + fun setMusicData(musicData: MusicData) { this.checkMusicData = musicData this.viewCallback?.setViewData(musicData) @@ -38,9 +45,8 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen if(checkMusicData!=null){ setMusicData(this.checkMusicData!!) }else{ - val musicList = AuditionManager.musicList - if(musicList.size>0){ - val first = musicList.first() + if (musicDataList.isNotEmpty()) { + val first = musicDataList.first() setMusicData(first) viewCallback?.setSelect(first,null) } @@ -50,33 +56,34 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen fun toggle() { checkMusicData?.let { CallerLogger.d(TAG,"toggle:${it.songName}") - AuditionManager.toggle(it) + MediaManager.Audition.toggle(it) } } fun showPreMusic() { checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getPreMusicData(it) - val preTempMusic = checkMusicData - setMusicData(nextMusicData) - viewCallback?.setSelect(nextMusicData,preTempMusic) - if(playing){ - AuditionManager.play(nextMusicData) + MediaManager.Audition.getPreAuditionData(it)?.let { + val preTempMusic = checkMusicData + setMusicData(it) + viewCallback?.setSelect(it,preTempMusic) + if(MediaManager.Audition.isPlaying()==true){ + MediaManager.Audition.play(it) + } } } } fun showNextMusic() { checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getNextMusicData(it) - val preTempMusic = checkMusicData - setMusicData(nextMusicData) - viewCallback?.setSelect(nextMusicData,preTempMusic) - if(playing){ - AuditionManager.play(nextMusicData) + MediaManager.Audition.getNextAuditionData(it)?.let { + val preTempMusic = checkMusicData + setMusicData(it) + viewCallback?.setSelect(it,preTempMusic) + if(MediaManager.Audition.isPlaying()==true){ + MediaManager.Audition.play(it) + } } + } } @@ -84,10 +91,10 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen fun setViewData(musicData: MusicData) fun setPlayOrpause(it: MusicData) fun setProgress(currentPlay: Long, duration: Long) - fun setSelect(currentMusicData: MusicData,preMusicData: MusicData?) + fun setSelect(currentMusicData: MusicData, preMusicData: MusicData?) } - override fun updateState(oldData:MusicData?,musicData: MusicData) { + override fun updateState(oldData: MusicData?, musicData: MusicData) { checkMusicData?.let { if(it.id==musicData.id){ it.state = musicData.state @@ -115,24 +122,25 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen viewCallback?.setPlayOrpause(it) } } - val nextMusicData = AuditionManager.getNextMusicData(it) - val preTempMusic = checkMusicData - setMusicData(nextMusicData) - viewCallback?.setSelect(nextMusicData,preTempMusic) - AuditionManager.play(nextMusicData) + MediaManager.Audition.getNextAuditionData(it)?.let { nextMusicData-> + val preTempMusic = checkMusicData + setMusicData(nextMusicData) + viewCallback?.setSelect(nextMusicData,preTempMusic) + MediaManager.Audition.play(nextMusicData) + } + } } fun seekTo(progress: Int) { - AuditionManager.seekTo(progress) + MediaManager.Audition.seekTo(progress) } fun setClickMusicData(musicData: MusicData) { CallerLogger.d(TAG,"setClickMusicData:${musicData.songName}") setMusicData(musicData) - val playing = AuditionManager.isPlaying() - if(playing){ - AuditionManager.play(musicData) + if(MediaManager.Audition.isPlaying()==true){ + MediaManager.Audition.play(musicData) } } } \ No newline at end of file diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt index 1e515485c9..13b9c5d8a9 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/ConsultVideoPlayer.kt @@ -24,8 +24,8 @@ import com.mogo.och.common.module.wigets.toast.ToastCharterUtils import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.och.charter.passenger.R import com.mogo.och.charter.passenger.utils.FullVideoUtils -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager -import com.mogo.och.common.module.wigets.media.MediaItem +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.skin.widget.SkinImageView import com.shuyu.gsyvideoplayer.listener.VideoAllCallBack import com.shuyu.gsyvideoplayer.utils.GSYVideoType @@ -133,7 +133,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { start.setImageResource(R.drawable.charter_p_function_video_player_pause_small) } showOrHideStartPlayButton(false) - AudioFocusManager.setVideoFocusChange(true) + MediaManager.setVideoFocusChange(true) } else -> { if(isIfCurrentIsFullscreen){ @@ -142,7 +142,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { start.setImageResource(R.drawable.charter_p_function_video_player_start_small) } showOrHideStartPlayButton(true) - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) } } } @@ -256,7 +256,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun onCompletion() { CallerLogger.d(TAG,"onCompletion") - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) start.setImageResource(R.drawable.charter_p_function_video_player_start_small) } @@ -279,7 +279,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun onError(what: Int, extra: Int) { super.onError(what, extra) CallerLogger.d(TAG,"onError--${what}--${extra}") - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) mThumbImageViewLayout?.visibility = View.VISIBLE ToastCharterUtils.showToastLong("哎呀,出错了,看看其他视频吧") currentTime = -1 diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/VideoView.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/VideoView.kt index 0119f2c0cd..3ab0a09f50 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/VideoView.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/VideoView.kt @@ -8,7 +8,6 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener -import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -19,11 +18,10 @@ import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CarouselLayout import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CarouselZoomPostLayoutListener import com.mogo.och.charter.passenger.ui.softcontrol.layoutmanage.CenterScrollListener import com.mogo.och.charter.passenger.ui.video.adapter.RecyclerVideoAdapter -import com.mogo.och.common.module.wigets.media.IMediaDataSourceListener -import com.mogo.och.common.module.wigets.media.MediaDataSourceManager -import com.mogo.och.common.module.wigets.media.MediaFileCacheManager -import com.mogo.och.common.module.wigets.media.MediaItem -import com.mogo.och.common.module.wigets.media.MediaPlayLogger +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.shuyu.gsyvideoplayer.video.base.GSYVideoView import kotlinx.android.synthetic.main.charter_p_video_fragment.view.rvVideoPlaylist import kotlin.math.floor @@ -80,7 +78,7 @@ class VideoView @JvmOverloads constructor( } } prePlayerPosition = centerItemPosition - MediaPlayLogger.printInfoLog("pageSelect, currentPosition=$prePlayerPosition") + OchChainLogManager.writeChainLogMedia("Info", "pageSelect, currentPosition=$prePlayerPosition") } override fun pageStop() { @@ -122,11 +120,11 @@ class VideoView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext) - MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener { + MediaManager.Video.createCacheFileDir() + MediaManager.addListener(TAG,object :IVideoListener{ override fun onMediaDataSourceChanged(list: List) { val isNewData = mediaList.isNotEmpty() - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged:isNewData=$isNewData, dataSize=${list.size}, list=${GsonUtils.toJson(list)}") + OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChanged:isNewData=$isNewData, dataSize=${list.size}, list=${GsonUtils.toJson(list)}") val localMediaList = mutableListOf() list.forEach { val taxiPassengerVideoPlay = TaxiPassengerVideoPlay( @@ -140,17 +138,18 @@ class VideoView @JvmOverloads constructor( if (isNewData) { if (!isVisible) { updateMediaListDataAndView(localMediaList) - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新") + OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChanged, 宣传视频数据已更新") } else { mNewMediaList.clear() mNewMediaList.addAll(localMediaList) } } else { updateMediaListDataAndView(localMediaList) - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新") + OchChainLogManager.writeChainLogMedia("Info", "onMediaDataSourceChanged, 宣传视频数据已更新") } } }) + MediaManager.Video.init() } private fun updateMediaListDataAndView(newList: MutableList) { @@ -169,7 +168,8 @@ class VideoView @JvmOverloads constructor( } override fun onDetachedFromWindow() { - MediaDataSourceManager.unInit(TAG) + MediaManager.Video.unInit() + MediaManager.removeListener(TAG) super.onDetachedFromWindow() } @@ -193,7 +193,7 @@ class VideoView @JvmOverloads constructor( if (mNewMediaList.isNotEmpty()) { updateMediaListDataAndView(mNewMediaList) mNewMediaList.clear() - MediaPlayLogger.printInfoLog("onVisibilityChanged, 宣传视频数据已更新") + OchChainLogManager.writeChainLogMedia("Info", "onVisibilityChanged, 宣传视频数据已更新") } } catch (e: Exception) { e.printStackTrace() diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/adapter/RecyclerVideoAdapter.java b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/adapter/RecyclerVideoAdapter.java index 904679cc44..ab81860832 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/adapter/RecyclerVideoAdapter.java +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/ui/video/adapter/RecyclerVideoAdapter.java @@ -11,7 +11,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; -import com.mogo.och.common.module.wigets.media.MediaItem; +import com.mogo.och.common.module.biz.media.data.MediaItem; import com.mogo.och.common.module.wigets.toast.ToastCharterUtils; import com.mogo.och.charter.passenger.R; import com.mogo.och.charter.passenger.bean.TaxiPassengerVideoPlay; diff --git a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt index 13f417f74c..5889a474df 100644 --- a/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt +++ b/OCH/charter/passenger/src/main/java/com/mogo/och/charter/passenger/utils/CharterVoiceManager.kt @@ -3,7 +3,7 @@ package com.mogo.och.charter.passenger.utils import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist import com.mogo.och.charter.passenger.R -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.skin.utils.SkinResources import com.mogo.tts.base.IMogoTTSCallback import com.mogo.tts.base.LangTtsEntity diff --git a/OCH/common/biz/build.gradle b/OCH/common/biz/build.gradle index 0e86496581..606b8fb7de 100644 --- a/OCH/common/biz/build.gradle +++ b/OCH/common/biz/build.gradle @@ -40,6 +40,15 @@ android { kotlinOptions { jvmTarget = '1.8' } + + sourceSets { + main { + res.srcDirs = [ + 'src/main/res', + 'src/main/res/routing', + ] + } + } } dependencies { @@ -53,6 +62,7 @@ dependencies { implementation rootProject.ext.dependencies.androidxappcompat implementation rootProject.ext.dependencies.material implementation rootProject.ext.dependencies.rxandroid + implementation rootProject.ext.dependencies.amapnavi3dmap implementation project(':OCH:common:common') implementation rootProject.ext.dependencies.arouter diff --git a/OCH/common/biz/src/main/AndroidManifest.xml b/OCH/common/biz/src/main/AndroidManifest.xml index 455cb3ef2a..779575ab47 100644 --- a/OCH/common/biz/src/main/AndroidManifest.xml +++ b/OCH/common/biz/src/main/AndroidManifest.xml @@ -2,4 +2,17 @@ + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/AudioFocusManager.kt similarity index 50% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/AudioFocusManager.kt index a04cb103c2..fadae2a386 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audiofocus/AudioFocusManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/AudioFocusManager.kt @@ -1,16 +1,19 @@ -package com.mogo.och.common.module.manager.audiofocus +package com.mogo.och.biz.media import android.content.Context import android.media.AudioManager import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.widget.media.video.CustomManager import com.mogo.och.common.module.manager.EnvManager -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.biz.media.audition.AuditionManager +import com.mogo.och.biz.media.video.ads.AdVideoPlayer +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.shuyu.gsyvideoplayer.GSYVideoManager -object AudioFocusManager : AuditionManager.MusicDataChangeListener { +object AudioFocusManager : MusicDataChangeListener { const val TAG = "AudioFocusManager" @@ -23,14 +26,14 @@ object AudioFocusManager : AuditionManager.MusicDataChangeListener { private var musicVolumeInTTS = 0 init { - AuditionManager.addDataChangeListener(TAG,this) + AuditionManager.addMusicListener(TAG,this) mAudioManager = AbsMogoApplication.getApp().getSystemService(Context.AUDIO_SERVICE) as AudioManager mMaxVolume = mAudioManager?.getStreamMaxVolume(AudioManager.STREAM_MUSIC)?:0 - musicVolumeInTTS = (mMaxVolume*0.1f).toInt() + musicVolumeInTTS = (mMaxVolume *0.1f).toInt() } override fun updateState(oldData: MusicData?, musicData: MusicData) { - val temp = musicData.state==PlayState.Playing + val temp = musicData.state== PlayState.Playing if(temp!= isPlayingMusic){ isPlayingMusic = temp } @@ -38,7 +41,7 @@ object AudioFocusManager : AuditionManager.MusicDataChangeListener { // 播放音乐需要把视频暂停掉 GSYVideoManager.onPause() } - CallerLogger.d(TAG,"music updateState ${isPlayingTTS}--${isPlayingMusic}---${isPlayingVideo}") + CallerLogger.d(TAG,"music updateState $isPlayingTTS--$isPlayingMusic---$isPlayingVideo") } fun setTTSFocusChange(isSpeaking:Boolean){ @@ -51,17 +54,27 @@ object AudioFocusManager : AuditionManager.MusicDataChangeListener { AuditionManager.setVolume(0.3f,0.3f) } } + if (isPlayingVideo) { + CustomManager.getCustomManagersByTag(AdVideoPlayer.TAG).forEach{ + it.setNeedMute(true) + } +// GSYVideoManager.instance().curPlayerManager?.setNeedMute(true) + } }else{ if(isPlayingMusic){ AuditionManager.setVolume(1f,1f) } + CustomManager.getCustomManagersByTag(AdVideoPlayer.TAG).forEach{ + it.setNeedMute(false) + } +// GSYVideoManager.instance().curPlayerManager?.setNeedMute(false) } } - CallerLogger.d(TAG, "setTTSFocusChange ${isPlayingTTS}--${isPlayingMusic}---${isPlayingVideo}") + CallerLogger.d(TAG, "setTTSFocusChange $isPlayingTTS--$isPlayingMusic---$isPlayingVideo") } fun setVideoFocusChange(isPlaying:Boolean){ - CallerLogger.d(TAG, "setMusicFocusChange ${isPlayingTTS}--${isPlayingMusic}---${isPlayingVideo}") + CallerLogger.d(TAG, "setMusicFocusChange $isPlayingTTS--$isPlayingMusic---$isPlayingVideo") if(isPlaying!= isPlayingVideo) { isPlayingVideo = isPlaying if(isPlaying){ @@ -70,6 +83,19 @@ object AudioFocusManager : AuditionManager.MusicDataChangeListener { }else { AuditionManager.stop() } + if (isPlayingTTS) { + CustomManager.getCustomManagersByTag(AdVideoPlayer.TAG).forEach{ + it.setNeedMute(true) + } +// GSYVideoManager.instance().curPlayerManager?.setNeedMute(true) + } + } else { + if (!isPlayingTTS) { + CustomManager.getCustomManagersByTag(AdVideoPlayer.TAG).forEach{ + it.setNeedMute(false) + } +// GSYVideoManager.instance().curPlayerManager?.setNeedMute(false) + } } } } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaProvider.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaProvider.kt new file mode 100644 index 0000000000..e4c7eaad9d --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaProvider.kt @@ -0,0 +1,194 @@ +package com.mogo.och.biz.media + +import android.content.Context +import android.view.View +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.function.call.base.CallerBase +import com.mogo.eagle.core.function.main.MainMoGoApplication +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.ActivityUtils +import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils +import com.mogo.och.biz.media.audition.AuditionManager +import com.mogo.och.biz.media.tts.VoiceIn +import com.mogo.och.biz.media.tts.VoiceOut +import com.mogo.och.biz.media.video.MediaDataSourceManager +import com.mogo.och.biz.media.video.MediaPlayerActivity +import com.mogo.och.biz.media.video.VideoPlayerFragment +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.MediaService +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.biz.media.video.MediaFileCacheManager +import com.mogo.och.biz.media.video.ads.AdMediaView +import com.mogo.tts.base.IMogoTTSCallback +import com.mogo.tts.base.LangTtsEntity + + +/** + * eye 桥 + */ +@Route(path = OchCommonConst.BIZ_Media) +class MediaProvider : MediaService, CallerBase() { + + private var context: Context? = null + + private val tag = M_OCHCOMMON + "MediaProvider" + + override fun init(context: Context?) { + this.context = context + } + + override fun addVideoListener(tag: String, listener: IVideoListener) { + addListener(tag, listener) + } + + override fun removeVideoListener(tag: String) { + removeListener(tag) + } + + override fun doSomeAfterAddListener(tag: String, listener: IVideoListener) { + MediaDataSourceManager.dispatchMediaData() + } + + override fun postSiteIntroduceInfo(list: MutableList) { + M_LISTENERS.forEach { + it.value.diapatchMedia(list) + } + } + + override fun setMediaResume() { + M_LISTENERS.forEach { + it.value.setMediaResume() + } + } + + override fun setMediaPause() { + M_LISTENERS.forEach { + it.value.setMediaPause() + } + } + + fun invokeMediaDataChange(newDataList: List) { + M_LISTENERS.forEach { + it.value.onMediaDataSourceChanged(newDataList) + } + } + + override fun setTTSFocusChange(speaking: Boolean) { + AudioFocusManager.setTTSFocusChange(speaking) + } + + override fun setVideoFocusChange(playing: Boolean) { + AudioFocusManager.setVideoFocusChange(playing) + } + + + + override fun musicStop() { + AuditionManager.stop() + } + + override fun musicReplayOrplayFirst() { + AuditionManager.replayOrplayFirst() + } + + override fun removeAuditionListener(tag: String) { + AuditionManager.removeMusicListener(tag) + } + + override fun addAuditionListener(tag: String, listener: MusicDataChangeListener) { + AuditionManager.addMusicListener(tag,listener) + } + + override fun auditionIsPlaying(): Boolean { + return AuditionManager.isPlaying() + } + + override fun getPlaying(): MusicData? { + return AuditionManager.musicDataPlaying + } + + override fun palyAudition(musicData: MusicData) { + AuditionManager.play(musicData) + } + + override fun getPreAuditionData(it: MusicData): MusicData { + return AuditionManager.getPreMusicData(it) + } + + override fun getNextAuditionData(it: MusicData): MusicData { + return AuditionManager.getNextMusicData(it) + } + + override fun toggle(musicData: MusicData) { + AuditionManager.toggle(musicData) + } + + override fun seekTo(progress: Int) { + AuditionManager.seekTo(progress) + } + + override fun getAuditionDataList(): MutableList { + return AuditionManager.musicList + } + + override fun showNotice( + notice: String?, + level: Int, + delayed: Long, + callBack: IMogoTTSCallback? + ) { + VoiceIn.showNotice(notice,level,delayed,callBack) + } + + override fun showNotice( + listTTS: MutableList, + level: Int, + callBack: IMogoTTSCallback? + ) { + VoiceIn.showNotice(listTTS,level,callBack) + } + + override fun showNoticeOut(notice: String?) { + VoiceOut.showNoticeOut(notice) + } + + override fun startSecondAds() { + MultiDisplayUtils.startActWithSecond(ActivityUtils.getTopActivity(), MediaPlayerActivity::class.java) + } + + override fun getAdFragment(): VideoPlayerFragment { + return VideoPlayerFragment() + } + + override fun getAdView(context: Context): View { + return AdMediaView(context) + } + + override fun createCacheFileDir() { + MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext) + } + + override fun initMediaData() { + MediaDataSourceManager.init() + } + + override fun unInitMediaData() { + MediaDataSourceManager.unInit() + } + + override fun stopTTs() { + VoiceIn.stopCurrentTts() + } + + override fun loadOuttts() { + VoiceOut.load() + } + + override fun releaseOuttts() { + VoiceOut.release() + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaServiceManager.kt new file mode 100644 index 0000000000..d182709a3f --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/MediaServiceManager.kt @@ -0,0 +1,34 @@ +package com.mogo.och.biz.media + +import android.annotation.SuppressLint +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.constant.OchCommonConst + +object MediaServiceManager { + + private const val TAG = M_OCHCOMMON+"MediaServiceManager" + + @SuppressLint("StaticFieldLeak") + private var mediaService: MediaProvider? = + ARouter.getInstance().build(OchCommonConst.BIZ_Media).navigation() as MediaProvider + + fun invokeMediaSourceDataChange(newDataList: List) { + mediaService?.invokeMediaDataChange(newDataList) + } + + fun invokeCreateCacheFileDir() { + mediaService?.createCacheFileDir() + } + + fun addVideoListener(tag:String,listener: IVideoListener){ + mediaService?.addVideoListener(tag,listener) + } + + fun removeVideoListener(tag: String){ + mediaService?.removeVideoListener(tag) + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/Audition.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/Audition.kt similarity index 98% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/Audition.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/Audition.kt index f85f6a061f..07e87bf810 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/Audition.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/Audition.kt @@ -1,4 +1,4 @@ -package com.mogo.och.common.module.manager.audition +package com.mogo.och.biz.media.audition import android.media.AudioManager import android.media.MediaPlayer @@ -24,7 +24,7 @@ object Audition: MediaPlayer.OnPreparedListener, } fun registerOnAuditionListener(listener: OnAuditionListener?) { - this.listener = listener + Audition.listener = listener } fun unregisterOnAuditionListener() { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionCacheManager.kt similarity index 96% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionCacheManager.kt index 0901b578d0..9efbe1a953 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionCacheManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionCacheManager.kt @@ -1,4 +1,4 @@ -package com.mogo.och.common.module.manager.audition +package com.mogo.och.biz.media.audition import android.media.MediaExtractor import android.media.MediaFormat @@ -11,11 +11,12 @@ import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager.EVENT_KEY_INFE_WITH_MUSIC import com.mogo.och.common.module.utils.FileUtils -import com.mogo.och.common.module.wigets.media.MediaBeanManager -import com.mogo.och.common.module.wigets.media.MediaPlayLogger +import com.mogo.och.biz.media.video.MediaBeanManager +import com.mogo.och.biz.media.video.MediaPlayLogger import java.io.File import java.io.FileOutputStream import java.io.IOException @@ -25,7 +26,7 @@ import com.mogo.eagle.core.utilcode.util.FileUtils as FileHelper object AuditionCacheManager { - private var dataChangeListener:DataChangeListener?=null + private var dataChangeListener: DataChangeListener?=null private val context = AbsMogoApplication.getApp() private const val TAG = "AuditionCacheManager" @@ -175,7 +176,7 @@ object AuditionCacheManager { } fun addDataChangeListener(dataChangeListener: DataChangeListener) { - this.dataChangeListener = dataChangeListener + AuditionCacheManager.dataChangeListener = dataChangeListener getMusicDataByLocationConfig() } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionManager.kt similarity index 81% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionManager.kt index c3feae4c51..1fa7e34389 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/audition/AuditionManager.kt @@ -1,8 +1,10 @@ -package com.mogo.och.common.module.manager.audition +package com.mogo.och.biz.media.audition import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import java.util.concurrent.ConcurrentHashMap object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAuditionListener { @@ -18,22 +20,22 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi init { AuditionCacheManager.addDataChangeListener(this) Audition.registerOnAuditionListener(this) - AudioFocusManager.load() } - fun addDataChangeListener(tag: String, listener: MusicDataChangeListener) { + fun addMusicListener(tag: String, listener: MusicDataChangeListener) { if (dataChangeListeners.containsKey(tag)) { return } dataChangeListeners[tag] = listener + listener.onDataDis(musicList) } - fun removeDataChangeListener(tag: String){ + fun removeMusicListener(tag: String){ dataChangeListeners.remove(tag) } - private fun getMusicDataByState(state:PlayState):Pair?{ + private fun getMusicDataByState(state: PlayState):Pair?{ musicList.forEachIndexed { index, musicData -> if(musicData.state==state){ return Pair(index,musicData) @@ -103,10 +105,23 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi } } - private fun resetData():MusicData?{ - var tempRusult:MusicData?=null + //如果音乐属于暂停状态 开始播放 如果没有播放就播放第一首 + fun replayOrplayFirst(){ + musicList.forEach {music-> + if(music.state==PlayState.Pause){ + toggle(music) + return + } + } + if(!isPlaying()) { + playFirst() + } + } + + private fun resetData(): MusicData?{ + var tempRusult: MusicData?=null musicList.forEach { - if(it.state!=PlayState.None){ + if(it.state!= PlayState.None){ tempRusult = it } it.state = PlayState.None @@ -127,20 +142,6 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi } } - public interface MusicDataChangeListener{ - fun addOneData(it: MusicData){} - - /** - * toggle 修改播放器状态 - * @param oldData 上一个不是 PlayState.None 的歌曲 - * @param musicData 当前播放状态发生变化的歌曲 - */ - fun updateState(oldData: MusicData?,musicData: MusicData) - fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){} - fun onMusicCompletion(musicData: MusicData) {} - - } - /** * 音乐播放完毕 */ @@ -152,7 +153,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi it.value.onMusicCompletion(oldData) } }else{ - musicList.forEach {musicData-> + musicList.forEach { musicData-> if(musicData.path==path){ dataChangeListeners.forEach { it.value.onMusicCompletion(musicData) @@ -183,7 +184,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi } }else{ musicList.forEachIndexed { index, musicData -> - if(musicData.path==Audition.oldPath){ + if(musicData.path== Audition.oldPath){ dataChangeListeners.forEach { it.value.updatePlayCurrent(currentPlay,duration,musicData) } @@ -193,7 +194,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi } } - fun getNextMusicData(it: MusicData):MusicData { + fun getNextMusicData(it: MusicData): MusicData { val indexOf = musicList.indexOf(it) if(indexOf== musicList.size-1){ return musicList.first() @@ -216,7 +217,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi } fun setVolume(leftVolume:Float, rightVolume:Float){ - Audition.setVolume(leftVolume,rightVolume) + Audition.setVolume(leftVolume, rightVolume) } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceIn.kt similarity index 69% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceIn.kt index 375c4fb54a..97cfeb0ec7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/VoiceNotice.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceIn.kt @@ -1,11 +1,11 @@ -package com.mogo.och.common.module.voice +package com.mogo.och.biz.media.tts import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager +import com.mogo.och.common.module.biz.media.MediaManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.OutofVoice @@ -14,43 +14,11 @@ import com.mogo.tts.base.LangTtsEntity import com.mogo.tts.base.LanguageType import com.mogo.tts.base.MultiLangTtsEntity -object VoiceNotice { +object VoiceIn { const val onlyChinese = 1 //中文 const val chineseEnglishKorean = 1 shl 1 // 左移一位 中英韩 - @JvmStatic - fun showNotice(notice: String?) { - showNotice(notice, AIAssist.LEVEL0) - } - - @JvmStatic - fun showNoticeOut(notice: String?) { - save2Log("车外准备播放 内容${notice}") - notice?.let { - if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ - val outofVoice = OutofVoice(notice) - LanSocketManager.sendMsgToClient(outofVoice) - }else{ - AIAssist.getInstance(AbsMogoApplication.getApp()).playVoiceOutside(notice) - } - } - } - - @JvmStatic - fun showNotice(notice: String?, level: Int) { - showNotice(notice,level,0) - } - - @JvmStatic - fun showNotice(notice: String?, delayed: Long) { - showNotice(notice, AIAssist.LEVEL0, delayed) - } - - @JvmStatic - fun showNotice(notice: String?, delayed: Long,callback:IMogoTTSCallback ) { - showNotice(notice, AIAssist.LEVEL0, delayed,callback) - } @JvmStatic @@ -99,12 +67,6 @@ object VoiceNotice { } - fun speakTTSVoiceWithLevel(text:String, level:Int, callBack:IMogoTTSCallback){ - save2Log("准备播放${text}") - AIAssist.getInstance(AbsMogoApplication.getApp()).speakTTSVoiceWithLevel(text,level,callCallBack(callBack)) - } - - private fun callCallBack(callBack: IMogoTTSCallback?):IMogoTTSCallback{ @@ -112,21 +74,21 @@ object VoiceNotice { override fun onSpeakStart(speakText: String?) { super.onSpeakStart(speakText) callBack?.onSpeakStart(speakText) - AudioFocusManager.setTTSFocusChange(true) + MediaManager.setTTSFocusChange(true) save2Log("开始播放${speakText}") } override fun onSpeakEnd(speakText: String?) { super.onSpeakEnd(speakText) callBack?.onSpeakEnd(speakText) - AudioFocusManager.setTTSFocusChange(false) + MediaManager.setTTSFocusChange(false) save2Log("结束播放${speakText}") } override fun onSpeakError(speakText: String?, errorMsg: String?) { super.onSpeakError(speakText, errorMsg) callBack?.onSpeakError(speakText,errorMsg) - AudioFocusManager.setTTSFocusChange(false) + MediaManager.setTTSFocusChange(false) save2Log("播放错误,内容:${speakText}、errorMsg:${errorMsg}") } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/OutOffVoice.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceOut.kt similarity index 65% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/voice/OutOffVoice.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceOut.kt index 3e766e7f11..c6f40cd357 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/voice/OutOffVoice.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/tts/VoiceOut.kt @@ -1,14 +1,29 @@ -package com.mogo.och.common.module.voice +package com.mogo.och.biz.media.tts import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.socket.lan.ILanMessageListener import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.DPMsgType import com.mogo.och.common.module.manager.socket.lan.bean.OutofVoice -object OutOffVoice { +object VoiceOut { + + @JvmStatic + fun showNoticeOut(notice: String?) { + VoiceIn.save2Log("车外准备播放 内容${notice}") + notice?.let { + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)){ + val outofVoice = OutofVoice(notice) + LanSocketManager.sendMsgToClient(outofVoice) + }else{ + AIAssist.getInstance(AbsMogoApplication.getApp()).playVoiceOutside(notice) + } + } + } val outffListener = object : ILanMessageListener { override fun targetLan(): Class { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaBean.kt similarity index 60% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaBean.kt index c299ccc516..c08d800930 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaBean.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaBean.kt @@ -1,11 +1,12 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video import com.google.gson.reflect.TypeToken import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.Vehicle import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MusicData object MediaBeanManager { @@ -72,56 +73,13 @@ object MediaBeanManager { } } -data class MediaDataWithVehicleList(val musicDataWithEnvList: MutableList) { - -} - data class MediaDataWithVehicle( - val B1: B1, - val B2: B2, - val T1T2: T1T2, - val M1: M1, + val B1: MediaVehicle, + val B2: MediaVehicle, + val T1T2: MediaVehicle, + val M1: MediaVehicle, ) - -data class B1(val medias: MutableList, val musics: MutableList) -data class B2(val medias: MutableList, val musics: MutableList) -data class T1T2(val medias: MutableList, val musics: MutableList) -data class M1(val medias: MutableList, val musics: MutableList) - -data class MediaBean( - val medias: MutableList, - val musics: MutableList, -) - -data class MediaItem( - var priority: Int, - var fileUrl: String, - var fileType: Int, - var coverImageUrl: String, - var title: String, - val isTemp: Boolean = false -) { - companion object { - const val MEDIA_TYPE_IMAGE = 1 - const val MEDIA_TYPE_VIDEO = 2 - - const val PriorityConfi = 2 - const val PriorityAd = 1 - const val PrioritySite = 0 - - // 站点优先级 0 - // 广告优先级 1 - // 本地配置是 2 - } - - fun isImageType(): Boolean { - return this.fileType == MEDIA_TYPE_IMAGE - } - - fun isVideoType(): Boolean { - return this.fileType == MEDIA_TYPE_VIDEO - } +data class MediaVehicle (val medias: MutableList, val musics: MutableList) -} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaDataSourceManager.kt similarity index 90% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaDataSourceManager.kt index b17a0727fe..6296c8007d 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaDataSourceManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaDataSourceManager.kt @@ -1,31 +1,30 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video import android.annotation.SuppressLint import android.content.Context import android.text.TextUtils -import com.google.gson.reflect.TypeToken import com.mogo.commons.AbsMogoApplication import com.mogo.commons.debug.DebugConfig import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.biz.media.MediaServiceManager import com.mogo.och.common.module.biz.lansocket.LoginLanPassengerSocket +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MediaItem.Companion.MEDIA_TYPE_IMAGE +import com.mogo.och.common.module.biz.media.data.MediaItem.Companion.MEDIA_TYPE_VIDEO import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformTry -import com.mogo.och.common.module.wigets.media.MediaItem.Companion.MEDIA_TYPE_IMAGE -import com.mogo.och.common.module.wigets.media.MediaItem.Companion.MEDIA_TYPE_VIDEO import io.reactivex.Observable import retrofit2.http.GET import retrofit2.http.Headers import retrofit2.http.Query -import java.util.concurrent.ConcurrentHashMap /** * 广告视频数据源 管理类 @@ -64,23 +63,19 @@ object MediaDataSourceManager { private var mHasEverGetMediaDataFromMis = false - private val mMediaDataSourceListenerMap: ConcurrentHashMap = - ConcurrentHashMap() - private val getAdDataSourceLoopRunnable = Runnable { startGetMediaDataSourceLoop() } - fun init(tag: String, dataSourceListener: IMediaDataSourceListener) { - if (!mMediaDataSourceListenerMap.containsKey(tag)) { - mMediaDataSourceListenerMap[tag] = dataSourceListener - } + fun init() { MediaPlayLogger.printInfoLog("init, 初始化环境 isSassProject=${ProjectUtils.isSaas()}") if (ProjectUtils.isSaas()||ProjectUtils.isDali()) { if(ProjectUtils.isSaas()){ - mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getEagleMisUrl()).create(IMediaNetworkApi::class.java) + mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getEagleMisUrl()).create( + IMediaNetworkApi::class.java) }else if(ProjectUtils.isDali()){ - mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create(IMediaNetworkApi::class.java) + mNetworkService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( + IMediaNetworkApi::class.java) } MediaPlayLogger.printInfoLog("init, 开始检查后台配置数据") startGetMediaDataSourceLoop() @@ -92,12 +87,9 @@ object MediaDataSourceManager { } } - fun unInit(tag: String) { + fun unInit() { MediaPlayLogger.printInfoLog("unInit") removeGetMediaDataSourceLoop() - if (mMediaDataSourceListenerMap.containsKey(tag)) { - mMediaDataSourceListenerMap.remove(tag) - } mLastMediaDataSourceList.clear() } @@ -226,17 +218,15 @@ object MediaDataSourceManager { private fun updateMediaDataSource(newDataList: List) { mLastMediaDataSourceList.clear() mLastMediaDataSourceList.addAll(newDataList) - mMediaDataSourceListenerMap.forEach { - val listener = it.value - listener.onMediaDataSourceChanged(newDataList) - } + MediaServiceManager.invokeMediaSourceDataChange(newDataList) MediaPlayLogger.printInfoLog("下发新MediaData给监听者,dataSize=${newDataList.size}") } -} + fun dispatchMediaData(){ + MediaPlayLogger.printInfoLog("注册后下发新MediaData给监听者,dataSize=${mLastMediaDataSourceList.size}") + MediaServiceManager.invokeMediaSourceDataChange(mLastMediaDataSourceList) + } -interface IMediaDataSourceListener { - fun onMediaDataSourceChanged(list: List) } interface IMediaNetworkApi { diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaFileCacheManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaFileCacheManager.kt similarity index 93% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaFileCacheManager.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaFileCacheManager.kt index 16506e7f89..c5d306a5e7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaFileCacheManager.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaFileCacheManager.kt @@ -1,10 +1,9 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video import android.content.Context import android.os.Environment import android.text.TextUtils import android.util.Log -import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener import com.mogo.eagle.core.utilcode.util.EncryptUtils import com.mogo.och.common.module.manager.download.DownloadManager @@ -59,7 +58,7 @@ object MediaFileCacheManager { * 获取文件缓存的缓存path, 文件名以base64编码避免 中文命名,重复文件名的影响 */ fun getCacheFileFullPathByUrl(context: Context, mediaUrl: String): String { - return getFileCacheDir(context) +File.separator +getCacheFileName(mediaUrl) + return getFileCacheDir(context) +File.separator + getCacheFileName(mediaUrl) } /** diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaLoopPlayView.kt similarity index 95% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaLoopPlayView.kt index 3c95f294e2..6f05797b21 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaLoopPlayView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaLoopPlayView.kt @@ -1,7 +1,5 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video -import AdvanceImageView -import AdvanceVideoView import android.content.Context import android.util.AttributeSet import android.view.MotionEvent @@ -13,8 +11,9 @@ import androidx.viewpager.widget.ViewPager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.CountDownTimer import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.IMAGE_COUNT_DOWN_SECONDS -import com.mogo.och.common.module.wigets.media.MediaLoopPlayView.Companion.TAG +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.biz.media.video.MediaLoopPlayView.Companion.IMAGE_COUNT_DOWN_SECONDS +import com.mogo.och.biz.media.video.MediaLoopPlayView.Companion.TAG import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack class MediaLoopPlayView @JvmOverloads constructor( @@ -93,7 +92,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter fun setMediaData(list: MutableList) { if (list.isEmpty()) { - MediaPlayLogger.printInfoLog( "setMediaData, list为空") + MediaPlayLogger.printInfoLog("setMediaData, list为空") return } @@ -162,7 +161,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter videoView.initVideoUrlData(item.fileUrl, item.coverImageUrl,item.priority,item.isTemp) mItemViewList.add(videoView) } else { - MediaPlayLogger.printErrorLog( "addItemView 不支持的文件类型:${item.fileType}") + MediaPlayLogger.printErrorLog("addItemView 不支持的文件类型:${item.fileType}") } } @@ -340,7 +339,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter } override fun onFinish() { - MediaPlayLogger.printInfoLog( "mImageCountDownTimer, 倒计时${IMAGE_COUNT_DOWN_SECONDS}秒, onFinish") + MediaPlayLogger.printInfoLog("mImageCountDownTimer, 倒计时${IMAGE_COUNT_DOWN_SECONDS}秒, onFinish") playNextItemView(false) } }.start() @@ -404,7 +403,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter } fun setPause() { - MediaPlayLogger.printInfoLog("${MediaLoopPlayView.TAG}, setPause") + MediaPlayLogger.printInfoLog("$TAG, setPause") if (mItemViewList.size <= 0) { return } @@ -418,7 +417,7 @@ class AdvancePagerAdapter(context: Context, viewPager: ViewPager) : PagerAdapter } fun setResume() { - MediaPlayLogger.printInfoLog("${MediaLoopPlayView.TAG}, setResume") + MediaPlayLogger.printInfoLog("$TAG, setResume") if (mItemViewList.size <= 0) { return } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayLogger.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayLogger.kt similarity index 76% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayLogger.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayLogger.kt index 2fdb2c88c9..490ca13c53 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayLogger.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayLogger.kt @@ -1,9 +1,10 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video import androidx.lifecycle.ProcessLifecycleOwner import androidx.lifecycle.lifecycleScope import com.mogo.commons.utils.MogoAnalyticUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -32,13 +33,7 @@ object MediaPlayLogger { */ private fun trackEvent(level: String, msg: String) { ProcessLifecycleOwner.get().lifecycleScope.launch(Dispatchers.IO) { - val map: MutableMap = HashMap() - map["level"] = level - map["msg"] = msg - MogoAnalyticUtils.track( - MEDIA_PLAY_PROCESS_KEY_NODE_LOG, - map - ) + OchChainLogManager.writeChainLogMedia(level,msg) } } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerActivity.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerActivity.kt similarity index 65% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerActivity.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerActivity.kt index aed9530eac..26554d3b75 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerActivity.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerActivity.kt @@ -1,21 +1,11 @@ -package com.mogo.och.common.module.wigets.media +package com.mogo.och.biz.media.video -import android.Manifest -import android.app.ActivityOptions -import android.content.Intent -import android.content.pm.PackageManager import android.os.Bundle -import android.provider.Settings -import android.view.Display import androidx.appcompat.app.AppCompatActivity -import androidx.core.content.ContextCompat -import com.mogo.eagle.core.function.main.MainLauncherActivity import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant -import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.BarUtils -import com.mogo.och.common.module.R -import com.mogo.och.common.module.utils.RxUtils +import com.mogo.och.biz.R class MediaPlayerActivity : AppCompatActivity() { @@ -23,8 +13,8 @@ class MediaPlayerActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_video_player) - val fragment = MediaPlayerFragment() + setContentView(R.layout.biz_activity_video_player) + val fragment = VideoPlayerFragment() supportFragmentManager.beginTransaction().add(R.id.videoPlayerContainer, fragment) .commitAllowingStateLoss() BarUtils.hideStatusBarAndSticky(this.window) diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerCustomView.kt similarity index 98% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerCustomView.kt index 899639d571..37d3b643b6 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerCustomView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/MediaPlayerCustomView.kt @@ -1,3 +1,5 @@ +package com.mogo.och.biz.media.video + import android.content.Context import android.graphics.Bitmap import android.media.AudioManager @@ -21,10 +23,7 @@ import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider import com.mogo.och.common.module.utils.CustomManager import com.mogo.och.common.module.R -import com.mogo.och.common.module.wigets.media.MediaFileCacheManager -import com.mogo.och.common.module.wigets.media.MediaItem -import com.mogo.och.common.module.wigets.media.MediaLoopPlayView -import com.mogo.och.common.module.wigets.media.MediaPlayLogger +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.skin.utils.SkinResources import com.mogo.skin.widget.SkinImageView import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/VideoPlayerFragment.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/VideoPlayerFragment.kt new file mode 100644 index 0000000000..e2c6704b54 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/VideoPlayerFragment.kt @@ -0,0 +1,72 @@ +package com.mogo.och.biz.media.video + +import com.mogo.commons.mvp.MvpFragment +import com.mogo.commons.mvp.Presenter +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.och.biz.R +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MediaItem +import kotlinx.android.synthetic.main.biz_fragment_video_player.acb_add_site_video + +/** + * @author: wangmingjun + * @date: 2022/4/12 + */ +class VideoPlayerFragment : + MvpFragment(), IVideoListener { + + companion object { + private val TAG = VideoPlayerFragment::class.java.simpleName + } + + override fun getLayoutId(): Int { + return R.layout.biz_fragment_video_player + } + + override fun createPresenter(): MediaPlayerPresenter { + return MediaPlayerPresenter(this) + } + + override fun getTagName(): String { + return TAG + } + + override fun initViews() { + acb_add_site_video.onClick { + val siteList = mutableListOf() +// siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/defaultPath/b47f361c3de6ea490f3086407fc0376f/a1%E8%B7%AF%E7%BA%BF%281%29.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title")) + siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title")) + setHightPriorityMediaItem(siteList) + } + } + + + fun setHightPriorityMediaItem(list: MutableList){ + MediaManager.postSiteIntroduceInfo(list) + } + + override fun onPause() { + super.onPause() + } + + override fun onResume() { + super.onResume() + } + + override fun onDestroy() { + super.onDestroy() + } + + + override fun setMediaPause() { + super.setMediaPause() + } + + override fun setMediaResume() { + super.setMediaResume() + } +} + +class MediaPlayerPresenter(view: VideoPlayerFragment?) : + Presenter(view) \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaView.kt new file mode 100644 index 0000000000..8b560aff32 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaView.kt @@ -0,0 +1,218 @@ +package com.mogo.och.biz.media.video.ads + +import android.content.Context +import android.graphics.Bitmap +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.FrameLayout +import android.widget.ImageView +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.bumptech.glide.Glide +import com.bumptech.glide.load.DataSource +import com.bumptech.glide.load.engine.GlideException +import com.bumptech.glide.request.RequestListener +import com.bumptech.glide.request.RequestOptions +import com.bumptech.glide.request.target.Target +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.och.biz.R +import com.mogo.och.biz.media.video.MediaLoopPlayView +import com.mogo.och.biz.media.video.MediaPlayLogger +import com.mogo.och.biz.media.video.ads.AdMediaViewModel.AdMediaViewCallback +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.skin.utils.SkinResources +import com.mogo.skin.widget.SkinImageView +import com.shuyu.gsyvideoplayer.builder.GSYVideoOptionBuilder +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack +import kotlinx.android.synthetic.main.biz_ad_video_image.view.adVideoPlayer +import kotlinx.android.synthetic.main.biz_ad_video_image.view.imagePlayer + +class AdMediaView : FrameLayout, AdMediaViewCallback { + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + private val TAG = "AdMediaView" + + private var viewModel: AdMediaViewModel? = null + private var gsyVideoPlayerOptionBuilder: GSYVideoOptionBuilder? = null + + private var thumbnailImageView: SkinImageView? = null + + val placeholderDrawable = SkinResources.getInstance().getDrawable(R.drawable.road_video_bg) + + var adPlayerCurrentPosition = -1 + + + init { + LayoutInflater.from(context).inflate(R.layout.biz_ad_video_image, this, true) + initView() + } + + private fun initView() { + //缩略图 + thumbnailImageView = SkinImageView(context) + thumbnailImageView?.scaleType = ImageView.ScaleType.FIT_XY + adVideoPlayer?.thumbImageView = thumbnailImageView + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(AdMediaViewModel::class.java) + } + + viewModel?.setAdMediaCallback(this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + } + + override fun startPlayImage(mediaItem: MediaItem) { + BizLoopManager.runInMainThread { + myStartPlayImage(mediaItem) + } + } + private fun myStartPlayImage(mediaItem: MediaItem) { + adVideoPlayer?.visibility = GONE + imagePlayer?.visibility = VISIBLE + imagePlayer?.also { + Glide.with(context).asBitmap().load(mediaItem.fileUrl).apply( + RequestOptions().useUnlimitedSourceGeneratorsPool(true) + .placeholder(placeholderDrawable) + .error(placeholderDrawable) + .fallback(placeholderDrawable) + .centerCrop() + ).listener(object : RequestListener { + override fun onLoadFailed( + e: GlideException?, + model: Any?, + target: Target?, + isFirstResource: Boolean + ): Boolean { + MediaPlayLogger.printErrorLog("图片加载失败:${e?.message}") + return false + } + + override fun onResourceReady( + resource: Bitmap?, + model: Any?, + target: Target?, + dataSource: DataSource?, + isFirstResource: Boolean + ): Boolean { + return false + } + + }) + .into(it) + } + } + + override fun startPlayVideo(mediaItem: MediaItem, playerCallback: GSYSampleCallBack) { + BizLoopManager.runInMainThread { + myStartPlayVideo(mediaItem, playerCallback) + } + } + private fun myStartPlayVideo(mediaItem: MediaItem, playerCallback: GSYSampleCallBack) { + try { + adVideoPlayer?.visibility = VISIBLE + imagePlayer?.visibility = GONE + + adVideoPlayer?.onVideoReset() + thumbnailImageView?.also { + Glide.with(context).asBitmap().load(mediaItem.coverImageUrl) + .apply( + RequestOptions().useUnlimitedSourceGeneratorsPool(true) + .placeholder(placeholderDrawable) + .error(placeholderDrawable) + .fallback(placeholderDrawable) + .centerCrop() + ) + .into(it) + } + gsyVideoPlayerOptionBuilder = GSYVideoOptionBuilder() + gsyVideoPlayerOptionBuilder + ?.setUrl(mediaItem.localPath) // "/sdcard/mogo/media" + ?.setThumbPlay(false) + ?.build(adVideoPlayer) + adVideoPlayer?.isFocusableInTouchMode = false + adVideoPlayer?.playTag = mediaItem.fileUrl + adVideoPlayer?.setVideoAllCallBack(playerCallback) + adVideoPlayer?.setCacheImageViewGone() + if(mediaItem.pausePosition>0){ + CallerLogger.d(TAG,"滑动到指定位置") + adVideoPlayer?.seekOnStart = (mediaItem.pausePosition) + } + adVideoPlayer?.startPlayLogic() + } catch (e: Exception) { + Logger.e(TAG, "startPlay error, msg=${e.message}") + playerCallback.onPlayError(mediaItem.localPath) + } + } + + override fun startPlayStationVideo(stationMediaItem: MediaItem,adMediaItem:MediaItem?,playerCallback: GSYSampleCallBack) { + BizLoopManager.runInMainThread { + myStartPlayStationVideo(stationMediaItem, adMediaItem, playerCallback) + } + } + private fun myStartPlayStationVideo(stationMediaItem: MediaItem,adMediaItem:MediaItem?,playerCallback: GSYSampleCallBack) { + try { + if(adMediaItem?.isVideoType()==true&&adVideoPlayer?.playTag == adMediaItem.fileUrl){ + adMediaItem.pausePosition = adVideoPlayer.currentPositionWhenPlaying + } + + adVideoPlayer?.visibility = VISIBLE + imagePlayer?.visibility = GONE + + adVideoPlayer?.onVideoReset() + thumbnailImageView?.also { + Glide.with(context).asBitmap().load(stationMediaItem.coverImageUrl) + .apply( + RequestOptions().useUnlimitedSourceGeneratorsPool(true) + .placeholder(placeholderDrawable) + .error(placeholderDrawable) + .fallback(placeholderDrawable) + .centerCrop() + ) + .into(it) + } + gsyVideoPlayerOptionBuilder = GSYVideoOptionBuilder() + gsyVideoPlayerOptionBuilder + ?.setUrl(stationMediaItem.localPath) // "/sdcard/mogo/media" + ?.setThumbPlay(false) + ?.build(adVideoPlayer) + adVideoPlayer?.isFocusableInTouchMode = false + adVideoPlayer?.playTag = stationMediaItem.fileUrl + adVideoPlayer?.setVideoAllCallBack(playerCallback) + adVideoPlayer?.setCacheImageViewGone() + adVideoPlayer?.startPlayLogic() + } catch (e: Exception) { + Logger.e(TAG, "startPlay error, msg=${e.message}") + playerCallback.onPlayError(stationMediaItem.localPath) + } + } + + override fun pauseVideo() { + BizLoopManager.runInMainThread { + adVideoPlayer.onVideoPause() + } + } + + override fun resumeVideo() { + BizLoopManager.runInMainThread { + adVideoPlayer.onVideoResume() + } + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaViewModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaViewModel.kt new file mode 100644 index 0000000000..4a5b737ba1 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdMediaViewModel.kt @@ -0,0 +1,322 @@ +package com.mogo.och.biz.media.video.ads + +import androidx.lifecycle.ViewModel +import com.bumptech.glide.Glide +import com.bumptech.glide.load.engine.DiskCacheStrategy +import com.mogo.commons.AbsMogoApplication +import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.FileUtils +import com.mogo.och.biz.media.MediaServiceManager +import com.mogo.och.biz.media.video.MediaDataSourceManager +import com.mogo.och.biz.media.video.MediaFileCacheManager +import com.mogo.och.biz.media.video.MediaPlayLogger +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.utils.RxUtils +import com.shuyu.gsyvideoplayer.listener.GSYSampleCallBack +import io.reactivex.disposables.Disposable + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class AdMediaViewModel : ViewModel(), IVideoListener { + + private val TAG = M_OCHCOMMON + AdMediaViewModel::class.java.simpleName + + private var viewCallback: AdMediaViewCallback? = null + + private var adMediaList = mutableListOf() + // 正在播放 + private var currentPlayingIndex = 0 + private var currentPlayingItem:MediaItem?=null + + private var stationInfomation = mutableListOf() + private var currentStationPlayingIndex = 0 + private var currentStationPlayingItem:MediaItem?=null + + private var playImageDisposable: Disposable? = null + + + // 播放监听 播放完一个再播放另一个 + private var playerAdCallback = object : GSYSampleCallBack() { + override fun onPrepared(url: String?, vararg objects: Any?) { + CallerLogger.d(TAG, "onPrepared") + } + + override fun onAutoComplete(url: String?, vararg objects: Any?) { + CallerLogger.d(TAG, "onAutoComplete") + currentPlayingItem?.pausePosition = 0 + currentPlayingIndex++ + startPlayerAds(currentPlayingIndex) + } + + override fun onPlayError(url: String?, vararg objects: Any?) { + super.onPlayError(url, *objects) + CallerLogger.d(TAG, "onPlayError, error=${objects}") + playVideoError(url) + } + } + + private fun playVideoError(url: String?) { + currentPlayingItem?.let { + if (FileUtils.isFileExists(it.localPath)) { + FileUtils.delete(it.localPath) + } + adMediaList.remove(it) + // 重新下载 + downloadVideo(it) + startPlayerAds(currentPlayingIndex) + MediaPlayLogger.printInfoLog( "clearLocalErrorVideo, localPath=${it.fileUrl}") + } + } + + + override fun onCleared() { + MediaDataSourceManager.unInit() + MediaServiceManager.removeVideoListener(TAG) + } + + fun setAdMediaCallback(viewCallback: AdMediaViewCallback) { + this.viewCallback = viewCallback + MediaServiceManager.invokeCreateCacheFileDir() + MediaServiceManager.addVideoListener(TAG,this) + MediaDataSourceManager.init() + } + + override fun setMediaPause() { + super.setMediaPause() + if (currentPlayingItem?.isImageType()==true) { + RxUtils.disposeSubscribe(playImageDisposable) + }else{ + this.viewCallback?.pauseVideo() + } + } + + override fun setMediaResume() { + super.setMediaResume() + if (currentPlayingItem?.isImageType()==true) { + startPlayerAds(currentPlayingIndex) + }else{ + this.viewCallback?.resumeVideo() + } + } + + /** + * 分发广告数据 + */ + override fun onMediaDataSourceChanged(list: List) { + // 图片直接加入播放列表 视频检查是否缓存成功 没有缓存先缓存 缓存完再进行播放 + CallerLogger.d(TAG,"收到数据-${list}") + val templateList = mutableListOf() + val app = AbsMogoApplication.getApp() + list.forEach { + when (it.fileType) { + MediaItem.MEDIA_TYPE_IMAGE-> { + templateList.add(it) + // 预加载图片到磁盘缓存(指定尺寸) + Glide.with(AbsMogoApplication.getApp()) + .load(it.fileUrl) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .preload() + } + MediaItem.MEDIA_TYPE_VIDEO -> { + val localCachePath = MediaFileCacheManager.getCacheFileFullPathByUrl(app, it.fileUrl) + MediaPlayLogger.printInfoLog("本地已经有缓存文件,可以直接放入列表,videoPath=${localCachePath}") + it.localPath = localCachePath + if (!FileUtils.isFileExists(localCachePath)) { + downloadVideo(it) + // 去下载 + return@forEach + } + templateList.add(it) + } + else -> {} + } + } + adMediaList = templateList + startPlayerAds(0) + } + + private fun startPlayerAds(index:Int) { + if(adMediaList.isNotEmpty()) { + if (index < adMediaList.size) { + currentPlayingIndex = index + currentPlayingItem = adMediaList[index].also { + if (it.isImageType()) { + viewCallback?.startPlayImage(it) + RxUtils.disposeSubscribe(playImageDisposable) + playImageDisposable = RxUtils.createSubscribe(5_000) { + currentPlayingIndex++ + startPlayerAds(currentPlayingIndex) + } + } + if (it.isVideoType()) { + viewCallback?.startPlayVideo(it, playerAdCallback) + } + } + + } else { + // 循环 + startPlayerAds(0) + } + } + } + + private fun downloadVideo(it: MediaItem) { + Logger.d(TAG, "startDownLoadVideoFile, downloadUrl=${it.fileUrl}") + MediaPlayLogger.printInfoLog( "startDownLoadVideoFile, downloadUrl=${it.fileUrl}") + MediaFileCacheManager.downloadFile(it.fileUrl, object : IDownloadListener { + override fun onStart(url: String) { + Logger.d(TAG, "video play download, onStart ${it.title}") + MediaPlayLogger.printInfoLog( "startDownLoadVideoFile 开始下载, downloadUrl=${it.title}") + } + + override fun onProgress(url: String, downloaded: Long, total: Long) { + val percent = (downloaded * 100 / total).toInt() + if (percent % 10 == 0) { + MediaPlayLogger.printInfoLog("downListener,percent=$percent, downloadUrl=${it.title}") + } + } + + override fun onFinished(url: String, path: String) { + Logger.d(TAG, "video play download, onFinished = $url") + //发现下载工具在断网又连网后,已完成的任务又都下载,跳转播放出现问题 + CallerLogger.d(TAG,"下载成功 ${it.fileUrl==url}----${path==it.localPath}") + if (url == it.fileUrl && path == it.localPath) { + Logger.d(TAG, "下载成功 放入列表,$url---${path}") + //下载完成 + synchronized(adMediaList){ + if (!adMediaList.contains(it)) { + adMediaList.add(it) + } + } + } + } + + override fun onError(url: String, error: String?) { + Logger.d(TAG, "video play download, onError msg=$error") + MediaPlayLogger.printErrorLog("download error, 准备重新下载,downloadUrl=${url}") + } + }) + } + + // 播放监听 播放完一个再播放另一个 + private var playerStationCallback = object : GSYSampleCallBack() { + override fun onPrepared(url: String?, vararg objects: Any?) { + CallerLogger.d(TAG, "onPrepared") + } + + override fun onAutoComplete(url: String?, vararg objects: Any?) { + CallerLogger.d(TAG, "onAutoComplete") + currentStationPlayingIndex++ + startPlayeStation(currentStationPlayingIndex) + } + + override fun onPlayError(url: String?, vararg objects: Any?) { + super.onPlayError(url, *objects) + CallerLogger.d(TAG, "onPlayError, error=${objects}") + currentStationPlayingItem?.let { + if (FileUtils.isFileExists(it.localPath)) { + FileUtils.delete(it.localPath) + } + // 重新下载 不播放 + downloadStationVideo(it) + currentStationPlayingIndex++ + startPlayeStation(currentStationPlayingIndex) + } + } + } + + + /** + * 插播站点介绍视频广告 + */ + override fun diapatchMedia(list: MutableList) { + CallerLogger.d(TAG,"收到数据-${list}") + if(list.isEmpty()){ + return + } + // 开始插播 + if(currentPlayingItem?.isImageType()==true){ + RxUtils.disposeSubscribe(playImageDisposable) + } + val templateList = mutableListOf() + val app = AbsMogoApplication.getApp() + list.forEach { + val localCachePath = MediaFileCacheManager.getCacheFileFullPathByUrl(app, it.fileUrl) + MediaPlayLogger.printInfoLog("本地已经有缓存文件,可以直接放入列表,videoPath=${localCachePath}") + it.localPath = localCachePath + if (!FileUtils.isFileExists(localCachePath)) { + downloadStationVideo(it) + // 去下载 + return@forEach + } + templateList.add(it) + } + stationInfomation = templateList + startPlayeStation(0) + } + + + private fun startPlayeStation(index: Int) { + if(stationInfomation.isNotEmpty()) { + if (index < stationInfomation.size) { + currentStationPlayingIndex = index + currentStationPlayingItem = stationInfomation[index].also { + viewCallback?.startPlayStationVideo(it, currentPlayingItem,playerStationCallback) + } + } else { + // 回复播放广告 + currentStationPlayingIndex = 0 + currentStationPlayingItem = null + startPlayerAds(currentPlayingIndex) + } + } + } + + private fun downloadStationVideo(it: MediaItem) { + Logger.d(TAG, "startDownLoadVideoFile, downloadUrl=${it.fileUrl}") + MediaPlayLogger.printInfoLog( "startDownLoadVideoFile, downloadUrl=${it.fileUrl}") + MediaFileCacheManager.downloadFile(it.fileUrl, object : IDownloadListener { + override fun onStart(url: String) { + Logger.d(TAG, "video play download, onStart ${it.title}") + MediaPlayLogger.printInfoLog( "startDownLoadVideoFile 开始下载, downloadUrl=${it.title}") + } + + override fun onProgress(url: String, downloaded: Long, total: Long) { + val percent = (downloaded * 100 / total).toInt() + if (percent % 10 == 0) { + MediaPlayLogger.printInfoLog("downListener,percent=$percent, downloadUrl=${it.title}") + } + } + + override fun onFinished(url: String, path: String) { + Logger.d(TAG, "video play download, onFinished = $url") + //发现下载工具在断网又连网后,已完成的任务又都下载,跳转播放出现问题 + CallerLogger.d(TAG,"下载成功 ${it.fileUrl==url}----${path==it.localPath}") + } + + override fun onError(url: String, error: String?) { + Logger.d(TAG, "video play download, onError msg=$error") + MediaPlayLogger.printErrorLog("download error, 准备重新下载,downloadUrl=${url}") + } + }) + } + + interface AdMediaViewCallback { + fun startPlayImage(it: MediaItem) + fun startPlayVideo(it: MediaItem, playerCallback: GSYSampleCallBack) + fun startPlayStationVideo(stationMediaItem: MediaItem,adMediaItem: MediaItem?, playerCallback: GSYSampleCallBack) + fun pauseVideo() + fun resumeVideo() + + } + + +} + diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdVideoPlayer.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdVideoPlayer.kt new file mode 100644 index 0000000000..77de76c6e2 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/media/video/ads/AdVideoPlayer.kt @@ -0,0 +1,197 @@ +package com.mogo.och.biz.media.video.ads + +import android.content.Context +import android.media.AudioManager +import android.text.TextUtils +import android.util.AttributeSet +import com.mogo.eagle.core.utilcode.mogo.logger.Logger +import com.mogo.eagle.core.widget.media.video.CustomManager +import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider +import com.mogo.och.biz.media.video.MediaLoopPlayView +import com.mogo.och.common.module.biz.media.MediaManager +import com.shuyu.gsyvideoplayer.utils.Debuger +import com.shuyu.gsyvideoplayer.utils.GSYVideoType +import com.shuyu.gsyvideoplayer.video.StandardGSYVideoPlayer +import com.shuyu.gsyvideoplayer.video.base.GSYVideoView +import me.jessyan.autosize.utils.AutoSizeUtils +import com.shuyu.gsyvideoplayer.video.base.GSYVideoViewBridge as GSYVideoViewBridge1 + +class AdVideoPlayer : StandardGSYVideoPlayer { + companion object { + const val TAG = "AdVideoPlayer" + } + constructor(context: Context?) : super(context) + constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) + + init { + hideWidget() + GSYVideoType.setShowType(GSYVideoType.SCREEN_MATCH_FULL) + GSYVideoType.setRenderType(GSYVideoType.GLSURFACE) + } + + override fun init(context: Context) { + super.init(context) + onAudioFocusChangeListener = + AudioManager.OnAudioFocusChangeListener { focusChange -> + when (focusChange) { + AudioManager.AUDIOFOCUS_GAIN -> {} + AudioManager.AUDIOFOCUS_LOSS -> { + //todo 判断如果不是外界造成的就不处理 + } + + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> { + //todo 判断如果不是外界造成的就不处理 + } + + AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {} + } + } + } + override fun getGSYVideoManager(): GSYVideoViewBridge1 { + CustomManager.getCustomManager(key).initContext(context.applicationContext) + return CustomManager.getCustomManager(key) + } + + override fun backFromFull(context: Context): Boolean { + return CustomManager.backFromWindowFull(context, key) + } + + override fun releaseVideos() { + CustomManager.releaseAllVideos(key) + } + + override fun getFullId(): Int { + return CustomManager.FULLSCREEN_ID + } + + override fun getSmallId(): Int { + return CustomManager.SMALL_ID + } + override fun hideAllWidget() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,hideAllWidget") + } + + override fun changeUiToNormal() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToNormal-hide") + hideWidget() + } + + override fun changeUiToPreparingShow() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToPreparingShow-hide") + hideWidget() + } + + override fun changeUiToPlayingShow() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToPlayingShow") + setCacheImageViewGone() + } + + override fun changeUiToPauseShow() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToPauseShow-hide") +// startPlayLogic() + } + + override fun changeUiToCompleteShow() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToCompleteShow") + setCacheImageViewGone() + } + + override fun changeUiToPlayingBufferingShow() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToPlayingBufferingShow") + hideWidget() + } + + override fun changeUiToError() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,changeUiToError") + hideWidget() + } + + private fun hideWidget() { + setViewShowState(mBottomContainer, INVISIBLE) + setViewShowState(mProgressBar, INVISIBLE) + setViewShowState(mCurrentTimeTextView, INVISIBLE) + setViewShowState(mTotalTimeTextView, INVISIBLE) + setViewShowState(mBottomProgressBar, INVISIBLE) + setViewShowState(mBackButton, INVISIBLE) + setViewShowState(mStartButton, INVISIBLE) + + setViewShowState(mThumbImageViewLayout, VISIBLE) + setViewShowState(mThumbImageView, VISIBLE) + + setViewShowState(mTopContainer, INVISIBLE) + setViewShowState(mLoadingProgressBar, INVISIBLE) + setViewShowState(mLockScreen, INVISIBLE) + + setIsTouchWiget(false) + isFocusableInTouchMode = false + } + + private var oldPlaying = false + override fun setStateAndUi(state: Int) { + super.setStateAndUi(state) + Logger.d("AdVideoPlayer", "播放状态 $state") + val playing = state == GSYVideoView.CURRENT_STATE_PLAYING + if (oldPlaying != playing) { + oldPlaying = playing + MediaManager.setVideoFocusChange(playing) + } + } + + fun setCacheImageViewVisible() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,setCacheImageViewVisible") + setViewShowState(mThumbImageViewLayout, VISIBLE) +// setViewShowState(mThumbImageView, VISIBLE) + } + + fun setCacheImageViewGone() { + Logger.d(MediaLoopPlayView.TAG, "AdvanceGSYVideoPlayer,setCacheImageViewGone") + setViewShowState(mThumbImageViewLayout, INVISIBLE) +// setViewShowState(mThumbImageView, INVISIBLE) + } + + //失去焦点声音压低 + override fun onLossTransientCanDuck() { +// setStreamVolume(0.2f) + setNeedMute(true) + } + + //获取焦点声音恢复 + override fun onGankAudio() { +// setStreamVolume(5.0f) + setNeedMute(false) + } + + private fun setStreamVolume(percent: Float) { + var mAudioManager = mContext?.getSystemService(Context.AUDIO_SERVICE) as AudioManager + var maxVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC) + var volume = (percent * maxVolume).toInt() + if (volume < 0) { + volume = 0 + } + mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, volume, 0) + } + + private fun setNeedMute(isMute: Boolean) { + gsyVideoManager?.player?.setNeedMute(isMute) + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + if (!mIfCurrentIsFullscreen) { + val dp2px = AutoSizeUtils.dp2px(context, 16f) + this.outlineProvider = TextureVideoViewOutlineProvider(dp2px.toFloat()) + this.clipToOutline = true + } + } + + private val key: String + get() { + if (mPlayPosition == -22) { + Debuger.printfError(javaClass.simpleName + " used getKey() " + "******* PlayPosition never set. ********") + } + if (TextUtils.isEmpty(mPlayTag)) { + Debuger.printfError(javaClass.simpleName + " used getKey() " + "******* PlayTag never set. ********") + } + return TAG + mPlayPosition + mPlayTag + } +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingProvider.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingProvider.kt new file mode 100644 index 0000000000..2f48d2ea36 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingProvider.kt @@ -0,0 +1,53 @@ +package com.mogo.och.biz.routing + +import android.content.Context +import android.view.View +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.annotation.Route +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.biz.routing.ui.RoutingSwitchView +import com.mogo.och.common.module.biz.routing.RoutingCallback +import com.mogo.och.common.module.biz.routing.RoutingService +import com.mogo.och.common.module.constant.OchCommonConst + + +@Route(path = OchCommonConst.BIZ_ROUTING) +class RoutingProvider : RoutingService { + + private var context: Context? = null + + private val TAG = M_OCHCOMMON + "RoutingProvider" + + private var switchView:RoutingSwitchView?=null + + private var callback:RoutingCallback?=null + + + override fun getRoutingView(): View? { + if(AppIdentityModeUtils.isDriver(FunctionBuildConfig.appIdentityMode)) { + context?.let { + if(switchView==null){ + switchView = RoutingSwitchView(it) + } + return switchView + } + } + return null + } + + override fun setRoutingCallback(callback: RoutingCallback?) { + this.callback = callback + } + + + override fun init(context: Context?) { + this.context = context + } + + fun invokeCallbackShowMap(isShow: Boolean) { + this.callback?.showMap(isShow) + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingServiceManager.kt new file mode 100644 index 0000000000..9b3bbf7cad --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/RoutingServiceManager.kt @@ -0,0 +1,19 @@ +package com.mogo.och.biz.routing + +import android.annotation.SuppressLint +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.och.common.module.constant.OchCommonConst + + +object RoutingServiceManager { + + @SuppressLint("StaticFieldLeak") + private var routingService: RoutingProvider? = + ARouter.getInstance().build(OchCommonConst.BIZ_ROUTING).navigation() as RoutingProvider + + + fun invokeCallback(isShow: Boolean) { + this.routingService?.invokeCallbackShowMap(isShow) + } + +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/bean/RoutingBean.kt similarity index 57% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/bean/RoutingBean.kt index 68d6a2c50e..be5f416f14 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiRoutingBean.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/bean/RoutingBean.kt @@ -1,8 +1,9 @@ -package com.mogo.och.unmanned.taxi.bean +package com.mogo.och.biz.routing.bean import com.mogo.eagle.core.data.BaseData import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.ContraiInfo +import com.mogo.och.data.bean.LineInfo /** * 灰度路线信息 @@ -16,7 +17,9 @@ data class GrayLineBean( var lineFailCount: Int?, //线路累计反馈不可用次数 var isChoosed: Boolean = false, //当前是否选中 var startSite: RoutingSite?, - var endSite: RoutingSite? + var endSite: RoutingSite?, + var allStation:MutableList?=null, + var distance:Float, ) /** @@ -29,7 +32,6 @@ data class RoutingSite( var gcjLon: Double,// 高德坐标 var wgs84Lon: Double,//高精坐标 var wgs84Lat: Double,//高精坐标 - var pointType: Int // 1:途径点 2:禁行点 3:站点 ) { fun toBusStationBean(): BusStationBean { val temp = BusStationBean() @@ -39,7 +41,6 @@ data class RoutingSite( temp.lon = wgs84Lon temp.gcjLat = gcjLat temp.gcjLon = gcjLon - temp.pointType = pointType temp.isLeaving = true return temp } @@ -49,36 +50,65 @@ data class RoutingSite( * 轨迹信息 */ data class ContrailBean( + var businessType:Int=0, + var contrailId: Long = -1L, + var contrailSaveTime: Long = -1L, + var csvFileMd5: String = "", + var csvFileUrl: String = "", var lineId: Long = -1L, var lineName: String = "", - var contrailId: Long = -1L, - var csvFileUrl: String = "", - var csvFileMd5: String = "", - var txtFileUrl: String = "", + var segmentPointList:MutableList = mutableListOf(), var txtFileMd5: String = "", - var contrailSaveTime: Long = -1L, - var csvFileUrlDPQP: String = "", - var csvFileMd5DPQP: String = "", - var txtFileUrlDPQP: String = "", - var txtFileMd5DPQP: String = "", - var contrailSaveTimeDPQP: Long = -1L, - var version: Long = -1L, - var passPoints: MutableList?, // 用于算路的经停点 - var blackPoints: MutableList?, // 用于算路的黑名單點 + var txtFileUrl: String = "", ) { fun toContraiInfo(): ContraiInfo { val tempPassPoints = mutableListOf() - passPoints?.forEach { - tempPassPoints.add(it.toBusStationBean()) - } val tempblackPoints = mutableListOf() - blackPoints?.forEach { - tempPassPoints.add(it.toBusStationBean()) + segmentPointList.forEach { + for (pointInfo in it.blackList) { + tempblackPoints.add(pointInfo.toBusStationBean()) + } + for (pointInfo in it.pointList) { + tempPassPoints.add(pointInfo.toBusStationBean()) + } } - return ContraiInfo(lineId,csvFileUrl,csvFileMd5,txtFileUrl,txtFileMd5,contrailSaveTime,tempPassPoints,tempblackPoints) + return ContraiInfo(lineId,csvFileUrl,csvFileMd5,txtFileUrl,txtFileMd5,contrailSaveTime,tempPassPoints,tempblackPoints, 2) + } + + fun getPassAndBlackPoint(index: Int): Pair, MutableList> { + val tempPassPoints = mutableListOf() + val tempblackPoints = mutableListOf() + segmentPointList.forEach { + if(it.segment==index){ + for (pointInfo in it.blackList) { + tempblackPoints.add(pointInfo.toBusStationBean()) + } + for (pointInfo in it.pointList) { + tempPassPoints.add(pointInfo.toBusStationBean()) + } + return Pair(tempPassPoints,tempblackPoints) + } + } + return Pair(tempPassPoints,tempblackPoints) } } +data class PointInfoGroup(var blackList:MutableList,//用于算路的黑名單點 + var pointList:MutableList,//用于算路的经停点 + var segment:Int) + +data class PointInfo(var latitude:Double,var longitude:Double,var pointType:Int,var segment:Int) { + fun toBusStationBean(): BusStationBean { + val temp = BusStationBean() + temp.lat = latitude + temp.lon = longitude + temp.pointType = pointType + temp.isLeaving = true + return temp + } +} + + /** * 查询灰度线路列表 */ @@ -87,7 +117,7 @@ data class QueryGrayContrailListRsp(var data: MutableList?) : Base /** * 通过id查询轨迹详情 */ -data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long) +data class StartGrayContrailTaskReq(var sn: String, var contrailId: Long, var driverId: Long) /** * 开始一个路线的灰度任务,对服务端的路线标记 @@ -99,11 +129,6 @@ data class StartGrayContrailTaskRsp(var data: Long?) : BaseData() */ data class QueryRoutingContrailByIdRsp(var data: ContrailBean?) : BaseData() -/** - * 上报路线打点 - */ -data class SubmitGrayLineIssueLocationReq(var grayId: Long, var gcjLon: Double, var gcjLat: Double) - /** * 结束一个路线的灰度任务 */ @@ -113,14 +138,14 @@ data class EndGrayContrailTaskReq( var occurrenceTime: Long ) //feedback 1:成功 2:失败 - /** * 灰度任务&查询轨迹详情 */ data class StartGrayAndQueryContrailRsp( var taskId: Long?, var contrail: ContrailBean?, - var grayLineBean: GrayLineBean + var grayLineBean: GrayLineBean, + var stationList: MutableList ) : BaseData() data class PointError(var code: String, var name: String, var isCheck: Boolean = false) @@ -140,13 +165,35 @@ data class SaveGrayContrailErrorReasons( var wgs84Lon: Double, var wgs84Lat: Double, var occurrenceTime: Long, + var plateNumber: String, + var driverId: Long, var noteCodes: MutableList, ) //feedback 1:成功 2:失败 +/** + * 小巴、接驳、班车 获取站点的参数 + */ +data class QuerySitesReasons( + var lineId: Long, // 线路id + var businessType: Int,// 业务模式 +) + + enum class EndGrayTaskFeedbackType(var type: Int) { USABLE_YES(1), USABLE_NO(2) } +data class BindLineListResponse(val data: List?) : BaseData() { + + data class Result( + var line: LineInfo?, + var siteList: List?,//站点名称 + ) +} + +data class SitesInfo(val data: List?) : BaseData() + + diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceApi.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceApi.kt similarity index 69% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceApi.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceApi.kt index dfcd485afe..ae6a69c90c 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceApi.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceApi.kt @@ -1,16 +1,17 @@ -package com.mogo.och.unmanned.taxi.network +package com.mogo.och.biz.routing.net import com.mogo.cloud.passport.MoGoAiCloudClientConfig import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.data.BaseData -import com.mogo.och.unmanned.taxi.bean.EndGrayContrailTaskReq -import com.mogo.och.unmanned.taxi.bean.QueryGrayContrailListRsp -import com.mogo.och.unmanned.taxi.bean.QueryPointErrorReasonsRsp -import com.mogo.och.unmanned.taxi.bean.QueryRoutingContrailByIdRsp -import com.mogo.och.unmanned.taxi.bean.SaveGrayContrailErrorReasons -import com.mogo.och.unmanned.taxi.bean.StartGrayContrailTaskReq -import com.mogo.och.unmanned.taxi.bean.StartGrayContrailTaskRsp -import com.mogo.och.unmanned.taxi.bean.SubmitGrayLineIssueLocationReq +import com.mogo.och.biz.routing.bean.BindLineListResponse +import com.mogo.och.biz.routing.bean.QueryGrayContrailListRsp +import com.mogo.och.biz.routing.bean.QueryPointErrorReasonsRsp +import com.mogo.och.biz.routing.bean.QueryRoutingContrailByIdRsp +import com.mogo.och.biz.routing.bean.QuerySitesReasons +import com.mogo.och.biz.routing.bean.SaveGrayContrailErrorReasons +import com.mogo.och.biz.routing.bean.SitesInfo +import com.mogo.och.biz.routing.bean.StartGrayContrailTaskReq +import com.mogo.och.biz.routing.bean.StartGrayContrailTaskRsp import io.reactivex.Observable import retrofit2.http.Body import retrofit2.http.GET @@ -19,13 +20,13 @@ import retrofit2.http.Headers import retrofit2.http.POST import retrofit2.http.Query -interface TaxiRoutingServiceApi { +interface RoutingServiceApi { /** * 查询灰度线路列表 */ @Headers("Content-type:application/json;charset=UTF-8") - @GET("/och-taxi-cabin/api/business/v1/queryGrayContrailList") + @GET("/och-contrail/contrail/queryGrayContrailList") fun queryRoutingGrayLineList( @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, @@ -36,7 +37,7 @@ interface TaxiRoutingServiceApi { * 开始一个路线的灰度任务 */ @Headers("Content-type:application/json;charset=UTF-8") - @POST("/och-taxi-cabin/api/business/v1/startGray") + @POST("/och-contrail/grayFeedback/saveFeedback") fun startGrayTask( @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, @@ -44,36 +45,26 @@ interface TaxiRoutingServiceApi { ): Observable /** - * 根据id查询灰度轨迹详情 + * 根据轨迹id查询轨迹信息 */ @Headers("Content-type:application/json;charset=UTF-8") - @GET("/och-taxi-cabin/api/business/v1/gray/contrail") + @GET("/och-contrail/contrail/queryCabinContrailById") fun queryRoutingContrailById( @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, - @Query("id") contrailId: Long + @Query("contrailId") contrailId: Long ): Observable - /** - * 上报路线打点 - */ - @Headers("Content-type:application/json;charset=UTF-8") - @POST("/och-taxi-cabin/api/business/v1/saveDotDetail") - fun submitGrayLineIssueLocation( - @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, - @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, - @Body data: SubmitGrayLineIssueLocationReq - ): Observable - /** * 结束一个路线的灰度任务 */ @Headers("Content-type:application/json;charset=UTF-8") - @POST("/och-taxi-cabin/api/business/v1/endGray") + @GET("/och-contrail/grayFeedback/update") fun endGrayTask( @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, - @Body data: EndGrayContrailTaskReq + @Query("id") id:Long, + @Query("feedback") feedback:Int, ): Observable /** @@ -90,10 +81,22 @@ interface TaxiRoutingServiceApi { * 结束一个路线的灰度任务 */ @Headers("Content-type:application/json;charset=UTF-8") - @POST("/och-taxi-cabin/api/business/v1/saveDotDetail") + @POST("/och-contrail/dotDetail/save") fun saveDotDetail( @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, @Body data: SaveGrayContrailErrorReasons ): Observable + + + + @Headers("Content-type:application/json;charset=UTF-8") + @POST("/och-vehicle/api/line/querySiteListByLine") + fun querySiteListByLine( + @Header("appId") appId: String = MoGoAiCloudClientConfig.getInstance().serviceAppId, + @Header("ticket") ticket: String = SharedPrefsMgr.getInstance().token, + @Body data: QuerySitesReasons + ): Observable + + } \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceManager.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceManager.kt new file mode 100644 index 0000000000..e24d2afc28 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/net/RoutingServiceManager.kt @@ -0,0 +1,172 @@ +package com.mogo.och.biz.routing.net + +import android.content.Context +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.network.MoGoRetrofitFactory +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.och.biz.routing.bean.EndGrayContrailTaskReq +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.QueryGrayContrailListRsp +import com.mogo.och.biz.routing.bean.QueryPointErrorReasonsRsp +import com.mogo.och.biz.routing.bean.QuerySitesReasons +import com.mogo.och.biz.routing.bean.SaveGrayContrailErrorReasons +import com.mogo.och.biz.routing.bean.SitesInfo +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.biz.routing.bean.StartGrayContrailTaskReq +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.network.OchCommonSubscribeImpl +import com.mogo.och.common.module.network.interceptor.transformTry +import com.mogo.och.data.bean.BusStationBean +import com.mogo.och.weaknet.repository.db.exception.NetDataException +import io.reactivex.Observable + +object RoutingServiceManager { + + private var mRoutingServiceApi: RoutingServiceApi = + MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( + RoutingServiceApi::class.java + ) + + /** + * 查询灰度路线列表 + */ + fun queryRoutingGrayLineList( + context: Context, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.queryRoutingGrayLineList( + sn = SharedPrefsMgr.getInstance().sn + ) + .transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingGrayLineList")) + } + + /** + * 结束一个灰度任务 + */ + fun endGrayTask( + context: Context, + data: EndGrayContrailTaskReq, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.endGrayTask(id = data.grayId, feedback = data.feedback).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "endGrayTask")) + } + + fun getErrorPointReasons( + context: Context, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.getDotErrorList().transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) + } + fun saveDotDetail( + context: Context, + data: SaveGrayContrailErrorReasons, + callback: OchCommonServiceCallback + ) { + mRoutingServiceApi.saveDotDetail(data = data).transformTry() + .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) + } + + /** + * 标记灰度任务被启动验证 + */ + fun startGrayTaskAndQueryRoutingContrail( + context: Context, + sn: String, + contrailId: Long, + grayLineBean: GrayLineBean, + callback: OchCommonServiceCallback + ) { + val data = StartGrayContrailTaskReq(sn, contrailId ,LoginStatusManager.getOchLoginInfo()?.driverId?:0L) + + val requestContral = mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId) + val startRouting = mRoutingServiceApi.startGrayTask(data = data) + + + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) + ) { + val request = QuerySitesReasons(grayLineBean.lineId?:0, + LoginStatusManager.getOchBizInfo()?.businessType?:11) + val querySites = mRoutingServiceApi.querySiteListByLine(data = request) + + Observable.zip(requestContral,startRouting,querySites) { t1, t2, t3 -> + if ((t1.code != 0 && t1.code != 200) || t1.data == null) { + throw NetDataException(t1.code, "${t1.msg}_queryCabinContrailById") + } + if (t2.code != 0 && t2.code != 200 || t2.data == null) { + throw NetDataException(t2.code, "${t2.msg}_saveFeedback") + } + if (t3.code != 0 && t3.code != 200 || t3.data.isNullOrEmpty()) { + throw NetDataException(t3.code, "${t3.msg}_saveFeedback") + } + val stationList = mutableListOf() + t3.data.let { lineList-> + lineList.forEach { + stationList.add(it.toBusStationBean()) + } + } + val result = StartGrayAndQueryContrailRsp( + taskId = t2.data!!, + contrail = t1.data, + grayLineBean = grayLineBean, + stationList = stationList + ) + result.code = t1.code + result.msg = t1.msg + result + }.transformTry() + .subscribe( + OchCommonSubscribeImpl( + context, + callback, + "startGrayTaskAndQueryRoutingContrail" + ) + ) + }else if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + Observable.zip(requestContral,startRouting) { t1, t2 -> + if ((t1.code != 0 && t1.code != 200)||t1.data==null) { + throw NetDataException(t1.code,"${t1.msg}_queryCabinContrailById") + } + if (t2.code != 0 && t2.code != 200||t2.data==null) { + throw NetDataException(t2.code,"${t2.msg}_saveFeedback") + } + val stationList = mutableListOf() + grayLineBean.startSite?.toBusStationBean()?.let { + stationList.add(it) + } + grayLineBean.endSite?.toBusStationBean()?.let { + stationList.add(it) + } + val result = StartGrayAndQueryContrailRsp( + taskId = t2.data!!, + contrail = t1.data, + grayLineBean = grayLineBean, + stationList = stationList + ) + result.code = t1.code + result.msg = t1.msg + result + }.transformTry() + .subscribe( + OchCommonSubscribeImpl( + context, + callback, + "startGrayTaskAndQueryRoutingContrail" + ) + ) + } + + } + + fun querySiteListByList(request: QuerySitesReasons): Observable { + return mRoutingServiceApi.querySiteListByLine(data = request) + } +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchModel.kt similarity index 90% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchModel.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchModel.kt index de6b70808c..2ac7638b28 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchModel.kt @@ -1,8 +1,8 @@ -package com.mogo.och.unmanned.taxi.ui.routing +package com.mogo.och.biz.routing.ui import androidx.lifecycle.ViewModel +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp import com.mogo.och.common.module.manager.loop.BizLoopManager -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp /** * @author XuXinChao diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchView.kt similarity index 51% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchView.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchView.kt index 706c708094..e8baee88b2 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/RoutingSwitchView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/RoutingSwitchView.kt @@ -1,21 +1,25 @@ -package com.mogo.och.unmanned.taxi.ui.routing +package com.mogo.och.biz.routing.ui import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.constraintlayout.widget.ConstraintLayout -import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.utils.ResourcesUtils -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.TaxiUnmannedDriverProvider -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import kotlinx.android.synthetic.main.unmanned_routing_switch.view.routingRunningView -import kotlinx.android.synthetic.main.unmanned_routing_switch.view.routingSelectView -import kotlinx.android.synthetic.main.unmanned_routing_switch.view.switch_routing_loading +import com.mogo.och.common.module.utils.RxUtils +import kotlinx.android.synthetic.main.biz_taxi_switch.view.routingOtherRunningView +import kotlinx.android.synthetic.main.biz_taxi_switch.view.routingSelectView +import kotlinx.android.synthetic.main.biz_taxi_switch.view.routingTaxiRunningView +import kotlinx.android.synthetic.main.biz_taxi_switch.view.switch_routing_loading class RoutingSwitchView: ConstraintLayout, RoutingSwitchModel.SwtichLineViewCallback { @@ -35,17 +39,17 @@ class RoutingSwitchView: ConstraintLayout, RoutingSwitchModel.SwtichLineViewCall private var viewModel: RoutingSwitchModel?=null - private var fragment: LifecycleOwner?=null + private var data: StartGrayAndQueryContrailRsp?=null + init { - LayoutInflater.from(context).inflate(R.layout.unmanned_routing_switch, this, true) + LayoutInflater.from(context).inflate(R.layout.biz_taxi_switch, this, true) initView() initEventBus() } private fun initView(){ - fragment = TaxiUnmannedDriverProvider.getFragmentInfo() switch_routing_loading.setEmptyText(ResourcesUtils.getString(R.string.common_biz_loading)) } @@ -57,7 +61,15 @@ class RoutingSwitchView: ConstraintLayout, RoutingSwitchModel.SwtichLineViewCall super.onVisibilityAggregated(isVisible) if(isVisible){ showLoadingView() - showRoutingSelectView() + if (MogoStatusManager.getInstance().isTaxiUnmanedDriverLineRoutingPerformTask) { + if(data!=null){ + showRoutingRunning(data!!) + }else{ + showRoutingSelectView() + } + }else { + showRoutingSelectView() + } } } @@ -67,39 +79,63 @@ class RoutingSwitchView: ConstraintLayout, RoutingSwitchModel.SwtichLineViewCall override fun showLoadingView(){ startLoading = System.currentTimeMillis() routingSelectView.visibility = GONE - routingRunningView.visibility = GONE + routingTaxiRunningView.visibility = GONE + routingOtherRunningView.visibility = GONE switch_routing_loading.visibility = VISIBLE } override fun showRoutingSelectView() { + this.data = null val endLoading = System.currentTimeMillis() val dex = (100-(endLoading - startLoading)).takeIf { it>=0 }?:0 CallerLogger.d(TAG,"展示选择线路 lading 展示了 ${dex}毫秒") ThreadUtils.runOnUiThreadDelayed({ routingSelectView.visibility = VISIBLE - routingRunningView.visibility = GONE + routingTaxiRunningView.visibility = GONE + routingOtherRunningView.visibility = GONE switch_routing_loading.visibility = GONE },dex, ThreadUtils.MODE.QUEUE) } override fun showRoutingRunning(data: StartGrayAndQueryContrailRsp) { + this.data = data val endLoading = System.currentTimeMillis() val dex = (100-(endLoading - startLoading)).takeIf { it>=0 }?:0 CallerLogger.d(TAG,"展示线路 lading 展示了 ${dex}毫秒") - ThreadUtils.runOnUiThreadDelayed({ + OchChainLogManager.writeChainLogRouting("展示线路:","延时${dex}ms") + RxUtils.createSubscribe(dex) { + OchChainLogManager.writeChainLogRouting("展示线路:","信息:$data") routingSelectView.visibility = GONE - routingRunningView.visibility = VISIBLE switch_routing_loading.visibility = GONE - routingRunningView.setData(data) - },dex, ThreadUtils.MODE.QUEUE) + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) + ) { + routingTaxiRunningView.visibility = GONE + routingOtherRunningView.visibility = VISIBLE + routingOtherRunningView.setData(data) + }else if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + routingTaxiRunningView.visibility = VISIBLE + routingOtherRunningView.visibility = GONE + routingTaxiRunningView.setData(data) + } + } } override fun onAttachedToWindow() { + CallerLogger.d(TAG,"onAttachedToWindow") super.onAttachedToWindow() viewModel = findViewTreeViewModelStoreOwner()?.let { ViewModelProvider(it).get(RoutingSwitchModel::class.java) } viewModel?.setDistanceCallback(this) + data = null + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerLogger.d(TAG,"onDetachedFromWindow") + data = null } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ErrorPointItemAdapter.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ErrorPointItemAdapter.kt similarity index 82% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ErrorPointItemAdapter.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ErrorPointItemAdapter.kt index 8246fef006..a09d5839a5 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ErrorPointItemAdapter.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ErrorPointItemAdapter.kt @@ -1,16 +1,15 @@ -package com.mogo.och.unmanned.taxi.ui.routing.errorpoint +package com.mogo.och.biz.routing.ui.errorpoint import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.CheckBox import androidx.appcompat.widget.AppCompatImageView import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.PointError +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.bean.PointError import me.jessyan.autosize.AutoSizeCompat /** @@ -40,7 +39,7 @@ class ErrorPointItemAdapter( override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TextVH { val view: View val inflater = LayoutInflater.from(context) - view = inflater.inflate(R.layout.taxt_report_error_point_item, parent, false) + view = inflater.inflate(R.layout.biz_taxi_report_error_point_item, parent, false) return TextVH(view) } @@ -48,9 +47,9 @@ class ErrorPointItemAdapter( val errorInfo = dataList[holder.bindingAdapterPosition] AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources) if (errorInfo.isCheck) { - holder.cbErrorInfo.setImageResource(R.drawable.taxi_routing_check) + holder.cbErrorInfo.setImageResource(R.drawable.biz_taxi_routing_check) }else{ - holder.cbErrorInfo.setImageResource(R.drawable.taxi_routing_uncheck) + holder.cbErrorInfo.setImageResource(R.drawable.biz_taxi_uncheck) } holder.cbErrorResong.text = errorInfo.name holder.itemView.onClick { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointView.kt similarity index 84% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointView.kt index d6e9c4820b..9d322dd461 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointView.kt @@ -1,29 +1,25 @@ -package com.mogo.och.unmanned.taxi.ui.routing.errorpoint +package com.mogo.och.biz.routing.ui.errorpoint import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager -import com.google.android.flexbox.AlignItems -import com.google.android.flexbox.FlexDirection -import com.google.android.flexbox.FlexWrap -import com.google.android.flexbox.FlexboxLayoutManager import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.bean.PointError import com.mogo.och.common.module.wigets.WindowRelativeLayout import com.mogo.och.common.module.wigets.dialog.CommonDialogView import com.mogo.och.common.module.wigets.dialog.CommonFeedbackDialog -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.PointError -import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.lvs_loding -import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.rvErrorPointReason -import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_report_error_point_reason -import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_report_error_point_reason_cancel -import kotlinx.android.synthetic.main.taxt_report_error_point_panel.view.tv_work_order_time +import kotlinx.android.synthetic.main.biz_taxi_report_error_point_panel.view.rvErrorPointReason +import kotlinx.android.synthetic.main.biz_taxi_report_error_point_panel.view.lvs_loding +import kotlinx.android.synthetic.main.biz_taxi_report_error_point_panel.view.tv_report_error_point_reason +import kotlinx.android.synthetic.main.biz_taxi_report_error_point_panel.view.tv_report_error_point_reason_cancel +import kotlinx.android.synthetic.main.biz_taxi_report_error_point_panel.view.tv_work_order_time /** * @@ -78,7 +74,7 @@ class ReportErrorPointView : WindowRelativeLayout, private fun initView() { d(SceneConstant.M_TAXI_P + TAG, "initView") - LayoutInflater.from(context).inflate(R.layout.taxt_report_error_point_panel, this, true) + LayoutInflater.from(context).inflate(R.layout.biz_taxi_report_error_point_panel, this, true) rvErrorPointReason?.layoutManager = GridLayoutManager(context, 2) rvErrorPointReason?.setHasFixedSize(true) diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointViewModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointViewModel.kt similarity index 85% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointViewModel.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointViewModel.kt index 8520895b29..0b989c8a2e 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/errorpoint/ReportErrorPointViewModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/errorpoint/ReportErrorPointViewModel.kt @@ -1,16 +1,17 @@ -package com.mogo.och.unmanned.taxi.ui.routing.errorpoint +package com.mogo.och.biz.routing.ui.errorpoint import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.biz.routing.bean.PointError +import com.mogo.och.biz.routing.bean.QueryPointErrorReasonsRsp +import com.mogo.och.biz.routing.bean.SaveGrayContrailErrorReasons +import com.mogo.och.biz.routing.net.RoutingServiceManager import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.unmanned.taxi.bean.PointError -import com.mogo.och.unmanned.taxi.bean.QueryPointErrorReasonsRsp -import com.mogo.och.unmanned.taxi.bean.SaveGrayContrailErrorReasons -import com.mogo.och.unmanned.taxi.network.TaxiRoutingServiceManager class ReportErrorPointViewModel : ViewModel() { @@ -30,7 +31,7 @@ class ReportErrorPointViewModel : ViewModel() { } fun getPointErrorReasons(){ - TaxiRoutingServiceManager.getErrorPointReasons( + RoutingServiceManager.getErrorPointReasons( AbsMogoApplication.getApp(), object : OchCommonServiceCallback { override fun onSuccess(data: QueryPointErrorReasonsRsp?) { @@ -70,6 +71,7 @@ class ReportErrorPointViewModel : ViewModel() { checkDataList.forEach {pointError-> errorReasonCodes.add(pointError.code) } + val saveGrayContrailErrorReasons = SaveGrayContrailErrorReasons( it, gcj02.longitude, @@ -77,9 +79,11 @@ class ReportErrorPointViewModel : ViewModel() { wgs84.longitude, wgs84.latitude, occurrenceTime, + LoginStatusManager.getOchCarInfo()?.plateNumber?:"", + LoginStatusManager.getOchLoginInfo()?.driverId?:0L, errorReasonCodes ) - TaxiRoutingServiceManager.saveDotDetail( + RoutingServiceManager.saveDotDetail( AbsMogoApplication.getApp(), saveGrayContrailErrorReasons, object : OchCommonServiceCallback { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingItemAdapter.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingItemAdapter.kt similarity index 63% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingItemAdapter.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingItemAdapter.kt index a00ac183ae..ec90804f66 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingItemAdapter.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingItemAdapter.kt @@ -1,6 +1,9 @@ -package com.mogo.och.unmanned.taxi.ui.routing.routingselect +package com.mogo.och.biz.routing.ui.routingselect import android.content.Context +import android.text.Spannable +import android.text.SpannableString +import android.text.style.ForegroundColorSpan import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -8,10 +11,13 @@ import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.DiffUtil import androidx.recyclerview.widget.DiffUtil.Callback import androidx.recyclerview.widget.RecyclerView -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.GrayLineBean +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.SitesInfo +import com.mogo.och.common.module.utils.ResourcesUtils import me.jessyan.autosize.AutoSizeCompat + /** * 路线列表adapter */ @@ -25,7 +31,11 @@ class RoutingItemAdapter( // RecyclerView设置点击事件 private var mItemClickListener: LineItemClickListener? = null + private val middleCOlor =ResourcesUtils.getColor(R.color.biz_routing_2eacff) + private val allCOlor =ResourcesUtils.getColor(R.color.color_FFFFFF) + fun setDataList(dataList: List) { + if (this.mData == dataList) { // 如果新旧列表一致,则直接返回 return @@ -42,7 +52,7 @@ class RoutingItemAdapter( viewType: Int ): RoutingItemViewHolder { val view = LayoutInflater.from(mContext).inflate( - R.layout.unmanned_routing_select_item, parent, false + R.layout.biz_taxi_select_item, parent, false ) return RoutingItemViewHolder(view) } @@ -51,10 +61,39 @@ class RoutingItemAdapter( val currentPosition = holder.bindingAdapterPosition val routing = mData[currentPosition] AutoSizeCompat.autoConvertDensityOfGlobal(holder.itemView.resources) - + holder.routingId.text = "${routing.lineId}" holder.routingName.text = routing.lineName holder.todayVerifyNum.text = "今日验证:${routing.carVerificationCount}次" - holder.routingEndName.text = "往${routing.endSite?.siteName?:""}方向" + val startName = routing.startSite?.siteName ?: "" + val endName = routing.endSite?.siteName ?: "" + if(routing.allStation.isNullOrEmpty()||routing.allStation?.size==2){ + holder.routingEndName.text = "${startName} - ${endName}" + }else{ + routing.allStation?.let { + val middleStationSize = it.size-2 + val spannableString = SpannableString("${startName} - ${middleStationSize}站 - ${endName}") + // 设置不同颜色范围 + spannableString.setSpan( + ForegroundColorSpan(allCOlor), + 0, startName.length+2, // 从索引0开始的前4个字符 + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ); + + spannableString.setSpan( + ForegroundColorSpan(middleCOlor), + startName.length+3, startName.length+5, // 索引5-9的字符 + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ); + + spannableString.setSpan( + ForegroundColorSpan(allCOlor), + startName.length+6, spannableString.length, // 索引10-14的字符 + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + holder.routingEndName.text = spannableString + } + + } holder.historyVerifyNumEnableNum.text = "${routing.lineSuccessCount}可用" holder.historyVerifyNumDisenableNum.text = "${routing.lineFailCount}不可用" //设置item点击事件 @@ -71,7 +110,14 @@ class RoutingItemAdapter( mItemClickListener = itemClickListener } + fun upDateInfo(grayLineBean: GrayLineBean, data: SitesInfo) { + grayLineBean.allStation = data.data?.toMutableList() + val indexOf = mData.indexOf(grayLineBean) + notifyItemChanged(indexOf) + } + class RoutingItemViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val routingId: AppCompatTextView = itemView.findViewById(R.id.actv_routing_id)//线路名称 val routingName: AppCompatTextView = itemView.findViewById(R.id.actv_routing_name)//线路名称 val todayVerifyNum: AppCompatTextView = itemView.findViewById(R.id.actv_today_verify_num) //终点 val routingEndName: AppCompatTextView = itemView.findViewById(R.id.actv_routing_end_name) //终点站点名称 diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectModel.kt similarity index 54% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectModel.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectModel.kt index 838be6e954..80e10d12b7 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectModel.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.taxi.ui.routing.routingselect +package com.mogo.och.biz.routing.ui.routingselect import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication @@ -6,20 +6,28 @@ import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.QueryGrayContrailListRsp +import com.mogo.och.biz.routing.bean.QuerySitesReasons +import com.mogo.och.biz.routing.bean.SitesInfo +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.biz.routing.net.RoutingServiceManager import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.LineInfo -import com.mogo.och.unmanned.taxi.bean.GrayLineBean -import com.mogo.och.unmanned.taxi.bean.QueryGrayContrailListRsp -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.network.TaxiRoutingServiceManager -import com.mogo.och.unmanned.taxi.ui.debug.DebugView -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingModel -import com.mogo.och.unmanned.taxi.ui.routing.routingrunning.RoutingRunningModel +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.biz.login.LoginStatusManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.network.OchCommonNet +import io.reactivex.Observer +import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers /** * @author XuXinChao @@ -28,7 +36,7 @@ import com.mogo.och.unmanned.taxi.ui.routing.routingrunning.RoutingRunningModel */ class RoutingSelectModel : ViewModel() { - private val TAG = RoutingRunningModel::class.java.simpleName + private val TAG = M_OCHCOMMON +"RoutingSelectModel" private var viewCallback: SwtichRoutingViewCallback? = null @@ -39,13 +47,41 @@ class RoutingSelectModel : ViewModel() { } + fun queryStationList(grayLineBean: GrayLineBean) { + val request = QuerySitesReasons(grayLineBean.lineId?:0, + LoginStatusManager.getOchBizInfo()?.businessType?:11) + RoutingServiceManager.querySiteListByList(request) + .flatMap(OchCommonNet("queryBusRoutes",false)) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(AndroidSchedulers.mainThread()) + ?.subscribe(object : Observer { + override fun onSubscribe(d: Disposable) { + d(TAG, "queryBusRoutes onSubscribe") + } + + override fun onError(e: Throwable) { + e.printStackTrace() + OchChainLogManager.writeChainLogError("查询站点错误","灰度信息${grayLineBean}") + } + + override fun onComplete() { + d(TAG, "queryBusRoutes onComplete") + } + + override fun onNext(data: SitesInfo) { + viewCallback?.updateAdapter(grayLineBean,data) + } + }) + + } + /** * 查询灰度路线 */ fun queryRoutingGrayLineList() { - DebugView.printInfoMsg("[查询灰度路线] 准备发送请求,sn=${SharedPrefsMgr.getInstance().sn}") + OchChainLogManager.writeChainLogRouting("[查询灰度路线]","[查询灰度路线] 准备发送请求,sn=${SharedPrefsMgr.getInstance().sn}") - TaxiRoutingServiceManager.queryRoutingGrayLineList( + RoutingServiceManager.queryRoutingGrayLineList( content, object : OchCommonServiceCallback { override fun onSuccess(data: QueryGrayContrailListRsp) { @@ -53,11 +89,17 @@ class RoutingSelectModel : ViewModel() { TAG, "queryRoutingGrayLineList onSuccess: data=${GsonUtils.toJson(data)}" ) - DebugView.printInfoMsg("[查询灰度路线] 请求success,dataSize=${data?.data?.size}") + OchChainLogManager.writeChainLogRouting("[查询灰度路线]","[查询灰度路线] 请求success,dataSize=${data?.data?.size}") val result = mutableListOf() data.data?.also { result.addAll(it) } + result.forEach { + it.startSite?.let { startSite-> + it.distance = BridgeManager.distance2Point( startSite.gcjLon, startSite.gcjLat,) + } + } + result.sortBy { it.distance } viewCallback?.onQueryRoutingGrayLineListSuccess(result) } @@ -66,7 +108,7 @@ class RoutingSelectModel : ViewModel() { TAG, "queryRoutingGrayLineList onFail: code=$code, msg=$msg" ) - DebugView.printErrorMsg("[查询灰度路线] 请求fail, code=$code, msg=$msg, sn=${SharedPrefsMgr.getInstance().sn}") + OchChainLogManager.writeChainLogRouting("[查询灰度路线]","[查询灰度路线] 请求fail, code=$code, msg=$msg, sn=${SharedPrefsMgr.getInstance().sn}") ToastUtils.showShort("查询灰度线路列表异常, 请稍后重试, code=$code") viewCallback?.onQueryRoutingGrayLineListFailed(msg ?: "查询灰度线路列表异常, 请稍后重试") } @@ -83,7 +125,7 @@ class RoutingSelectModel : ViewModel() { TAG, "queryRoutingGrayLineList onError, msg=$hintStr, sn=${SharedPrefsMgr.getInstance().sn}" ) - DebugView.printErrorMsg("[查询灰度路线] 请求error, msg=$hintStr") + OchChainLogManager.writeChainLogRouting("[查询灰度路线]","[查询灰度路线] 请求error, msg=$hintStr") viewCallback?.onQueryRoutingGrayLineListFailed(hintStr) } }) @@ -93,8 +135,8 @@ class RoutingSelectModel : ViewModel() { * 开始灰度任务&查询轨迹详情 */ fun startGrayTaskAndQueryRoutingContrail(contrailId: Long, grayLineBean: GrayLineBean) { - DebugView.printInfoMsg("[开始灰度任务&查询轨迹详情] 准备发送请求,contrailId=${contrailId}, lineId=${grayLineBean.lineId}") - TaxiRoutingServiceManager.startGrayTaskAndQueryRoutingContrail( + OchChainLogManager.writeChainLogRouting("[开始灰度任务&查询轨迹详情]","[开始灰度任务&查询轨迹详情] 准备发送请求,contrailId=${contrailId}, lineId=${grayLineBean.lineId}") + RoutingServiceManager.startGrayTaskAndQueryRoutingContrail( content, sn = SharedPrefsMgr.getInstance().sn, contrailId = contrailId, @@ -109,7 +151,7 @@ class RoutingSelectModel : ViewModel() { ) }" ) - DebugView.printInfoMsg("[开始灰度任务&查询轨迹详情] 请求success,taskId=${data.taskId}, contrailId=${contrailId}, lineId=${grayLineBean.lineId}") + OchChainLogManager.writeChainLogRouting("[开始灰度任务&查询轨迹详情]","[开始灰度任务&查询轨迹详情] 请求success,taskId=${data.taskId}, contrailId=${contrailId}, lineId=${grayLineBean.lineId}") initAutopilot(data) } @@ -119,7 +161,7 @@ class RoutingSelectModel : ViewModel() { TAG, "startGrayTaskAndQueryRoutingContrail onFail: code=$code, msg=$msg" ) - DebugView.printErrorMsg("[开始灰度任务&查询轨迹详情] 请求fail, code=$code, msg=$msg, contrailId=${contrailId}, lineId=${grayLineBean.lineId}") + OchChainLogManager.writeChainLogRouting("[开始灰度任务&查询轨迹详情]","[开始灰度任务&查询轨迹详情] 请求fail, code=$code, msg=$msg, contrailId=${contrailId}, lineId=${grayLineBean.lineId}") viewCallback?.onStartGrayTaskAndQueryContrailFailed( msg ?: "startGrayTaskAndQueryRoutingContrail onFail") } @@ -135,7 +177,7 @@ class RoutingSelectModel : ViewModel() { TAG, "startGrayTaskAndQueryRoutingContrail onError, msg=$hintStr, contrailId=${contrailId}, lineId=${grayLineBean.lineId}" ) - DebugView.printErrorMsg("[开始灰度任务&查询轨迹详情] 请求error, msg=$hintStr") + OchChainLogManager.writeChainLogRouting("[开始灰度任务&查询轨迹详情]","[开始灰度任务&查询轨迹详情] 请求error, msg=$hintStr") viewCallback?.onStartGrayTaskAndQueryContrailFailed(hintStr) } } @@ -143,41 +185,40 @@ class RoutingSelectModel : ViewModel() { } private fun initAutopilot(data: StartGrayAndQueryContrailRsp) { - DebugView.printInfoMsg("[开始任务] 准备开始任务") + OchChainLogManager.writeChainLogRouting("[开始任务]","[开始任务] 准备开始任务") val grayLineBean = data.grayLineBean val contrailBean = data.contrail val grayId = data.taskId - if (grayLineBean == null || contrailBean == null) { + val stationList = data.stationList + if (grayLineBean == null || contrailBean == null || stationList.size < 2) { ToastUtils.showShort("灰度线路或轨迹信息异常,请稍后再试") - DebugView.printErrorMsg("[开始任务] 灰度线路或轨迹信息异常,请稍后再试") + OchChainLogManager.writeChainLogRouting("[开始任务]","[开始任务] 灰度线路或轨迹信息异常,请稍后再试") return } - DebugView.printInfoMsg("[启自驾] 准备启动自驾") + OchChainLogManager.writeChainLogRouting("[启自驾]","[启自驾] 准备启动自驾") - val startStation = grayLineBean.startSite?.toBusStationBean() - val endStation = grayLineBean.endSite?.toBusStationBean() - val temp = mutableListOf() - if(startStation!=null){ - temp.add(startStation) - } - if(endStation!=null){ - temp.add(endStation) + stationList.forEachIndexed { index, busStationBean -> + if(index>0){ + val (tempPassPoints, tempblackPoints) = contrailBean.getPassAndBlackPoint(index) + busStationBean.passPoints = tempPassPoints + busStationBean.blackPoints = tempblackPoints + } } + LineManager.setLineInfo( - LineInfo( - grayLineBean.lineId?:0L, + LineInfo(grayLineBean.lineId?:0L, grayLineBean.lineName?:"", orderId = "${data.taskId}", - siteInfos = temp - ) + siteInfos = stationList) ) LineManager.setContraiInfo(contrailBean.toContraiInfo()) - LineManager.setStartAndEndStation(startStation,endStation) CallerEagleBaseFunctionCall4OchManager.updateOrderStatus(true) viewCallback?.onStartGrayTaskAndQueryContrailSuccess(data) // Routing 从这里解析出经停信息,轨迹信息,并调用下载轨迹接口 - LineManager.initAutopilotControlParameters()?.let { + LineManager.initAutopilotControlParametersFromContrai()?.let { + CallerLogger.d(TAG,"下发下载轨迹信息:${it}") + OchChainLogManager.writeChainLogRouting("[启自驾]","下发下载轨迹信息:${it}") CallerAutoPilotControlManager.sendTrajectoryDownloadReq(it) } } @@ -200,6 +241,8 @@ class RoutingSelectModel : ViewModel() { */ fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) + fun updateAdapter(grayLineBean: GrayLineBean, data: SitesInfo) + } } diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectView.kt new file mode 100644 index 0000000000..16082e3483 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/routingselect/RoutingSelectView.kt @@ -0,0 +1,364 @@ +package com.mogo.och.biz.routing.ui.routingselect + +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.data.config.FunctionBuildConfig +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.SitesInfo +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager +import com.mogo.och.biz.routing.ui.RoutingSwitchModel +import com.mogo.och.biz.routing.ui.routingselect.RoutingSelectModel.SwtichRoutingViewCallback +import com.mogo.och.common.module.manager.InputManager +import com.mogo.och.common.module.manager.InputTextChangeListener +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.wigets.KeyboarView +import kotlinx.android.synthetic.main.biz_taxi_select.view.acctv_search_byid +import kotlinx.android.synthetic.main.biz_taxi_select.view.aciv_input_icon +import kotlinx.android.synthetic.main.biz_taxi_select.view.aciv_refresh_task +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_current_order +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_distance +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_id_asc +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_id_desc +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_num_asc +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_num_desc +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_time_asc +import kotlinx.android.synthetic.main.biz_taxi_select.view.actv_order_by_time_desc +import kotlinx.android.synthetic.main.biz_taxi_select.view.cl_select_order +import kotlinx.android.synthetic.main.biz_taxi_select.view.cl_select_order_contain +import kotlinx.android.synthetic.main.biz_taxi_select.view.include_empty +import kotlinx.android.synthetic.main.biz_taxi_select.view.include_error +import kotlinx.android.synthetic.main.biz_taxi_select.view.switch_routing_rv +import me.jessyan.autosize.utils.AutoSizeUtils + +class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback, InputTextChangeListener { + + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + + companion object { + const val TAG = "SwitchBizView" + } + + private var viewModel: RoutingSelectModel?=null + private var swtichViewModel: RoutingSwitchModel?=null + + private lateinit var mChooseLineListAdapter: RoutingItemAdapter + private lateinit var mLinearLayoutManager: WrapContentLinearLayoutManager + private val mRoutingLineList: MutableList = ArrayList() + private var mCurrentChosenPosition: Int = -1 + + private var animator: ObjectAnimator?=null + + private var animatorStart = System.currentTimeMillis() + + private var tempAllData = mutableListOf() + + + init { + LayoutInflater.from(context).inflate(R.layout.biz_taxi_select, this, true) + initView() + } + + private fun initView(){ + + + mLinearLayoutManager = WrapContentLinearLayoutManager(context) + switch_routing_rv.layoutManager = mLinearLayoutManager + mChooseLineListAdapter = RoutingItemAdapter(context, mRoutingLineList) + switch_routing_rv.addItemDecoration(SpacesItemDecoration(AutoSizeUtils.dp2px(context,20f))) + switch_routing_rv.adapter = mChooseLineListAdapter + //设置item 点击事件 + mChooseLineListAdapter.setOnLineItemClickListener(object : + RoutingItemAdapter.LineItemClickListener { + override fun onItemClick(data: GrayLineBean) { + if(data.contrailId==null||data.contrailId!!<=0L){ + ToastUtils.showShort("请设置轨迹信息") + } + OchChainLogManager.writeChainLogRouting("[选择灰度任务]","[选择灰度任务] 当前选择 ${data} ") + resetStatus() + swtichViewModel?.showLoading() + viewModel?.startGrayTaskAndQueryRoutingContrail(data.contrailId!!,data) + } + }) + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) + || AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) + ) { + switch_routing_rv.addOnScrollListener(object : RecyclerView.OnScrollListener() { + override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { + super.onScrollStateChanged(recyclerView, newState) + if (newState == RecyclerView.SCROLL_STATE_IDLE) { + val layoutManager = recyclerView.layoutManager as LinearLayoutManager + val firstVisible = layoutManager.findFirstVisibleItemPosition() + val lastVisible = layoutManager.findLastVisibleItemPosition() + // 获取所有可见Item + (firstVisible..lastVisible).map { position -> + val grayLineBean = mRoutingLineList[position] + if (grayLineBean.allStation.isNullOrEmpty()) { + viewModel?.queryStationList(grayLineBean) + } + } + } + } + }) + } + + aciv_refresh_task.onClick { + viewModel?.queryRoutingGrayLineList() + aciv_refresh_task.isEnabled = false + animatorStart = System.currentTimeMillis() + if(animator==null) { + animator = ObjectAnimator.ofFloat(aciv_refresh_task, "rotation", 0f, 360f) + animator?.setDuration(1000) // 设置动画持续时间 + animator?.repeatCount = ValueAnimator.INFINITE // 设置动画无限重复 + animator?.repeatMode = ValueAnimator.RESTART // 设置重复模式 + } + animator?.start() + resetStatus() + } + + cl_select_order_contain.onClick { + cl_select_order_contain.visibility = View.GONE + } + cl_select_order.onClick { + cl_select_order_contain.visibility = View.VISIBLE + } + + actv_order_by_distance.onClick { + mRoutingLineList.sortBy { it.distance } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_default) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_id_asc.onClick { + mRoutingLineList.sortBy { it.lineId } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_id_asc) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_id_desc.onClick { + mRoutingLineList.sortByDescending { it.lineId } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_id_desc) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_num_asc.onClick { + mRoutingLineList.sortBy { + (it.lineSuccessCount?:0)+(it.lineFailCount?:0) + } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_num_asc) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_num_desc.onClick { + // 按照总验证次序降序排列,而不是今日验证次序 + mRoutingLineList.sortByDescending { + (it.lineSuccessCount?:0)+(it.lineFailCount?:0) + } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_num_desc) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_time_asc.onClick { + mRoutingLineList.sortBy { it.contrailId } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_time_asc) + switch_routing_rv.smoothScrollToPosition(0) + } + actv_order_by_time_desc.onClick { + mRoutingLineList.sortByDescending { it.contrailId } + mChooseLineListAdapter.notifyDataSetChanged() + cl_select_order_contain.visibility = View.GONE + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_time_desc) + switch_routing_rv.smoothScrollToPosition(0) + } + acctv_search_byid.onClick { + if(acctv_search_byid.isChecked==true){ + acctv_search_byid.isChecked = false + acctv_search_byid.setBackgroundResource(R.drawable.biz_input_order_id_normal) + aciv_input_icon.setImageResource(R.drawable.biz_routing_search_right_normal) + InputManager.setKeyboardVisable(View.GONE) + }else{ + acctv_search_byid.isChecked = true + aciv_input_icon.setImageResource(R.drawable.biz_routing_search_right_check) + acctv_search_byid.setBackgroundResource(R.drawable.biz_input_order_id_check) + InputManager.setKeyboardVisable(View.VISIBLE) + } + } + + } + + private fun resetStatus() { + InputManager.clearInput() + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_default) + switch_routing_rv.smoothScrollToPosition(0) + acctv_search_byid.isChecked = false + acctv_search_byid.text = "" + acctv_search_byid.setBackgroundResource(R.drawable.biz_input_order_id_normal) + aciv_input_icon.setImageResource(R.drawable.biz_routing_search_right_normal) + InputManager.setKeyboardVisable(GONE) + } + + private fun showEmptyView() { + switch_routing_rv.visibility = GONE + include_empty.visibility = View.VISIBLE + include_error.visibility = View.GONE + } + + private fun showErrorView() { + switch_routing_rv.visibility = GONE + include_empty.visibility = View.GONE + include_error.visibility = View.VISIBLE + } + + private fun showRecyclerView() { + switch_routing_rv.visibility = VISIBLE + include_empty.visibility = View.GONE + include_error.visibility = View.GONE + } + + + private fun onRoutingGrayLineListChanged(data: MutableList) { + if (data.isNotEmpty()) { + showRecyclerView() + tempAllData = data + mRoutingLineList.clear() + mRoutingLineList.addAll(data) + mChooseLineListAdapter.notifyDataSetChanged() + ToastUtils.showShort("刷新成功") + } else { + showEmptyView() + } + } + + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(RoutingSelectModel::class.java) + } + viewModel?.setDistanceCallback(this) + + swtichViewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(RoutingSwitchModel::class.java) + } + + InputManager.addListener(TAG,this) + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + InputManager.removeListener(TAG) + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(isVisible){ + viewModel?.queryRoutingGrayLineList() + } + } + + override fun onQueryRoutingGrayLineListSuccess(data: MutableList) { + // 数据默认按照距离排序过了 + onRoutingGrayLineListChanged(data) + if (AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) + ) { + data.forEachIndexed { index, grayLineBean -> + if (index < 3) { + viewModel?.queryStationList(grayLineBean) + } + } + } + actv_current_order.text = ResourcesUtils.getString(R.string.biz_routing_order_default) + acctv_search_byid.text="" + cancleAni() + } + + override fun onQueryRoutingGrayLineListFailed(errorStr: String) { + showErrorView() + cancleAni() + } + + override fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) { + swtichViewModel?.showRoutingRunning(data) + } + + override fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) { + swtichViewModel?.showRoutingSelectView() + } + + override fun updateAdapter(grayLineBean: GrayLineBean, data: SitesInfo) { + mChooseLineListAdapter.upDateInfo(grayLineBean,data) + } + + private fun cancleAni(){ + val endTime = System.currentTimeMillis() + val dex = (1000-(endTime - animatorStart)).takeIf { it>=0 }?:0 + UiThreadHandler.postDelayed({ + animator?.cancel() + aciv_refresh_task.isEnabled = true + },dex, UiThreadHandler.MODE.QUEUE,) + } + + override fun onTextChange(info: String) { + ToastUtils.showShort(info) + if (acctv_search_byid.isChecked) { + acctv_search_byid.text = info + if(info.isEmpty()){ + mRoutingLineList.clear() + mRoutingLineList.addAll(tempAllData) + mChooseLineListAdapter.notifyDataSetChanged() + }else{ + val searchData = tempAllData.filter { it.lineId.toString().contains(info) } + mRoutingLineList.clear() + mRoutingLineList.addAll(searchData) + mChooseLineListAdapter.notifyDataSetChanged() + } + } + } + + override fun onKeyVisiblityChange(b: Boolean) { + if(b){ + acctv_search_byid.isChecked = true + acctv_search_byid.setBackgroundResource(R.drawable.biz_input_order_id_check) + aciv_input_icon.setImageResource(R.drawable.biz_routing_search_right_check) + }else{ + acctv_search_byid.isChecked = false + acctv_search_byid.setBackgroundResource(R.drawable.biz_input_order_id_normal) + aciv_input_icon.setImageResource(R.drawable.biz_routing_search_right_normal) + } + } + +} diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningAdapter.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningAdapter.kt new file mode 100644 index 0000000000..56b396d427 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningAdapter.kt @@ -0,0 +1,263 @@ +package com.mogo.och.biz.routing.ui.runing.other + +import android.animation.ArgbEvaluator +import android.content.Context +import android.graphics.drawable.GradientDrawable +import android.util.TypedValue +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.appcompat.widget.AppCompatImageView +import androidx.appcompat.widget.AppCompatTextView +import androidx.recyclerview.widget.RecyclerView +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.biz.R +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.data.bean.BusStationBean +import me.jessyan.autosize.utils.AutoSizeUtils + +/** + * 路线列表adapter + */ +class TaskRunningAdapter( + private val mContext: Context, + val mData: MutableList +) : RecyclerView.Adapter() { + + companion object { + const val TAG = "${M_OCHCOMMON}TaskRunningAdapter" + } + + private val argbEvaluator: ArgbEvaluator = ArgbEvaluator() + private val startColor = ResourcesUtils.getColor(R.color.common_1970FF) + private val endColor = ResourcesUtils.getColor(R.color.common_19FF7F) + private val heightItem = 100f + private val halfHeight = 16.5f + private var totalHeight = 0f + + + + override fun onCreateViewHolder( + parent: ViewGroup, + viewType: Int + ): TaskRunningViewHolder { + val view = LayoutInflater.from(mContext).inflate( + R.layout.biz_other_running_item, parent, false + ) + return TaskRunningViewHolder(view) + } + + override fun onBindViewHolder(holder: TaskRunningViewHolder, position: Int) { + val currentPosition = holder.bindingAdapterPosition + val line = mData[currentPosition] + holder.actvStationName.text = line.name + val startStationIndex = TaskRunningModel.currentIndex + if (startStationIndex >= 0) { + CallerLogger.d(TAG, "位置:$currentPosition ${TaskRunningModel.currentIndex} 当前站${mData[startStationIndex]} ") + } + + if (currentPosition < startStationIndex) { + holder.actvStationName.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(mContext, 40f).toFloat() + ) + holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.common_4DFFFFFF)) + holder.acivStationHead.setImageResource(R.drawable.bus_switch_line_adapter_point_pass) + } else if (currentPosition == startStationIndex) { + holder.actvStationName.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(mContext, 45f).toFloat() + ) + holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.common_2EACFF)) + holder.acivStationHead.setImageResource(R.drawable.bus_runnint_task_middle) + } else { + holder.actvStationName.setTextColor(ResourcesUtils.getColor(R.color.white)) + holder.actvStationName.setTextSize( + TypedValue.COMPLEX_UNIT_PX, + AutoSizeUtils.dp2px(mContext, 40f).toFloat() + ) + holder.itemView.background = null + holder.acivStationHead.setImageResource(R.drawable.bus_runnint_task_middle) + } + + when (currentPosition) { + 0 -> { + holder.acivStationHeadBig.visibility = View.VISIBLE + holder.acivStationHead.visibility = View.INVISIBLE + holder.acivStationHeadBig.setImageResource(R.drawable.bus_runnint_task_start) + holder.middleStationBg.visibility = View.GONE + holder.startStationBg.visibility = View.VISIBLE + holder.endStationBg.visibility = View.GONE + if (startStationIndex == 0) { + if (line.isLeaving) { + // 下端 灰色 + holder.startStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + holder.itemView.background = null + } else { + // 下端 彩色 + holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg) + + val orientation = GradientDrawable.Orientation.TOP_BOTTOM + val temp01 = GradientDrawable( + orientation, intArrayOf( + startColor, + endColor + ) + ) + holder.startStationBg.background = temp01 + } + } else { + // 下端 灰色 + holder.startStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + holder.itemView.background = null + } + } + + mData.size - 1 -> { + holder.acivStationHeadBig.visibility = View.VISIBLE + holder.acivStationHead.visibility = View.INVISIBLE + holder.acivStationHeadBig.setImageResource(R.drawable.bus_runnint_task_end) + holder.middleStationBg.visibility = View.GONE + holder.startStationBg.visibility = View.GONE + holder.endStationBg.visibility = View.VISIBLE + if (startStationIndex == itemCount - 2) { + if (line.isLeaving) { + holder.endStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg) + } else { + holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg) + holder.endStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + } + } else { + // 上端 彩色 + holder.itemView.background = null + val startColorTemp = argbEvaluator.evaluate( + ((totalHeight - halfHeight) / totalHeight).toFloat(), + startColor, + endColor + ) as Int + val endColorTemp = argbEvaluator.evaluate(1f, startColor, endColor) as Int + val orientation = GradientDrawable.Orientation.TOP_BOTTOM + val temp01 = GradientDrawable( + orientation, intArrayOf( + startColorTemp, + endColorTemp + ) + ) + holder.endStationBg.background = temp01 + } + } + + else -> { + holder.acivStationHeadBig.visibility = View.GONE + holder.acivStationHead.visibility = View.VISIBLE + holder.middleStationBg.visibility = View.VISIBLE + holder.startStationBg.visibility = View.GONE + holder.endStationBg.visibility = View.GONE + if (currentPosition == startStationIndex) { + if (line.isLeaving) { + // 灰色 + holder.middleStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + holder.itemView.background = null + } else { + // 彩色 + holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg) + val startColorTemp = argbEvaluator.evaluate(0f, startColor, endColor) as Int + val endColorTemp = + argbEvaluator.evaluate(100f / totalHeight, startColor, endColor) as Int + val orientation = GradientDrawable.Orientation.TOP_BOTTOM + val temp01 = GradientDrawable( + orientation, intArrayOf( + startColorTemp, + endColorTemp + ) + ) + holder.middleStationBg.background = temp01 + } + } else if (currentPosition < startStationIndex) { + // 灰色 + holder.middleStationBg.setBackgroundResource(R.color.common_4DFFFFFF) + holder.itemView.background = null + } else { + var dex = 0f + if (startStationIndex == 0) { + val firstItemData = mData[0] + if (!firstItemData.isLeaving) { + dex = halfHeight + } + } else { + val checkIndex = mData.get(startStationIndex) + if (!checkIndex.isLeaving) { + dex = heightItem + } + } + // 彩色 + holder.itemView.background = null + val index = (currentPosition - startStationIndex - 1) * 100 + val startFraction = (dex + index) / totalHeight + val endFraction = (dex + index + 100) / totalHeight +// CallerLogger.d( +// TAG, +// "位置:$currentPosition 当前站${startStationIndex} 开始百分比:${startFraction} 结束百分比:${endFraction}" +// ) + val startColorTemp = + argbEvaluator.evaluate(startFraction, startColor, endColor) as Int + val endColorTemp = + argbEvaluator.evaluate(endFraction, startColor, endColor) as Int + val orientation = GradientDrawable.Orientation.TOP_BOTTOM + val temp01 = GradientDrawable( + orientation, intArrayOf( + startColorTemp, + endColorTemp + ) + ) + holder.middleStationBg.background = temp01 + } + } + } + if (currentPosition == startStationIndex + 1) { + val preLine = mData[currentPosition - 1] + if (preLine.isLeaving) { + holder.itemView.setBackgroundResource(R.drawable.bus_task_current_station_bg) + } else { + holder.itemView.background = null + } + } + + } + + override fun getItemCount(): Int { + return mData.size + } + + fun setDataList(dataList: List) { + this.mData.clear() + this.mData.addAll(dataList) + totalHeight = 33 + (dataList.size - 2) * heightItem + notifyItemRangeChanged(0, dataList.size, true) + } + + fun notifyChange(){ + if (TaskRunningModel.currentIndex == 0) { + totalHeight = 33 + (mData.size - 2) * heightItem + } else { + totalHeight = + (halfHeight + (mData.size - 1 - TaskRunningModel.currentIndex) * heightItem).toFloat() + } + notifyItemRangeChanged(0, mData.size, true) + } + class TaskRunningViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { + val actvStationName: AppCompatTextView = itemView.findViewById(R.id.actv_station_name)//站点名称 + val acivStationHead: AppCompatImageView = + itemView.findViewById(R.id.aciv_station_head)//普通站点标识 不是起始和终点坐标 + val acivStationHeadBig: AppCompatImageView = + itemView.findViewById(R.id.aciv_station_head_big)//起始和终点坐标标识 + val middleStationBg: View = itemView.findViewById(R.id.bg_pass_bg) //贯通背景调 + val endStationBg: View = itemView.findViewById(R.id.bg_pass_head_bg) //终点的背景 + val startStationBg: View = itemView.findViewById(R.id.bg_pass_bottom_bg) //起点坐标的背景 + + } + +} \ No newline at end of file diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningModel.kt new file mode 100644 index 0000000000..384ad6b122 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningModel.kt @@ -0,0 +1,303 @@ +package com.mogo.och.biz.routing.ui.runing.other + +import androidx.lifecycle.ViewModel +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.eagle.core.data.BaseData +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager +import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.och.biz.routing.bean.ContrailBean +import com.mogo.och.biz.routing.bean.EndGrayContrailTaskReq +import com.mogo.och.biz.routing.bean.EndGrayTaskFeedbackType +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.biz.routing.net.RoutingServiceManager +import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener +import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager +import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation +import com.mogo.och.bridge.autopilot.line.ILineCallback +import com.mogo.och.bridge.autopilot.line.LineManager +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.data.bean.BusStationBean + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class TaskRunningModel : ViewModel() { + + private val TAG = M_OCHCOMMON + TaskRunningModel::class.java.simpleName + + private var viewCallback: SwtichLineViewCallback? = null + + private val content = AbsMogoApplication.getApp() + + private var _data: StartGrayAndQueryContrailRsp? = null + val data: StartGrayAndQueryContrailRsp? + get() = _data + + private var currentGrayLineBean: GrayLineBean? = null + private var currentContrailBean: ContrailBean? = null + private var stationList: MutableList? = null + private var currentGrayId: Long? = null + + /** + * 是否可以进行进站操作 + */ + var arrivedStation:Boolean = false + + companion object { + var currentIndex = -1 + } + + + override fun onCleared() { + } + + fun setDistanceCallback(viewCallback: SwtichLineViewCallback) { + this.viewCallback = viewCallback + } + + fun setNewData(data: StartGrayAndQueryContrailRsp) { + this._data = data + this.currentGrayLineBean = data.grayLineBean + this.currentContrailBean = data.contrail + this.currentGrayId = data.taskId + this.stationList = data.stationList + this.stationList?.forEach { + it.isLeaving = false + } + currentIndex = 0 + this.stationList?.let { + val startStationNext = it[currentIndex] + val endStation = it[currentIndex + 1] + CallerLogger.d(TAG,"setNewData index:${currentIndex} ${startStationNext.name} -- ${endStation.name}") + LineManager.setStartAndEndStation(startStationNext, endStation) + } + MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingPerformTask(TAG, true) + //添加到站监听 + OchAutoPilotStatusListenerManager.addListener(TAG, mMogoAutopilotStatusListener) + LineManager.addListener(TAG, lineCallback) + } + + //MAP到站监听 + private val mMogoAutopilotStatusListener: IOchAutopilotStatusListener = + object : IOchAutopilotStatusListener { + + override fun onAutopilotArriveAtStation(arrivalNotification: ArrivedStation?) { + if(!arrivedStation){ + OchChainLogManager.writeChainLogRouting("已到站","等待重试",false) + return + } + CallerLogger.i( + TAG, + "onAutopilotArriveAtStation = ${arrivalNotification.toString()}" + ) + OchChainLogManager.writeChainLogRouting( + "MAP到站通知", + "[MAP到站通知] 上报到站,location=${arrivalNotification?.endLocation}" + ) + arriveStation() + } + } + + private val lineCallback: ILineCallback = object : ILineCallback { + override fun arrivedStationSuccessBySearch() { + OchChainLogManager.writeChainLogRouting( + "[自车定位围栏]", + "\"[自车定位围栏] 并查询底盘触发到站, endSiteId=${currentGrayLineBean?.endSite?.siteId}, endSiteName=${currentGrayLineBean?.endSite?.siteName}, lineId=${currentGrayLineBean?.lineId},围栏范围:${OchCommonConst.ARRIVE_AT_START_STATION_DISTANCE}米 没有过站、速度基本为零且在15m内\"" + ) + if(!arrivedStation){ + OchChainLogManager.writeChainLogRouting("已到站","等待重试",false) + return + } + arriveStation() + } + } + + fun leaveStation() { + stationList?.let { + if (it.isNotEmpty()) { + if (currentIndex + 1 >= it.size) { + this.viewCallback?.showCompleteTask() + return + } + val startStation = it[currentIndex] + val endStation = it[currentIndex + 1] + startStation.isLeaving = true + arrivedStation = true + startStation.drivingStatus = 2 + CallerLogger.d(TAG,"leaveStation index:${currentIndex} ${startStation.name}---${endStation.name}") + this.viewCallback?.notifyItemChange(currentIndex) + this.viewCallback?.showArriverStationAndCompleteTask() + if (CallerAutoPilotStatusListenerManager.getState() == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING + ) { + LineManager.startAutopilot() + } + } + } + + + } + + fun arriveStation() { + stationList?.let { + val startStation = it[currentIndex] + + if (currentIndex + 2 >= it.size) { + startStation.isLeaving = true + this.viewCallback?.showCompleteTask() + }else { + startStation.isLeaving = false + arrivedStation = false + startStation.drivingStatus = 1 + currentIndex += 1 + val startStationNext = it[currentIndex] + val endStation = it[currentIndex + 1] + CallerLogger.d(TAG, "setNewData index:${currentIndex} ${startStationNext.name}----${endStation.name}") + LineManager.setStartAndEndStation(startStationNext, endStation) + } + LineManager.getStations { start, end -> + BizLoopManager.runInMainThread{ + this.viewCallback?.onArrivedStation(start.isLeaving) + } + } + + } + + + } + + interface SwtichLineViewCallback { + // 到站 + fun onArrivedStation(leaving: Boolean) + + // 结束服务成功 + fun onSubmitEndTaskSuccess() + + // 结束服务失败 + fun onSubmitEndTaskFailed(s: String) + + // 站点到站和结束任务 + fun showCompleteTask() + + // + fun showArriverStationAndCompleteTask() + + fun notifyItemChange(currentIndex: Int) + fun clearData() + } + + /** + * 结束灰度任务 + */ + fun endGrayTask(grayId: Long, type: EndGrayTaskFeedbackType, occurrenceTime: Long) { + OchChainLogManager.writeChainLogRouting( + "[结束灰度任务]", + "[结束灰度任务] 准备发送请求,grayId=$grayId, type=${type.type}, typeName=${type.name}" + ) + val submit = EndGrayContrailTaskReq(grayId, type.type, occurrenceTime) + RoutingServiceManager.endGrayTask( + content, + submit, + object : OchCommonServiceCallback { + override fun onSuccess(data: BaseData?) { + CallerLogger.d( + TAG, + "endGrayTask onSuccess: data=${ + GsonUtils.toJson( + data + ) + }" + ) + OchChainLogManager.writeChainLogRouting( + "[结束灰度任务]", + "[结束灰度任务] 请求success,grayId=$grayId, type=${type.type}, typeName=${type.name}" + ) + clearData() + viewCallback?.onSubmitEndTaskSuccess() + } + + override fun onFail(code: Int, msg: String?) { + CallerLogger.d( + TAG, + "endGrayTask onFail: code=$code, msg=$msg" + ) + OchChainLogManager.writeChainLogRouting( + "[结束灰度任务]", + "[结束灰度任务] 请求fail, code=$code, msg=$msg, grayId=$grayId, type=${type.type}, typeName=${type.name}" + ) + viewCallback?.onSubmitEndTaskFailed(msg ?: "endGrayTask onFail") + } + + override fun onError() { + super.onError() + var hintStr = "" + if (!NetworkUtils.isConnected(content)) { + hintStr = "网络出现异常,请稍后重试" + } else { + hintStr = "上报结束任务异常, 请稍后重试" + } + CallerLogger.d( + TAG, + "endGrayTask onError, msg=$hintStr" + ) + OchChainLogManager.writeChainLogRouting( + "[结束灰度任务]", + "[结束灰度任务] 请求error, msg=$hintStr, grayId=$grayId, type=${type.type}, typeName=${type.name}" + ) + viewCallback?.onSubmitEndTaskFailed(hintStr) + } + }) + } + + private fun clearData() { + _data = null + this.currentGrayLineBean = null + this.currentContrailBean = null + this.currentGrayId = null + LineManager.setLineInfo(null) + LineManager.setContraiInfo(null) + LineManager.setStartAndEndStation(null, null) + + BizLoopManager.runInMainThread{ + this.viewCallback?.clearData() + } + + CallerEagleBaseFunctionCall4OchManager.updateOrderStatus(false) + + // 设置灰度路线任务执行状态,切换模式时判断使用 + MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingPerformTask(TAG, false) + + // 移除到站监听 + OchAutoPilotStatusListenerManager.removeListener(TAG) + LineManager.removeListener(TAG) + cancelAutopilot() + } + + /** + * 结束自动驾驶 + * */ + private fun cancelAutopilot() { + try { + CallerAutoPilotControlManager.cancelAutoPilot() + OchChainLogManager.writeChainLogRouting("[取消自驾]", "[取消自驾] 调用成功") + CallerLogger.d(TAG, "结束自动驾驶") + } catch (e: Exception) { + e.printStackTrace() + } + } + + +} + diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningView.kt new file mode 100644 index 0000000000..c8749a38e8 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/other/TaskRunningView.kt @@ -0,0 +1,261 @@ +package com.mogo.och.biz.routing.ui.runing.other + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.RoutingServiceManager +import com.mogo.och.biz.routing.bean.EndGrayTaskFeedbackType +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.biz.routing.ui.RoutingSwitchModel +import com.mogo.och.biz.routing.ui.errorpoint.ReportErrorPointView +import com.mogo.och.bridge.autopilot.line.LineManager +import com.mogo.och.common.module.map.AmapNaviToDestinationModel +import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus +import com.mogo.och.common.module.wigets.CommonSlideView +import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager +import kotlinx.android.synthetic.main.biz_other_running.view.aciv_task_leave_station_slide_bg +import kotlinx.android.synthetic.main.biz_other_running.view.actv_arriver_station +import kotlinx.android.synthetic.main.biz_other_running.view.actv_complete_task +import kotlinx.android.synthetic.main.biz_other_running.view.actv_running_task_last_station +import kotlinx.android.synthetic.main.biz_other_running.view.actv_submit_task +import kotlinx.android.synthetic.main.biz_other_running.view.bus_task_running_line_name +import kotlinx.android.synthetic.main.biz_other_running.view.loading_arrive_station +import kotlinx.android.synthetic.main.biz_other_running.view.rl_running_task_station_list + +/** + * Bus接驳算路验证的任务 + */ +class TaskRunningView : ConstraintLayout, TaskRunningModel.SwtichLineViewCallback { + + + constructor(context: Context) : super(context) + + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super( + context, + attributeSet, + defStyleAttr + ) + + constructor( + context: Context, + attributeSet: AttributeSet, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attributeSet, defStyleAttr, defStyleRes) + + + companion object { + const val TAG = M_OCHCOMMON + "TaskRunningView" + } + + private var viewModel: TaskRunningModel? = null + + private var swtichViewModel: RoutingSwitchModel?=null + + + private lateinit var mAdapter: TaskRunningAdapter + + private lateinit var linearLayoutManager: WrapContentLinearLayoutManager + + private var closeRouting: CommonDialogStatus?=null + + + init { + LayoutInflater.from(context).inflate(R.layout.biz_other_running, this, true) + initView() + } + + private fun initView() { + linearLayoutManager = WrapContentLinearLayoutManager(context) + rl_running_task_station_list.setLayoutManager(linearLayoutManager) + mAdapter = TaskRunningAdapter(context, mutableListOf()) + rl_running_task_station_list.setAdapter(mAdapter) + // 滑动出发 + aciv_task_leave_station_slide_bg.setSlideListener(object : CommonSlideView.SlideListener { + override fun slideEnd() { + if (TaskRunningModel.currentIndex == mAdapter.mData.size-2) { + LineManager.getStations { start, end -> + if (viewModel?.arrivedStation == true && start.isLeaving) { + aciv_task_leave_station_slide_bg.setTextValue("单程结束") + aciv_task_leave_station_slide_bg.reset() + viewModel?.data?.taskId?.let { + showFeedbackDialog(it) + } + }else{ + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + viewModel?.leaveStation() + } + } + } else { + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + viewModel?.leaveStation() + } + + } + }) + + // 到站 + actv_arriver_station.onClick { + loading_arrive_station.visibility = VISIBLE + viewModel?.arriveStation() + } + + // 结束任务 + actv_complete_task.onClick { + viewModel?.data?.taskId?.let { + showFeedbackDialog(it) + } + } + + actv_submit_task.onClick { + CallerLogger.d(TAG,"启动自驾参数:${LineManager.initAutopilotControlParameters()}") + viewModel?.data?.taskId?.let { + ReportErrorPointView.showDialog(context,it) + } + } + + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(TaskRunningModel::class.java) + } + + swtichViewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(RoutingSwitchModel::class.java) + } + + viewModel?.setDistanceCallback(this) + } + + private fun showFeedbackDialog(grayId: Long) { + CallerLogger.d(TAG, "showFeedbackDialog!") + val occurrenceTime = System.currentTimeMillis() + if(closeRouting==null) { + CallerLogger.d(TAG, "closeRouting is null!") + closeRouting = CommonDialogStatus + .Builder() + .title("路线验证结束") + .tips("请点击按钮反馈验证结果") + .showClose(true) + .cancelTextColor(R.color.biz_routing_FF4E41) + .cancelStr("线路不可用") + .confirmStr("线路可用") + .status(CommonDialogStatus.Status.success) + .build(context) + }else{ + if(closeRouting?.isShowing==true){ + CallerLogger.d(TAG, "closeRouting is showing, return!") + return + } + } + closeRouting?.setClickListener(object : CommonDialogStatus.ClickListener { + override fun confirm() { + swtichViewModel?.showLoading() + viewModel?.endGrayTask(grayId, EndGrayTaskFeedbackType.USABLE_YES, occurrenceTime) + } + + override fun cancel() { + swtichViewModel?.showLoading() + viewModel?.endGrayTask( + grayId, + EndGrayTaskFeedbackType.USABLE_NO, + occurrenceTime + ) + } + }) + CallerLogger.d(TAG, "closeRouting show!") + closeRouting?.show() + } + + fun showLeaveStationView() { + aciv_task_leave_station_slide_bg.visibility = VISIBLE + actv_arriver_station.visibility = GONE + actv_complete_task.visibility = GONE + } + + override fun showArriverStationAndCompleteTask() { + aciv_task_leave_station_slide_bg.visibility = INVISIBLE + actv_arriver_station.visibility = VISIBLE + actv_complete_task.visibility = VISIBLE + } + + fun setData(data: StartGrayAndQueryContrailRsp) { + viewModel?.setNewData(data) + bus_task_running_line_name.setText(data.grayLineBean.lineName) + actv_running_task_last_station.text = "往${data.stationList.last().name ?: ""}" + mAdapter.setDataList(data.stationList) + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + showLeaveStationView() + } + + /** + * 到达目的地 + */ + override fun onArrivedStation(leaving: Boolean) { + // + showLeaveStationView() + loading_arrive_station.visibility = GONE + notifyItemChange(0) + if (TaskRunningModel.currentIndex == mAdapter.mData.size-2) { + LineManager.getStations { start, end -> + if(start.isLeaving){ + aciv_task_leave_station_slide_bg.setTextValue("单程结束") + }else{ + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + } + } + + } else { + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + } + } + + /** + * 服务完成 + */ + override fun onSubmitEndTaskSuccess() { + ToastUtils.showLong("结束任务成功") + RoutingServiceManager.invokeCallback(false) + // 移除高德导航计算距离 + AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() + swtichViewModel?.showRoutingSelectView() + } + + /** + * 服务完成失败 + */ + override fun onSubmitEndTaskFailed(errorStr: String) { + ToastUtils.showShort(errorStr) + viewModel?.data?.let { + swtichViewModel?.showRoutingRunning(it) + } + } + + override fun showCompleteTask() { + aciv_task_leave_station_slide_bg.setTextValue("单程结束") + } + + override fun notifyItemChange(currentIndex: Int) { + mAdapter.notifyChange() + } + + override fun clearData() { + bus_task_running_line_name.setText("--") + actv_running_task_last_station.text = "往--" + mAdapter.setDataList(mutableListOf()) + aciv_task_leave_station_slide_bg.setTextValue("滑动出发") + showLeaveStationView() + } +} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningModel.kt similarity index 74% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningModel.kt index 96cbb97a75..a39b9a672a 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningModel.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningModel.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.taxi.ui.routing.routingrunning +package com.mogo.och.biz.routing.ui.runing.taxi import androidx.lifecycle.ViewModel import com.mogo.commons.AbsMogoApplication @@ -9,6 +9,12 @@ import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchMana import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.och.biz.routing.bean.ContrailBean +import com.mogo.och.biz.routing.bean.EndGrayContrailTaskReq +import com.mogo.och.biz.routing.bean.EndGrayTaskFeedbackType +import com.mogo.och.biz.routing.bean.GrayLineBean +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp +import com.mogo.och.biz.routing.net.RoutingServiceManager import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation @@ -17,24 +23,17 @@ import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.unmanned.taxi.bean.ContrailBean -import com.mogo.och.unmanned.taxi.bean.EndGrayContrailTaskReq -import com.mogo.och.unmanned.taxi.bean.EndGrayTaskFeedbackType -import com.mogo.och.unmanned.taxi.bean.GrayLineBean -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst -import com.mogo.och.unmanned.taxi.network.TaxiRoutingServiceManager -import com.mogo.och.unmanned.taxi.ui.debug.DebugView /** * @author XuXinChao * @description BadCase录包管理页面 * @since: 2022/12/15 */ -class RoutingRunningModel : ViewModel(), IDistanceListener { +class TaxiRunningModel : ViewModel(), IDistanceListener { - private val TAG = RoutingRunningModel::class.java.simpleName + private val TAG = TaxiRunningModel::class.java.simpleName private var viewCallback: RoutingRuningCallback? = null @@ -58,16 +57,14 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { TAG, "onAutopilotArriveAtStation = ${arrivalNotification.toString()}" ) - DebugView.printInfoMsg("[MAP到站通知] 上报到站,location=${arrivalNotification?.endLocation}") + OchChainLogManager.writeChainLogRouting("MAP到站通知","[MAP到站通知] 上报到站,location=${arrivalNotification?.endLocation}") viewCallback?.onArrivedStation(currentGrayId) } } private val lineCallback: ILineCallback = object : ILineCallback { override fun arrivedStationSuccessBySearch() { - DebugView.printInfoMsg( - "[自车定位围栏] 并查询底盘触发到站, endSiteId=${currentGrayLineBean?.endSite?.siteId}, endSiteName=${currentGrayLineBean?.endSite?.siteName}, lineId=${currentGrayLineBean?.lineId},围栏范围:${TaxiUnmannedConst.ARRIVE_AT_START_STATION_DISTANCE}米 没有过站、速度基本为零且在15m内" - ) + OchChainLogManager.writeChainLogRouting("[自车定位围栏]","\"[自车定位围栏] 并查询底盘触发到站, endSiteId=${currentGrayLineBean?.endSite?.siteId}, endSiteName=${currentGrayLineBean?.endSite?.siteName}, lineId=${currentGrayLineBean?.lineId},围栏范围:${OchCommonConst.ARRIVE_AT_START_STATION_DISTANCE}米 没有过站、速度基本为零且在15m内\"") viewCallback?.onArrivedStation(currentGrayId) } } @@ -101,6 +98,9 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { this.currentGrayLineBean = data.grayLineBean this.currentContrailBean = data.contrail this.currentGrayId = data.taskId + if(data.stationList.size>=2) { + LineManager.setStartAndEndStation(data.stationList[0], data.stationList[1]) + } MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingPerformTask(TAG, true) //添加到站监听 OchAutoPilotStatusListenerManager.addListener(TAG, mMogoAutopilotStatusListener) @@ -111,9 +111,9 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { * 结束灰度任务 */ fun endGrayTask(grayId: Long, type: EndGrayTaskFeedbackType, occurrenceTime: Long) { - DebugView.printInfoMsg("[结束灰度任务] 准备发送请求,grayId=$grayId, type=${type.type}, typeName=${type.name}") + OchChainLogManager.writeChainLogRouting("[结束灰度任务]","[结束灰度任务] 准备发送请求,grayId=$grayId, type=${type.type}, typeName=${type.name}") val submit = EndGrayContrailTaskReq(grayId, type.type, occurrenceTime) - TaxiRoutingServiceManager.endGrayTask( + RoutingServiceManager.endGrayTask( content, submit, object : OchCommonServiceCallback { @@ -126,7 +126,7 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { ) }" ) - DebugView.printInfoMsg("[结束灰度任务] 请求success,grayId=$grayId, type=${type.type}, typeName=${type.name}") + OchChainLogManager.writeChainLogRouting("[结束灰度任务]","[结束灰度任务] 请求success,grayId=$grayId, type=${type.type}, typeName=${type.name}") clearData() viewCallback?.onSubmitEndTaskSuccess() } @@ -136,7 +136,7 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { TAG, "endGrayTask onFail: code=$code, msg=$msg" ) - DebugView.printErrorMsg("[结束灰度任务] 请求fail, code=$code, msg=$msg, grayId=$grayId, type=${type.type}, typeName=${type.name}") + OchChainLogManager.writeChainLogRouting("[结束灰度任务]","[结束灰度任务] 请求fail, code=$code, msg=$msg, grayId=$grayId, type=${type.type}, typeName=${type.name}") viewCallback?.onSubmitEndTaskFailed(msg ?: "endGrayTask onFail") } @@ -152,7 +152,7 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { TAG, "endGrayTask onError, msg=$hintStr" ) - DebugView.printErrorMsg("[结束灰度任务] 请求error, msg=$hintStr, grayId=$grayId, type=${type.type}, typeName=${type.name}") + OchChainLogManager.writeChainLogRouting("[结束灰度任务]","[结束灰度任务] 请求error, msg=$hintStr, grayId=$grayId, type=${type.type}, typeName=${type.name}") viewCallback?.onSubmitEndTaskFailed(hintStr) } }) @@ -184,7 +184,7 @@ class RoutingRunningModel : ViewModel(), IDistanceListener { private fun cancelAutopilot() { try { CallerAutoPilotControlManager.cancelAutoPilot() - DebugView.printInfoMsg("[取消自驾] 调用成功") + OchChainLogManager.writeChainLogRouting("[取消自驾]","[取消自驾] 调用成功") CallerLogger.d(TAG, "结束自动驾驶") } catch (e: Exception) { e.printStackTrace() diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningView.kt similarity index 73% rename from OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt rename to OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningView.kt index 1d427536ad..0706909876 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingrunning/RoutingRunningView.kt +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/runing/taxi/TaxiRunningView.kt @@ -1,4 +1,4 @@ -package com.mogo.och.unmanned.taxi.ui.routing.routingrunning +package com.mogo.och.biz.routing.ui.runing.taxi import android.content.Context import android.util.AttributeSet @@ -10,34 +10,37 @@ import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.amap.api.navi.model.NaviLatLng import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.biz.R +import com.mogo.och.biz.routing.RoutingServiceManager +import com.mogo.och.biz.routing.bean.EndGrayTaskFeedbackType +import com.mogo.och.biz.routing.bean.StartGrayAndQueryContrailRsp import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.map.AmapNaviToDestinationModel import com.mogo.och.common.module.map.ICommonNaviChangedCallback -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.EndGrayTaskFeedbackType -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst -import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingModel +import com.mogo.och.biz.routing.ui.RoutingSwitchModel import com.mogo.och.common.module.map.MapMakerManager import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus -import com.mogo.och.unmanned.taxi.ui.routing.errorpoint.ReportErrorPointView -import com.mogo.och.unmanned.taxi.utils.TaskUtils -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_current_itinerary_end_name -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_current_itinerary_start_name -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_distance_end -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_end_routing -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_routing_name -import kotlinx.android.synthetic.main.unmanned_routing_running.view.actv_submit_task -import kotlinx.android.synthetic.main.unmanned_routing_running.view.goutp_show_routing_info -import kotlinx.android.synthetic.main.unmanned_routing_running.view.include_empty -import kotlinx.android.synthetic.main.unmanned_routing_running.view.naviToStart +import com.mogo.och.biz.routing.ui.errorpoint.ReportErrorPointView +import com.mogo.och.biz.routing.ui.runing.other.TaskRunningView +import com.mogo.och.biz.routing.ui.runing.other.TaskRunningView.Companion +import com.mogo.och.biz.routing.ui.utils.TimeDistanceUtils +import com.mogo.och.common.module.constant.OchCommonConst +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_end_routing +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_current_itinerary_end_name +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_current_itinerary_start_name +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_distance_end +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_routing_name +import kotlinx.android.synthetic.main.biz_taxi_running.view.actv_submit_task +import kotlinx.android.synthetic.main.biz_taxi_running.view.goutp_show_routing_info +import kotlinx.android.synthetic.main.biz_taxi_running.view.include_empty +import kotlinx.android.synthetic.main.biz_taxi_running.view.naviToStart -class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCallback, +class TaxiRunningView: ConstraintLayout, TaxiRunningModel.RoutingRuningCallback, ICommonNaviChangedCallback { @@ -54,14 +57,14 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal const val TAG = "RoutingRunningView" } - private var viewModel: RoutingRunningModel?=null + private var viewModel: TaxiRunningModel?=null private var swtichViewModel: RoutingSwitchModel?=null private var closeRouting: CommonDialogStatus?=null init { - LayoutInflater.from(context).inflate(R.layout.unmanned_routing_running, this, true) + LayoutInflater.from(context).inflate(R.layout.biz_taxi_running, this, true) initView() initListener() } @@ -84,20 +87,24 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal } private fun showFeedbackDialog(grayId: Long) { + CallerLogger.d(TAG, "showFeedbackDialog!") val occurrenceTime = System.currentTimeMillis() + val topActivity = ActivityUtils.getTopActivity() if(closeRouting==null) { + CallerLogger.d(TAG, "closeRouting is null!") closeRouting = CommonDialogStatus .Builder() .title("路线验证结束") .tips("请点击按钮反馈验证结果") .showClose(true) - .cancelTextColor(R.color.taxi_color_FF4E41) + .cancelTextColor(R.color.biz_routing_FF4E41) .cancelStr("线路不可用") .confirmStr("线路可用") .status(CommonDialogStatus.Status.success) - .build(context) + .build(topActivity) }else{ if(closeRouting?.isShowing==true){ + CallerLogger.d(TAG, "closeRouting is showing, return!") return } } @@ -120,7 +127,9 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal ) } }) - closeRouting?.show() + if(!topActivity.isFinishing() && !topActivity.isDestroyed()) { + closeRouting?.show() + } } /** @@ -132,7 +141,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal } private fun removeAllMapMarker() { - MapMakerManager.removeAllMapMarkerByOwner(TaxiUnmannedConst.TYPE_MARKER_ROUTING_VERIFY) + MapMakerManager.removeAllMapMarkerByOwner(OchCommonConst.TYPE_MARKER_ROUTING_VERIFY) } private fun initStartNaviToStationParam( @@ -162,16 +171,8 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal */ private fun updateCurrentTaskTripInfo(meters: Long, timeInSecond: Long) { UiThreadHandler.post { - CallerLogger.d( - TAG, - "updateCurrentTaskTripInfo, taskUtil, ${ - TaskUtils.getCurrentTaskTripHtml( - meters, - timeInSecond - ) - }" - ) - actv_distance_end.text = "${TaskUtils.getCurrentTaskDistance(meters)} ${TaskUtils.getCurrentTaskTime(timeInSecond)}" + CallerLogger.d(TAG, "updateCurrentTaskTripInfo, taskUtil, ${TimeDistanceUtils.getCurrentTaskTripHtml(meters, timeInSecond)}") + actv_distance_end.text = "${TimeDistanceUtils.getCurrentTaskDistance(meters)} ${TimeDistanceUtils.getCurrentTaskTime(timeInSecond)}" } } @@ -188,7 +189,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal resourceId: Int ) { if (isAdd) { - MapMakerManager.addMapMaker(TaxiUnmannedConst.TYPE_MARKER_ROUTING_VERIFY, uuid, lat, lon, resourceId) + MapMakerManager.addMapMaker(OchCommonConst.TYPE_MARKER_ROUTING_VERIFY, uuid, lat, lon, resourceId) } else { MapMakerManager.removeMapMaker(uuid, lat, lon) } @@ -198,7 +199,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal override fun onAttachedToWindow() { super.onAttachedToWindow() viewModel = findViewTreeViewModelStoreOwner()?.let { - ViewModelProvider(it).get(RoutingRunningModel::class.java) + ViewModelProvider(it).get(TaxiRunningModel::class.java) } swtichViewModel = findViewTreeViewModelStoreOwner()?.let { ViewModelProvider(it).get(RoutingSwitchModel::class.java) @@ -223,7 +224,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal override fun reInitNaviAmap(isPlay: Boolean, isRestart: Boolean) { CallerLogger.d(TAG, "isPlay = $isPlay, isRestart=$isRestart") if (!isRestart) { - TaxiRoutingModel.startNaviToEndStationByAMap(false) + RoutingServiceManager.invokeCallback(false) return } } @@ -244,11 +245,11 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal it.gcjLon ) naviToStart.setOnClickListener { - TaxiRoutingModel.startNaviToEndStationByAMap(true) + RoutingServiceManager.invokeCallback(true) } setOrRemoveMapMaker( true, - TaxiUnmannedConst.TAXI_ROUTING_VERIFY_START_SITE, + OchCommonConst.TAXI_ROUTING_VERIFY_START_SITE, it.wgs84Lat, it.wgs84Lon, R.raw.star_marker @@ -258,7 +259,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal data.grayLineBean.endSite?.also { setOrRemoveMapMaker( true, - TaxiUnmannedConst.TAXI_ROUTING_VERIFY_END_SITE, + OchCommonConst.TAXI_ROUTING_VERIFY_END_SITE, it.wgs84Lat, it.wgs84Lon, R.raw.end_marker @@ -271,7 +272,7 @@ class RoutingRunningView: ConstraintLayout, RoutingRunningModel.RoutingRuningCal override fun onSubmitEndTaskSuccess() { ToastUtils.showLong("结束任务成功") - TaxiRoutingModel.startNaviToEndStationByAMap(false) + RoutingServiceManager.invokeCallback(false) // 移除高德导航计算距离 AmapNaviToDestinationModel.getInstance(context).destroyAmaNavi() swtichViewModel?.showRoutingSelectView() diff --git a/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/utils/TimeDistanceUtils.kt b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/utils/TimeDistanceUtils.kt new file mode 100644 index 0000000000..da6d9ceb26 --- /dev/null +++ b/OCH/common/biz/src/main/java/com/mogo/och/biz/routing/ui/utils/TimeDistanceUtils.kt @@ -0,0 +1,112 @@ +package com.mogo.och.biz.routing.ui.utils + +import android.text.Spanned +import androidx.core.text.HtmlCompat +import com.mogo.eagle.core.utilcode.util.DateTimeUtils +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.NumberFormatUtil +import java.util.Calendar +import kotlin.math.ceil +import kotlin.math.roundToInt + +object TimeDistanceUtils { + + fun getCurrentTaskDistance(meters: Long):String{ + var dis = "0" + var disUnit = "公里" + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + dis = meters.toFloat().roundToInt().toString() + } else { + disUnit = "公里" + dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + return "${dis}${disUnit}" + } + + fun getCurrentTaskTime(timeInSecond: Long):String{ + val min = ceil(timeInSecond.toDouble() / 60f).toInt() + return "${min}分钟" + } + + /** + * 剩余里程和剩余时间 html + */ + fun getCurrentTaskTripHtml(meters: Long, timeInSecond: Long): Spanned { + var dis = "0" + var disUnit = "公里" + if (meters > 0) { + if (meters / 1000 < 1) { + disUnit = "米" + dis = meters.toFloat().roundToInt().toString() + } else { + disUnit = "公里" + dis = NumberFormatUtil.formatLong(meters.toDouble() / 1000) + } + } + val min = ceil(timeInSecond.toDouble() / 60f).toInt() + val strHtml = + ("里程 " + + "" + + dis + "" + + " " + + disUnit + "" + + ",剩余 " + + "" + + min + "" + + " 分钟") + return HtmlCompat.fromHtml(strHtml, HtmlCompat.FROM_HTML_MODE_LEGACY) + } + + fun getCurrentTaskWaitTimeHtml(): Spanned { + val currentCale = DateTimeUtils.getCurrentDateTime() + val currentDay = + DateTimeUtil.formatCalendarToString(currentCale, DateTimeUtil.yyyy_MM_dd) + currentCale.add(Calendar.MINUTE, 10) + val strHtml13: String = if (currentDay == DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.yyyy_MM_dd + ) + ) { + ("免费等待至 " + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.HH_mm + ) + "") + } else { + ("免费等待至" + + "" + DateTimeUtil.formatCalendarToString( + currentCale, + DateTimeUtil.MM_dd_HH_mm + ) + "") + } + return HtmlCompat.fromHtml(strHtml13, HtmlCompat.FROM_HTML_MODE_LEGACY) + } + + fun getCurrentTaskTotalAndDurationHtml(mileage: Float, duration: Int): Spanned { + val strHtml = + ("全程 " + " $mileage " + " 公里 " + + ",总用时 " + " $duration " + " 分钟") + return HtmlCompat.fromHtml(strHtml, HtmlCompat.FROM_HTML_MODE_LEGACY) + } + + fun getCurrentTaskPhoneNumAndPassengerCountHtml(phoneNum: String, passengerSize: Int): Spanned { + return HtmlCompat.fromHtml( + " " + phoneNum + "" + + " | " + + "" + passengerSize + "人" + "", + HtmlCompat.FROM_HTML_MODE_LEGACY + ) + } + + fun getNextTaskPhoneNumAndPassengerCountHtml(phoneNum: String, passengerSize: Int): Spanned { + return HtmlCompat.fromHtml( + " " + phoneNum + "" + + " | " + + "" + passengerSize + "人" + "", + HtmlCompat.FROM_HTML_MODE_LEGACY + ) + } +} \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/activity_video_player.xml b/OCH/common/biz/src/main/res/layout/biz_activity_video_player.xml similarity index 100% rename from OCH/common/common/src/main/res/layout/activity_video_player.xml rename to OCH/common/biz/src/main/res/layout/biz_activity_video_player.xml diff --git a/OCH/common/biz/src/main/res/layout/biz_ad_video_image.xml b/OCH/common/biz/src/main/res/layout/biz_ad_video_image.xml new file mode 100644 index 0000000000..6efc41a14d --- /dev/null +++ b/OCH/common/biz/src/main/res/layout/biz_ad_video_image.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/fragment_video_player.xml b/OCH/common/biz/src/main/res/layout/biz_fragment_video_player.xml similarity index 76% rename from OCH/common/common/src/main/res/layout/fragment_video_player.xml rename to OCH/common/biz/src/main/res/layout/biz_fragment_video_player.xml index becec91ba9..65767305ae 100644 --- a/OCH/common/common/src/main/res/layout/fragment_video_player.xml +++ b/OCH/common/biz/src/main/res/layout/biz_fragment_video_player.xml @@ -3,17 +3,15 @@ android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> - - + android:layout_height="match_parent"/> + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/color/biz_taxi_submit_text_color_selector.xml b/OCH/common/biz/src/main/res/routing/color/biz_taxi_submit_text_color_selector.xml new file mode 100644 index 0000000000..8dd12bf502 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/color/biz_taxi_submit_text_color_selector.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_order_bg.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_order_bg.png new file mode 100644 index 0000000000..1a85566ad7 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_order_bg.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_icon.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_icon.png new file mode 100644 index 0000000000..2df184c80a Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_icon.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_check.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_check.png new file mode 100644 index 0000000000..31ec237fb7 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_check.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_normal.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_normal.png new file mode 100644 index 0000000000..e37ce032e3 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_routing_search_right_normal.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_end_station_point.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_end_station_point.png new file mode 100644 index 0000000000..dfa74f0a44 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_end_station_point.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_start_station_point.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_start_station_point.png new file mode 100644 index 0000000000..62ec826abb Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_current_start_station_point.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_nav.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_nav.png new file mode 100644 index 0000000000..7d901eb1d3 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_nav.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_no_order_data.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_no_order_data.png new file mode 100644 index 0000000000..0e61996d3f Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_no_order_data.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_routing_check.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_routing_check.png new file mode 100644 index 0000000000..803e261954 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_routing_check.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_uncheck.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_uncheck.png new file mode 100644 index 0000000000..e6fccf1a1b Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/biz_taxi_uncheck.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_end.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_end.png new file mode 100644 index 0000000000..e54309848c Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_end.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_middle.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_middle.png new file mode 100644 index 0000000000..b2c4edba60 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_middle.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_past.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_past.png new file mode 100644 index 0000000000..7e70dbce57 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_past.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_start.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_start.png new file mode 100644 index 0000000000..dac86db75d Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_runnint_task_start.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point.png new file mode 100644 index 0000000000..b2c4edba60 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point_pass.png b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point_pass.png new file mode 100644 index 0000000000..7e70dbce57 Binary files /dev/null and b/OCH/common/biz/src/main/res/routing/drawable-nodpi/bus_switch_line_adapter_point_pass.png differ diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_button_normal.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_button_normal.xml new file mode 100644 index 0000000000..6a15955a4b --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_button_normal.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_button_selected.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_button_selected.xml new file mode 100644 index 0000000000..1220005f34 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_button_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_button_selector.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_button_selector.xml new file mode 100644 index 0000000000..a2f9bd3eb8 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_button_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_check.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_check.xml new file mode 100644 index 0000000000..2ef62beeac --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_check.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_normal.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_normal.xml new file mode 100644 index 0000000000..5121d1a6be --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_normal.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_selector.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_selector.xml new file mode 100644 index 0000000000..2c6b39bf80 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_input_order_id_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_shape_itinerary_bg_default.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_itinerary_bg_default.xml new file mode 100644 index 0000000000..6d2b131e2a --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_itinerary_bg_default.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_normal.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_normal.xml new file mode 100644 index 0000000000..272e718cce --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_normal.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_selected.xml b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_selected.xml new file mode 100644 index 0000000000..e5faafb27b --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/biz_shape_select_line_item_bg_selected.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_arrive_station_selector.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_arrive_station_selector.xml new file mode 100644 index 0000000000..67b7a651be --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_arrive_station_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_complete_selector.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_complete_selector.xml new file mode 100644 index 0000000000..67b7a651be --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_running_task_complete_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_normal.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_normal.xml new file mode 100644 index 0000000000..5121d1a6be --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_normal.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selected.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selected.xml new file mode 100644 index 0000000000..c236e4a6e4 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selected.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selector.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selector.xml new file mode 100644 index 0000000000..6f1e2e2037 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_line_selector.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_normal.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_normal.xml new file mode 100644 index 0000000000..5121d1a6be --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_normal.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_selected.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_selected.xml new file mode 100644 index 0000000000..7b95fb492d --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_switch_task_selected.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/drawable/bus_task_current_station_bg.xml b/OCH/common/biz/src/main/res/routing/drawable/bus_task_current_station_bg.xml new file mode 100644 index 0000000000..b0886cc9d4 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/drawable/bus_task_current_station_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/layout/biz_other_running.xml b/OCH/common/biz/src/main/res/routing/layout/biz_other_running.xml new file mode 100644 index 0000000000..f608659bf8 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/layout/biz_other_running.xml @@ -0,0 +1,121 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/layout/biz_other_running_item.xml b/OCH/common/biz/src/main/res/routing/layout/biz_other_running_item.xml new file mode 100644 index 0000000000..a91872fcb4 --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/layout/biz_other_running_item.xml @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_choose_line_list_item.xml b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_choose_line_list_item.xml similarity index 94% rename from OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_choose_line_list_item.xml rename to OCH/common/biz/src/main/res/routing/layout/biz_taxi_choose_line_list_item.xml index d87ee5006b..6dcda479f4 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_choose_line_list_item.xml +++ b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_choose_line_list_item.xml @@ -4,7 +4,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/dp_12" - android:background="@drawable/routing_choose_line_shape_select_line_item_bg_normal" + android:background="@drawable/biz_shape_select_line_item_bg_normal" android:orientation="vertical" android:paddingStart="@dimen/dp_78" android:paddingEnd="@dimen/dp_78"> @@ -51,7 +51,7 @@ android:layout_toRightOf="@+id/todayVerifyNumTextView" android:gravity="right|center_vertical" android:maxLines="1" - android:textColor="@color/taxi_color_ccb9c3e9" + android:textColor="@color/biz_routing_ccb9c3e9" android:textSize="@dimen/dp_30" tools:text="路线累计反馈0可用,1不可用" /> diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_no_data_common_view.xml b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_no_data_common_view.xml similarity index 96% rename from OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_no_data_common_view.xml rename to OCH/common/biz/src/main/res/routing/layout/biz_taxi_no_data_common_view.xml index 434d9ad890..64a6ec9957 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_no_data_common_view.xml +++ b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_no_data_common_view.xml @@ -13,7 +13,7 @@ android:id="@+id/no_routing_data_iv" android:layout_width="@dimen/dp_386" android:layout_height="@dimen/dp_350" - android:src="@drawable/no_order_data" + android:src="@drawable/biz_taxi_no_order_data" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/taxt_report_error_point_item.xml b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_report_error_point_item.xml similarity index 96% rename from OCH/taxi/unmanned-driver/src/main/res/layout/taxt_report_error_point_item.xml rename to OCH/common/biz/src/main/res/routing/layout/biz_taxi_report_error_point_item.xml index 9f19d39c77..b68eddc7c3 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/taxt_report_error_point_item.xml +++ b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_report_error_point_item.xml @@ -10,7 +10,7 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:src="@drawable/taxi_routing_uncheck" + android:src="@drawable/biz_taxi_uncheck" android:layout_width="@dimen/dp_53" android:layout_height="@dimen/dp_53"/> + android:src="@drawable/biz_taxi_current_start_station_point" /> @@ -72,7 +72,7 @@ android:layout_marginTop="@dimen/dp_8" android:layout_width="@dimen/dp_45" android:layout_height="@dimen/dp_45" - android:src="@drawable/taxi_task_current_end_station_point" /> + android:src="@drawable/biz_taxi_current_end_station_point" /> @@ -101,7 +101,7 @@ android:id="@+id/actv_distance_end" android:text="5.2公里" android:textSize="@dimen/dp_32" - android:textColor="@color/taxi_color_CCCCCC" + android:textColor="@color/biz_routing_CCCCCC" app:layout_constraintTop_toBottomOf="@+id/actv_current_itinerary_start_name" app:layout_constraintStart_toStartOf="@+id/actv_current_itinerary_start_name" app:layout_constraintBottom_toTopOf="@+id/actv_current_itinerary_end_name" @@ -131,8 +131,8 @@ app:layout_constraintStart_toStartOf="parent" android:layout_marginStart="@dimen/dp_54" android:layout_marginBottom="@dimen/dp_55" - android:background="@drawable/taxi_button_selector" - android:textColor="@color/taxi_submit_text_color_selector" + android:background="@drawable/biz_button_selector" + android:textColor="@color/biz_taxi_submit_text_color_selector" android:textSize="@dimen/dp_40" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select_item.xml b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_select_item.xml similarity index 76% rename from OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select_item.xml rename to OCH/common/biz/src/main/res/routing/layout/biz_taxi_select_item.xml index fb4194ca91..a9bbb2ff9c 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select_item.xml +++ b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_select_item.xml @@ -4,18 +4,18 @@ tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout" android:layout_width="@dimen/dp_774" android:layout_height="wrap_content" - android:background="@drawable/shape_itinerary_bg_default" + android:background="@drawable/biz_shape_itinerary_bg_default" xmlns:tools="http://schemas.android.com/tools"> + + @@ -63,7 +78,7 @@ app:layout_constraintTop_toTopOf="@+id/actv_history_verify_num_title" app:layout_constraintBottom_toBottomOf="@+id/actv_history_verify_num_title" app:layout_constraintStart_toEndOf="@+id/actv_history_verify_num_title" - android:textColor="@color/taxi_color_26C14F" + android:textColor="@color/biz_routing_26C14F" android:layout_marginStart="@dimen/dp_17" android:textSize="@dimen/dp_30" tools:text="5可用" @@ -75,7 +90,7 @@ app:layout_constraintTop_toTopOf="@+id/actv_history_verify_num_title" app:layout_constraintBottom_toBottomOf="@+id/actv_history_verify_num_title" app:layout_constraintStart_toEndOf="@+id/actv_history_verify_num_enable_num" - android:textColor="@color/taxi_color_FF852E" + android:textColor="@color/biz_routing_FF852E" android:layout_marginStart="@dimen/dp_28" android:textSize="@dimen/dp_30" tools:text="2不可用" @@ -87,7 +102,7 @@ android:id="@+id/actv_routing_start" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintBottom_toBottomOf="parent" - android:textColor="@color/taxi_color_2eacff" + android:textColor="@color/biz_routing_2eacff" android:layout_marginEnd="@dimen/dp_40" android:layout_marginBottom="@dimen/dp_32" android:textSize="@dimen/dp_30" diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_switch.xml b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_switch.xml similarity index 72% rename from OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_switch.xml rename to OCH/common/biz/src/main/res/routing/layout/biz_taxi_switch.xml index 7e1a136add..cbffd4673e 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_switch.xml +++ b/OCH/common/biz/src/main/res/routing/layout/biz_taxi_switch.xml @@ -7,7 +7,7 @@ xmlns:tools="http://schemas.android.com/tools" tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout"> - - + + + + + #FF4E41 + #2EACFF + #CCB9C3E9 + #4D000000 + #80000000 + #CCCCCC + #CCFFFFFF + #26C14F + #FF852E + #999999 + \ No newline at end of file diff --git a/OCH/common/biz/src/main/res/routing/values/strings.xm.xml b/OCH/common/biz/src/main/res/routing/values/strings.xm.xml new file mode 100644 index 0000000000..6509906cda --- /dev/null +++ b/OCH/common/biz/src/main/res/routing/values/strings.xm.xml @@ -0,0 +1,11 @@ + + + 您确认要结束任务吗? + 距离最近 + 线路ID升序 + 线路ID降序 + 验证次数升序 + 验证次数降序 + 灰度时间升序 + 灰度时间降序 + \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt index ce800bffe6..87d3fa02d8 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeProvider.kt @@ -10,6 +10,8 @@ import com.mogo.eagle.core.utilcode.util.CoordinateUtils import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.bridge.bridge.OchBridgeManager +import com.mogo.och.bridge.bridge.OchCollisionRiskManager +import com.mogo.och.bridge.bridge.OchPncManager import com.mogo.och.bridge.bridge.OchVlmManager import com.mogo.och.bridge.trajectory.TrajectoryManager import com.mogo.och.common.module.biz.birdge.BridgeService @@ -35,10 +37,9 @@ class BridgeProvider : BridgeService, CallerBase() { // 车前引导线+预测数据 OchBridgeManager.load() - -// if(EnvManager.isT1T2Passenger()){ - OchVlmManager.load() -// } + OchVlmManager.load() + OchPncManager.load() + OchCollisionRiskManager.load() TrajectoryManager.load() } @@ -114,5 +115,17 @@ class BridgeProvider : BridgeService, CallerBase() { } } + fun invokePncData(pncAction:String){ + M_LISTENERS.forEach { + it.value.onPncInfoListener(pncAction) + } + } + + fun invokeCollisionRisk(){ + M_LISTENERS.forEach { + it.value.onCollisionRisk() + } + } + } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt index 048b82028f..90042f2721 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/BridgeServiceManager.kt @@ -46,4 +46,12 @@ object BridgeServiceManager { this.bridgeService?.inVokeNdeData(title,desc,sortedList) } + fun invokePncData(pncAction:String){ + this.bridgeService?.invokePncData(pncAction) + } + + fun collisionRisk() { + this.bridgeService?.invokeCollisionRisk() + } + } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt index afbffa060d..d07607e4cf 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotManager.kt @@ -96,7 +96,7 @@ object OchAutoPilotManager { @JvmStatic fun startAutoPilot(controlParameters: AutopilotControlParameters?): Long { val sessionId = CallerAutoPilotControlManager.startAutoPilot(controlParameters) - globalSessionId.set(SessionWithTime(sessionId,System.currentTimeMillis())) + globalSessionId.set(SessionWithTime(sessionId,System.currentTimeMillis(),-1L)) OchAutoPilotStatusListenerManager.fsmBackSessionId.set(-1L) OchAutopilotAnalytics.triggerStartAutopilotParameters(controlParameters, sessionId) return sessionId @@ -116,4 +116,15 @@ object OchAutoPilotManager { } } } + + fun setAckTimeWithSessionId(msgId: Long, receiveTime: Long) { + if(msgId == globalSessionId.get().sessionId){ + globalSessionId.get().ackTime = receiveTime + } + } + + fun getSessionidAndAcktime():Pair{ + val sessionInfo = globalSessionId.get() ?: return Pair(-1L,-1L) + return Pair(sessionInfo.sessionId, sessionInfo.ackTime) + } } \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt index 4292c4d9a4..c13e508984 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/autopilot/autopilot/OchAutoPilotStatusListenerManager.kt @@ -280,8 +280,8 @@ object OchAutoPilotStatusListenerManager : CallerBase() { - const val TAG = M_OCHCOMMON+"LineManager" + const val TAG = M_OCHCOMMON + "LineManager" const val firstStationFirstStartAutopilotFlag = 0 const val middleStationFirstStartAutopilotFlag = 1 @@ -54,7 +55,7 @@ object LineManager : CallerBase() { @JvmStatic private var _lineInfos: LineInfo? = null - val lineInfos:LineInfo? + val lineInfos: LineInfo? @JvmStatic get() = _lineInfos @@ -63,7 +64,7 @@ object LineManager : CallerBase() { */ @JvmStatic private var _contraiInfo: ContraiInfo? = null - val contraiInfo:ContraiInfo? + val contraiInfo: ContraiInfo? @JvmStatic get() = _contraiInfo @@ -96,9 +97,9 @@ object LineManager : CallerBase() { * 2 中间站点触发 * 3 新的站点第一次启动自驾成功后 */ - var autopilotFlag : Int by Delegates.observable(firstStationFirstStartAutopilotFlag) { _, oldValue, newValue -> - if(oldValue!=newValue){ - d(TAG,"autopilotFlag old=$oldValue new=$newValue") + var autopilotFlag: Int by Delegates.observable(firstStationFirstStartAutopilotFlag) { _, oldValue, newValue -> + if (oldValue != newValue) { + d(TAG, "autopilotFlag old=$oldValue new=$newValue") } } @@ -113,23 +114,24 @@ object LineManager : CallerBase() { CallerEagleBaseFunctionCall4OchManager.setOchAutopilotOrderId(newValue) isFirstStartAutopilot = true M_LISTENERS.forEach { - it.value.onAutopilotIdChange(oldValue,newValue) + it.value.onAutopilotIdChange(oldValue, newValue) } - if(!AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode)&& - !AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode)&& + if (!AppIdentityModeUtils.isBus(FunctionBuildConfig.appIdentityMode) && + !AppIdentityModeUtils.isShuttle(FunctionBuildConfig.appIdentityMode) && !AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) - ){ + ) { val (start, end) = getStations() - if(start!=null&&end!=null){ - val ochInfo = OchInfo(0, mutableListOf(start.toMogoLocation(), end.toMogoLocation())) + if (start != null && end != null) { + val ochInfo = + OchInfo(0, mutableListOf(start.toMogoLocation(), end.toMogoLocation())) CallerDataCenterBizListener.invokeOchInfo(ochInfo) OchChainLogManager.writeChainLogMap("向地图传参数", "参数信息:${ochInfo}") - d(TAG,"向地图传参数_参数信息:${ochInfo}") - }else{ + d(TAG, "向地图传参数_参数信息:${ochInfo}") + } else { val ochInfo = OchInfo(0, mutableListOf()) CallerDataCenterBizListener.invokeOchInfo(ochInfo) OchChainLogManager.writeChainLogMap("向地图传参数", "参数信息:${ochInfo}") - d(TAG,"向地图传参数_参数信息:${ochInfo}") + d(TAG, "向地图传参数_参数信息:${ochInfo}") } } } @@ -165,9 +167,13 @@ object LineManager : CallerBase() { * 在终点10m 范围内向地盘查询是否到站 * [com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager.onAutoPilotStation] */ - val token = CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotStation(teleOrderId) - OchChainLogManager.writeChainLogAutopilot("到站逻辑","距离站点:$distance 请求token:$token") - d(TAG,"到站逻辑_距离站点:$distance 请求token:$token") + val token = + CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotStation(teleOrderId) + OchChainLogManager.writeChainLogAutopilot( + "到站逻辑", + "距离站点:$distance 请求token:$token" + ) + d(TAG, "到站逻辑_距离站点:$distance 请求token:$token") } } } @@ -186,7 +192,7 @@ object LineManager : CallerBase() { } } - fun searchAutopilotState(){ + fun searchAutopilotState() { CallerAutoPilotControlManager.sendSsmFuncQueryAutoPilotInfo() } @@ -194,10 +200,10 @@ object LineManager : CallerBase() { * [searchAutopilotState] 方法请求的返回值 */ fun invokeSetIsFirstAutopilot(orderId: String?, firstAutopilotFlag: Boolean, count: Int) { - if (this.teleOrderId==orderId){ - if(count>=1){ + if (this.teleOrderId == orderId) { + if (count >= 1) { teleIsFirstStartAutopilot = false - }else{ + } else { teleIsFirstStartAutopilot = true } } @@ -209,20 +215,23 @@ object LineManager : CallerBase() { fun setStartAndEndStation(startStation: BusStationBean?, endStation: BusStationBean?) { this.startStation = startStation this.endStation = endStation - if(startStation==null||endStation==null){ + if (startStation == null || endStation == null) { clearAutopilotControlParameters() - }else { + } else { setAutopilotControlParameters() } - OchChainLogManager.writeChainLogAutopilot("自驾参数", "站点信息:${startStation}---${endStation}") - d(TAG,"自驾参数 设置站点_站点信息:${startStation}---${endStation}") + OchChainLogManager.writeChainLogAutopilot( + "自驾参数", + "站点信息:${startStation}---${endStation}" + ) + d(TAG, "自驾参数 设置站点_站点信息:${startStation}---${endStation}") } - fun setContraiInfo(contraiInfo: ContraiInfo?){ + fun setContraiInfo(contraiInfo: ContraiInfo?) { this._contraiInfo = contraiInfo setAutopilotControlParameters() OchChainLogManager.writeChainLogAutopilot("自驾参数", "轨迹信息:${contraiInfo}") - d(TAG,"自驾参数 设置轨迹_轨迹信息:${contraiInfo}") + d(TAG, "自驾参数 设置轨迹_轨迹信息:${contraiInfo}") } @JvmStatic @@ -242,12 +251,12 @@ object LineManager : CallerBase() { sb.append(it.value) } OchChainLogManager.writeChainLogAutopilot("设置线路", "$sb") - d(TAG,"自驾参数 设置线路_线路信息:${_lineInfos}_${sb}") + d(TAG, "自驾参数 设置线路_线路信息:${_lineInfos}_${sb}") CallerEagleBaseFunctionCall4OchManager.updateOrderLine(sb.toString()) } } OchChainLogManager.writeChainLogAutopilot("设置线路", "线路信息:$_lineInfos") - d(TAG,"自驾参数 设置线路_线路信息:${_lineInfos}") + d(TAG, "自驾参数 设置线路_线路信息:${_lineInfos}") } fun getStations(): Pair { @@ -294,8 +303,8 @@ object LineManager : CallerBase() { } } - fun getLineInfo(function: (lineInfo: LineInfo) -> Unit){ - _lineInfos?.let { line-> + fun getLineInfo(function: (lineInfo: LineInfo) -> Unit) { + _lineInfos?.let { line -> function.invoke(line) return } @@ -311,7 +320,7 @@ object LineManager : CallerBase() { } } - private fun setAutopilotControlParameters(){ + private fun setAutopilotControlParameters() { getStationsWithLine { start, end, lineInfo -> val parameters = initAutopilotControlParameters() if (null == parameters) { @@ -321,7 +330,7 @@ object LineManager : CallerBase() { d(TAG, "AutopilotControlParameters is update.") if (lineInfo.isFirstStation(start)) { autopilotFlag = firstStationFirstStartAutopilotFlag - }else{ + } else { autopilotFlag = middleStationFirstStartAutopilotFlag } CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(parameters) @@ -332,14 +341,18 @@ object LineManager : CallerBase() { val endStationLocation = MogoLocation() endStationLocation.latitude = end.gcjLat endStationLocation.longitude = end.gcjLon - TrajectoryAndDistanceManager.setStationPoint(startStationLocation, endStationLocation, lineInfo.lineId) - OchLocationManager.addGCJ02Listener(TAG,1, mMapLocationListener) + TrajectoryAndDistanceManager.setStationPoint( + startStationLocation, + endStationLocation, + lineInfo.lineId + ) + OchLocationManager.addGCJ02Listener(TAG, 1, mMapLocationListener) // 恢复启动自驾信息 searchAutopilotState() } } - private fun clearAutopilotControlParameters(){ + private fun clearAutopilotControlParameters() { CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters(null) TrajectoryAndDistanceManager.setStationPoint(null, null, null) autopilotId = "" @@ -380,20 +393,21 @@ object LineManager : CallerBase() { fun initAutopilotControlParameters(): AutopilotControlParameters? { var parameters: AutopilotControlParameters? = null getStationsWithLine { start, end, lineInfo -> - this.autopilotId = "${lineInfo.lineId}_${start.siteId}_${end.siteId}_${lineInfo.orderId}" + this.autopilotId = + "${lineInfo.lineId}_${start.siteId}_${end.siteId}_${lineInfo.orderId}" this.teleOrderId = lineInfo.genAutopilotId() } getStationsWithLineAndContrai { start, end, lineInfo, contrai -> parameters = AutopilotControlParameters() parameters?.routeID = lineInfo.lineId.toInt() parameters?.routeName = lineInfo.lineName - parameters?.startName = start.name - parameters?.endName = end.name - parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon) - parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon) - if(AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)){ + parameters?.startName = start.name ?: "" + parameters?.endName = end.name ?: "" + parameters?.startLatLon = AutoPilotLonLat(start.lat, start.lon,true) + parameters?.endLatLon = AutoPilotLonLat(end.lat, end.lon,true) + if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { parameters?.vehicleType = 9 - }else{ + } else { parameters?.vehicleType = 10 } parameters?.orderId = this.teleOrderId @@ -418,95 +432,105 @@ object LineManager : CallerBase() { ) } - val (wayLatLons, blackLatLons) = contrai.getWayBlackLatLons() - - parameters?.wayLatLons = wayLatLons - parameters?.blackLatLons = blackLatLons - + if (endStation?.passPoints?.isNotEmpty() == true || + endStation?.blackPoints?.isNotEmpty() == true + ) { + val (wayLatLons, blackLatLons) = endStation!!.getWayBlackLatLons() + parameters?.wayLatLons = wayLatLons + parameters?.blackLatLons = blackLatLons + CallerLogger.d(TAG, "从站点获取经停点和禁行点") + } else { + val (wayLatLons, blackLatLons) = contrai.getWayBlackLatLons() + parameters?.wayLatLons = wayLatLons + parameters?.blackLatLons = blackLatLons + CallerLogger.d(TAG, "从轨迹获取经停点和禁行点") + } } + CallerLogger.d(TAG, "${parameters?.wayLatLons}\n${parameters?.blackLatLons}") if (parameters == null) { ToastUtils.showShort("未设置起始或终点站点") } return parameters } - fun getWayBlackLatLons( - passPoints: MutableList?, - blackPoints: MutableList? - ): Pair, MutableList> { + fun initAutopilotControlParametersFromContrai(): AutopilotControlParameters? { + var parameters: AutopilotControlParameters? = null + + this.autopilotId = "${lineInfos?.lineId}_${startStation?.siteId}_${endStation?.siteId}_${lineInfos?.orderId}" + this.teleOrderId = lineInfos?.genAutopilotId() ?: "" + + + parameters = AutopilotControlParameters() + parameters.routeID = lineInfos?.lineId?.toInt()?:0 + parameters.routeName = lineInfos?.lineName?:"" + lineInfos?.siteInfos?.let { + if(it.size>=0){ + parameters.startLatLon = AutoPilotLonLat(it.first().lat, it.first().lon,true) + parameters.endLatLon = AutoPilotLonLat(it.last().lat, it.last().lon,true) + parameters.startName = it.first().name ?: "" + parameters.endName = it.last().name ?: "" + } + } + if (AppIdentityModeUtils.isTaxi(FunctionBuildConfig.appIdentityMode)) { + parameters.vehicleType = 9 + } else { + parameters.vehicleType = 10 + } + parameters.orderId = this.teleOrderId + parameters.firstStationFlag = autopilotFlag + parameters.firstAutopilotFlag = teleIsFirstStartAutopilot + + if (parameters.autoPilotLine == null) { + parameters.autoPilotLine = AutoPilotLine( + lineInfos?.lineId?:0L, + lineInfos?.lineName?:"", + contraiInfo?.csvFileUrl?:"", + contraiInfo?.csvFileMd5?:"", + contraiInfo?.txtFileUrl?:"", + contraiInfo?.txtFileMd5?:"", + contraiInfo?.contrailSaveTime?:System.currentTimeMillis(), + "", + "", + "", + "", + "", + 0L + ) + } + val wayLatLons = mutableListOf() - // 途经点 - if (!passPoints.isNullOrEmpty()) { - for (mogoLatLng in passPoints) { - wayLatLons.add( - AutoPilotLonLat( - mogoLatLng.lat, - mogoLatLng.lon, - when (mogoLatLng.pointType) { - 1 -> {//途径点 - false - } - - 2 -> {//禁行点 - false - } - - 3 -> {//站点 - true - } - - else -> { - false - } - } - ) - ) - } - } val blackLatLons = mutableListOf() - // 黑名单点 - if (!blackPoints.isNullOrEmpty()) { - for (mogoLatLng in blackPoints) { - blackLatLons.add( - AutoPilotLonLat( - mogoLatLng.lat, - mogoLatLng.lat, - when (mogoLatLng.pointType) { - 1 -> {//途径点 - false - } - - 2 -> {//禁行点 - false - } - - 3 -> {//站点 - true - } - - else -> { - false - } - } - ) - ) + lineInfos?.siteInfos?.forEachIndexed { index, site -> + if(index>0){ + val (wayLatLonsSite, blackLatLonsSite) = site.getWayBlackLatLons() + wayLatLons.addAll(wayLatLonsSite) + blackLatLons.addAll(blackLatLonsSite) + if(index!=lineInfos!!.siteInfos.size-1) { + wayLatLons.add(AutoPilotLonLat(site.lat, site.lon, true)) + } } - } - return Pair(wayLatLons,blackLatLons) - } + } + + parameters.wayLatLons = wayLatLons + parameters.blackLatLons = blackLatLons + + CallerLogger.d(TAG, "从轨迹获取经停点和禁行点") + + return parameters + } // 启动自动驾驶 fun startAutopilot() { - if(startStation ==null|| endStation ==null){ + if (startStation == null || endStation == null) { ToastUtils.showShort("未设置起始或终点站点") return } startStation?.let { - if(!it.isLeaving){ + if (!it.isLeaving) { ToastUtils.showShort("请滑动出发后再启动自驾") return } @@ -522,10 +546,10 @@ object LineManager : CallerBase() { OchAutopilotAnalytics.triggerClickStartAutopilotTime(System.currentTimeMillis()) //1、判断轨迹url是否可用 - if(_contraiInfo ==null){ + if (_contraiInfo == null) { ToastUtils.showLong("无发布轨迹, 请发布后重试") return - }else{ + } else { if (FunctionBuildConfig.isPassStartAutopilotCommand && TextUtils.isEmpty(_contraiInfo!!.csvFileUrl) && TextUtils.isEmpty(_contraiInfo!!.csvFileMd5) @@ -558,7 +582,7 @@ object LineManager : CallerBase() { return } - triggerStartServiceEvent(false,0,"") + triggerStartServiceEvent(false, 0, "") val parameters = initAutopilotControlParameters() if (null == parameters) { @@ -566,10 +590,11 @@ object LineManager : CallerBase() { return } - val sessionId = startAutoPilot(parameters) + val sessionId = startAutoPilot(parameters) OchAutopilotAnalytics.triggerUpdateStartAutoPilotSessionId(sessionId) - d(TAG, + d( + TAG, "行程日志-开启自动驾驶====" + GsonUtil.jsonFromObject(parameters) + " startLatLon=" + parameters.startName + ",endLatLon=" + parameters.endName + "isRestart = " + isFirstStartAutopilot @@ -583,7 +608,7 @@ object LineManager : CallerBase() { private fun triggerUnableStartAPReasonEvent() { getStationsWithLine { start, end, line -> OchAutopilotAnalytics.triggerUnableStartAPReasonEvent( - start.name, end.name,line.lineId.toString() , "", + start.name ?: "", end.name ?: "", line.lineId.toString(), "", OCHAdasAbilityManager.getInstance().autopilotUnAbilityReason ) } @@ -594,32 +619,32 @@ object LineManager : CallerBase() { * 1: 通过can消息发送自驾状态确定启动自驾成功 * 2:通过FSM 反馈确定启动自驾成功 */ - fun triggerStartServiceEvent(send: Boolean,source:Int,type:String) { + fun triggerStartServiceEvent(send: Boolean, source: Int, type: String) { getStationsWithLine { start, end, lineInfo -> OchAutopilotAnalytics.triggerStartAutopilotEvent( isFirstStartAutopilot, send, - start.name, - end.name, + start.name ?: "", + end.name ?: "", lineInfo.lineId.toInt(), "", System.currentTimeMillis(), type, source ) - if(send){// 启动自驾成功回调 + if (send) {// 启动自驾成功回调 teleIsFirstStartAutopilot = false isFirstStartAutopilot = false autopilotFlag = norFirstStartAutopilotFlag M_LISTENERS.forEach { - it.value.startAutopilotSuccess(source,autopilotId) + it.value.startAutopilotSuccess(source, autopilotId) } } } } @JvmStatic - fun invokeStartAutopilotTimeOut(){ + fun invokeStartAutopilotTimeOut() { M_LISTENERS.forEach { it.value.startAutopilotTimeOut() } @@ -627,9 +652,13 @@ object LineManager : CallerBase() { @JvmStatic fun invokeStartAutopilotFailure(startFailedCode: String, startFailedMessage: String) { - OchAutopilotAnalytics.triggerStartAutopilotFailureEventByAdas(startFailedCode,startFailedMessage,System.currentTimeMillis()) + OchAutopilotAnalytics.triggerStartAutopilotFailureEventByAdas( + startFailedCode, + startFailedMessage, + System.currentTimeMillis() + ) M_LISTENERS.forEach { - it.value.startAutopilotFailure(startFailedCode,startFailedMessage) + it.value.startAutopilotFailure(startFailedCode, startFailedMessage) } } @@ -640,16 +669,19 @@ object LineManager : CallerBase() { } fun compareFSMAndOchOrderId(autopilotIdFromFsm: String?) { - if(autopilotIdFromFsm == teleOrderId){ + if (autopilotIdFromFsm == teleOrderId) { // 地盘有和上层一样 不用操作 - }else{ - if(autopilotIdFromFsm.isNullOrEmpty()){ + } else { + if (autopilotIdFromFsm.isNullOrEmpty()) { // 地盘没有 不做操作 - }else{ + } else { // 地盘有但是和och出不一样 // todo 需要och 重新出发轨迹下载操作 ToastUtils.showShort("${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查") - OchChainLogManager.writeChainLogAutopilot("自驾Id","${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查") + OchChainLogManager.writeChainLogAutopilot( + "自驾Id", + "${autopilotIdFromFsm}_${teleOrderId}_自动驾驶id不同请排查" + ) // val initAutopilotControlParameters = initAutopilotControlParameters() // if (initAutopilotControlParameters!==null&&initAutopilotControlParameters.autoPilotLine!=null // && contraiInfo!=null diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt index 661733f998..765f217795 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchBridgeManager.kt @@ -26,6 +26,9 @@ import com.mogo.map.overlay.core.Level import com.mogo.map.overlay.point.Point import com.mogo.och.bridge.BridgeServiceManager import com.mogo.och.bridge.R +import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.common.module.manager.loop.LoopInfo +import io.reactivex.schedulers.Schedulers import prediction2025.Prediction2025 import mogo.telematics.pad.MessagePad import kotlin.properties.Delegates @@ -54,6 +57,7 @@ object OchBridgeManager: IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentify CallerPlanningTrajectoryListenerManager.addListener(TAG,this) CallerAutopilotIdentifyListenerManager.addListener(TAG,this) CallerPlanningActionsListenerManager.addListener(TAG, this) + BizLoopManager.setLoopFunction(TAG, LoopInfo(2, ::checkTimeout, immediately = false, scheduler = Schedulers.io())) UiThreadHandler.postDelayed(timeRunnable, 1000) } @@ -70,7 +74,6 @@ object OchBridgeManager: IMoGoPlanningTrajectoryListener, IMoGoAutopilotIdentify CallerLogger.d(TAG,"haveTrajectoryInfo 发生变化:${newValue}") } trajectoryTime = System.currentTimeMillis() - } // 是否有预测数据 diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchCollisionRiskManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchCollisionRiskManager.kt new file mode 100644 index 0000000000..a5a14f58ad --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchCollisionRiskManager.kt @@ -0,0 +1,22 @@ +package com.mogo.och.bridge.bridge + +import com.mogo.eagle.core.function.api.devatools.ICollisionRiskListener +import com.mogo.eagle.core.function.call.devatools.CallerCollisionRiskManager +import com.mogo.och.bridge.BridgeServiceManager + +object OchCollisionRiskManager : ICollisionRiskListener { + + private const val TAG = "OchCollisionRiskManager" + fun load() { + CallerCollisionRiskManager.addListener(TAG, this) + } + + fun release() { + CallerCollisionRiskManager.removeListener(TAG) + } + + override fun onCollisionRisk() { + BridgeServiceManager.collisionRisk() + } + +} \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchPncManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchPncManager.kt new file mode 100644 index 0000000000..a2c306d28d --- /dev/null +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/bridge/OchPncManager.kt @@ -0,0 +1,50 @@ +package com.mogo.och.bridge.bridge + +import com.mogo.eagle.core.data.autopilot.pnc.PncActionsHelper +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotPlanningActionsListener +import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.bridge.BridgeServiceManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import kotlin.properties.Delegates +import mogo.telematics.pad.MessagePad + +object OchPncManager : IMoGoAutopilotPlanningActionsListener { + + private val TAG = "${M_OCHCOMMON}OchPncManager" + + private var pncAction: String by Delegates.observable("") { _, oldValue, newValue -> + if (oldValue != newValue) { + OchChainLogManager.writeCHainLogBridge("pnc消息","oldPnc:$oldValue newPnc:$newValue") + BridgeServiceManager.invokePncData(newValue) + } + } + + fun load(){ + CallerPlanningActionsListenerManager.addListener(TAG, this) + } + + fun release(){ + CallerPlanningActionsListenerManager.removeListener(TAG) + } + + override fun pncActions(planningActionMsg: MessagePad.PlanningActionMsg) { + planningActionMsg.actionMsg?.let { + try { + pncAction = PncActionsHelper.getAction( + it.drivingState.number, + it.drivingAction.number + ) + } catch (e: Exception) { + e.printStackTrace() + } + } + planningActionMsg.v2NActionMsgList?.forEach { v2nAction -> + pncAction = PncActionsHelper.getAction( + v2nAction.drivingState.number, + v2nAction.drivingAction.number + ) + } + } + +} \ No newline at end of file diff --git a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt index 4b2c54074f..8773ba1c89 100644 --- a/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt +++ b/OCH/common/bridge/src/main/java/com/mogo/och/bridge/distance/TrajectoryAndDistanceManager.kt @@ -17,6 +17,7 @@ import com.mogo.och.bridge.trajectory.TrajectoryCache import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo import com.mogo.och.bridge.utils.CoordinateCalculateRouteUtil +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import io.reactivex.schedulers.Schedulers import mogo.telematics.pad.MessagePad import java.util.concurrent.ConcurrentHashMap @@ -127,6 +128,7 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { d(M_OCHCOMMON + TAG, "onAutopilotRotting: 收到轨迹") globalPathResp?.wayPointsList?.let { if (it.size > 0) { + OchChainLogManager.writeChainLogTrajectory("轨迹监控","收到轨迹信息轨迹个数${it.size}第一个点${it[0]}最后一个点:${it.last()} 轨迹id:${globalPathResp.lineId}") d( M_OCHCOMMON + TAG, "收到轨迹:轨迹个数${it.size}第一个点${it[0]}最后一个点:${it.last()} 轨迹id:${globalPathResp.lineId}" @@ -192,6 +194,7 @@ object TrajectoryAndDistanceManager : IMoGoPlanningRottingListener { M_OCHCOMMON + TAG, "线路id:${lineId}设置站点:开始站点${startStationInfo}、结束站点:${endStationInfo}" ) + OchChainLogManager.writeChainLogTrajectory("轨迹监控","设置站点:线路id:${lineId}设置站点:开始站点${startStationInfo}、结束站点:${endStationInfo}") if (startStationInfo == null || endStationInfo == null || lineId == -1L) { this.endStationInfo.index = null this.endStationInfo.distance = null diff --git a/OCH/common/common/build.gradle b/OCH/common/common/build.gradle index 68e607db93..2ecd209687 100644 --- a/OCH/common/common/build.gradle +++ b/OCH/common/common/build.gradle @@ -61,7 +61,7 @@ dependencies { testImplementation project(path: ':OCH:common:common') androidTestImplementation 'androidx.test.ext:junit:1.1.1' androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' - implementation rootProject.ext.dependencies.amapnavi3dmap + api rootProject.ext.dependencies.amapnavi3dmap implementation rootProject.ext.dependencies.rxandroid implementation rootProject.ext.dependencies.arouter diff --git a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt index 054d5e574e..b8baa86142 100644 --- a/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt +++ b/OCH/common/common/src/debug/java/com/mogo/och/common/module/debug/DebugDataDispatch.kt @@ -3,8 +3,10 @@ package com.mogo.och.common.module.debug import android.content.Intent import android.graphics.Bitmap import android.graphics.BitmapFactory +import android.graphics.Color import android.os.Environment import android.os.SystemClock +import android.widget.TextView import chassis.Chassis import chassis.Chassis.DoorNumber import chassis.VehicleStateOuterClass @@ -28,6 +30,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisStatesListenerMa import com.mogo.eagle.core.function.call.autopilot.CallerPlanningActionsListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerVlmManager +import com.mogo.eagle.core.function.call.devatools.CallerCollisionRiskManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapRomaListener @@ -40,11 +43,12 @@ import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ThreadUtils import com.mogo.och.common.module.R import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.och.common.module.biz.order.OrderManager import com.mogo.och.common.module.debug.location.MogoLocationExit import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.view.DebugFloatWindow -import com.mogo.och.common.module.wigets.media.MediaBeanManager import com.zhjt.mogo.adas.data.bean.AutopilotStatistics import mogo.telematics.pad.MessagePad import mogo_msg.MogoReportMsg @@ -77,11 +81,16 @@ object DebugDataDispatch { const val scanner = "scanner" const val ota = "ota" const val video = "video" - const val mediaMusic = "mediaAndMusic" const val vlmMessage = "vlmMessage" const val vlmImage = "vlmImage" + const val pncAction = "pncAction" + const val collisionRisk = "CollisionRisk" + const val mediaStationMedia = "stationMedia" +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "video" --ei add 2 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "location" --es path "1111/11111" +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "pncAction" +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "CollisionRisk" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "globalPath" --es path "sy73.json" // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "carDoor" --ei doorPostion 1 --ei doorStatus 1 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "trunAroud" --es code "IMAP_TRA_LOADED" @@ -98,6 +107,7 @@ object DebugDataDispatch { // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "ota" --ei "ota" 1 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "vlmMessage" --es message "前方100米有道路施工,施工长度100米,影响第1、2车道通行。" --ei id 128 --ef time 1880.0 // adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "vlmImage" --ef time 1880.0 +// adb shell am broadcast -a com.mogo.launcher.debug -f 0x011000000 --es type "stationMedia" // adb shell am broadcast -a com.hmi.v2x.trafficlight -f 0x011000000 --ei trafficLightCheckType 1 --ei trafficLightCountDown 0 --ez trafficLightIsShow true // 红绿灯 @@ -112,6 +122,27 @@ object DebugDataDispatch { } when (type) { + mediaStationMedia -> { + val introductionList = mutableListOf() + introductionList.add( + MediaItem( + MediaItem.PrioritySite, "https://img.zhidaohulian.com/fileServer/defaultPath/d3468de5e877cc98931611f8cd4ff211/mogo.mp4", + MediaItem.MEDIA_TYPE_VIDEO,"","") + ) + MediaManager.postSiteIntroduceInfo(introductionList) + } + collisionRisk -> { + CallerCollisionRiskManager.invokeCollisionRisk() + } + pncAction -> { + val time = intent.getFloatExtra("action",0f) + val newBuilder = MessagePad.PlanningActionMsg.newBuilder() + val actionMsg = MessagePad.DrivingActionMsg.newBuilder() + actionMsg.drivingAction = MessagePad.DrivingAction.DRIVING_ACTION_STATE_ONE + actionMsg.drivingState = MessagePad.DrivingState.PULL_OVER + newBuilder.actionMsg = actionMsg.build() + CallerPlanningActionsListenerManager.invokePNCActions(newBuilder.build()) + } vlmMessage -> { val time = intent.getFloatExtra("time",0f) val id = intent.getIntExtra("id",0) @@ -129,22 +160,20 @@ object DebugDataDispatch { bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) val byteArray = stream.toByteArray() CallerVlmManager.invokeVllmImage(time.toDouble(),byteArray) - } - } - mediaMusic -> { - val musicList = MediaBeanManager.getMusicList() - val mediaList = MediaBeanManager.getMediaList() - CallerLogger.d(TAG,"${mediaList}\n${musicList}") - } - video -> { - val ota = intent.getIntExtra("video",0) + } + } + video -> { + val ota = intent.getIntExtra("add",0) // rtmp://video.zhidaozhixing.com/live/861130041693196C_2 val url = intent.getStringExtra("url")?:"" BizLoopManager.runInMainThread(){ - if(ota>0&&url.startsWith("rtmp://")){ + if(ota>0){ val driveVideoView = CallerDevaToolsManager.driveSeatVideoProvider() ?.getDriveVideoView(url) - CallerOchBizFunctionCall4EagleManager.setVideoView(driveVideoView) + val test = TextView(ActivityUtils.getTopActivity()) + test.text = "测试view" + test.setTextColor(Color.parseColor("#66FFFFFF")) + CallerOchBizFunctionCall4EagleManager.setVideoView(test) }else{ CallerOchBizFunctionCall4EagleManager.setVideoView(null) } diff --git a/OCH/common/common/src/debug/java/com/mogo/och/common/module/view/DebugFloatWindow.kt b/OCH/common/common/src/debug/java/com/mogo/och/common/module/view/DebugFloatWindow.kt index eb0d27dce5..93b7190e60 100644 --- a/OCH/common/common/src/debug/java/com/mogo/och/common/module/view/DebugFloatWindow.kt +++ b/OCH/common/common/src/debug/java/com/mogo/och/common/module/view/DebugFloatWindow.kt @@ -12,6 +12,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListener import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.util.BarUtils import com.mogo.och.common.module.R +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.common.module.debug.autopilot.AutopilotStateDebug import mogo_msg.MogoReportMsg @@ -97,6 +98,10 @@ class DebugFloatWindow constructor(activity: Activity) : View.OnTouchListener{ } } } + mFloatLayout.findViewById(R.id.acbtn_tts).onClick { + VoiceNotice.showNotice("混淆导致序列化问题") + VoiceNotice.showNoticeOut("混淆导致序列化问题") + } } override fun onTouch(v: View?, motionEvent: MotionEvent?): Boolean { diff --git a/OCH/common/common/src/debug/res/layout/debug_view.xml b/OCH/common/common/src/debug/res/layout/debug_view.xml index d3e9bd6333..feddc184d3 100644 --- a/OCH/common/common/src/debug/res/layout/debug_view.xml +++ b/OCH/common/common/src/debug/res/layout/debug_view.xml @@ -1,6 +1,7 @@ @@ -39,6 +40,7 @@ + + \ No newline at end of file diff --git a/OCH/common/common/src/main/AndroidManifest.xml b/OCH/common/common/src/main/AndroidManifest.xml index ceb2e638c5..35ac63f96c 100644 --- a/OCH/common/common/src/main/AndroidManifest.xml +++ b/OCH/common/common/src/main/AndroidManifest.xml @@ -1,17 +1,4 @@ - - - \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt index 8d378f1ce0..a3abae5e5d 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/birdge/BridgeListener.kt @@ -22,4 +22,8 @@ interface BridgeListener { fun onVlmDataListener(vlmData: VlmData){} fun onNdeDataListener(title: String, desc: String, sortedList: List) {} + + fun onPncInfoListener(pncAction: String) {} + + fun onCollisionRisk() {} } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IMediaDispatch.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IMediaDispatch.kt deleted file mode 100644 index 3fa8583546..0000000000 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IMediaDispatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.mogo.och.common.module.biz.media - -import com.mogo.och.common.module.wigets.media.MediaItem - -interface IMediaDispatch { - fun diapatchMedia(list :MutableList) - fun setMediaPause(){} - fun setMediaResume(){} -} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IVideoListener.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IVideoListener.kt new file mode 100644 index 0000000000..c8e5aca5c0 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/IVideoListener.kt @@ -0,0 +1,32 @@ +package com.mogo.och.common.module.biz.media + +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MusicData + +interface IVideoListener { + + fun diapatchMedia(list :MutableList){} + + fun setMediaPause(){} + + fun setMediaResume(){} + + fun onMediaDataSourceChanged(list: List){} + +} + +interface MusicDataChangeListener{ + + fun addOneData(it: MusicData){} + + /** + * toggle 修改播放器状态 + * @param oldData 上一个不是 PlayState.None 的歌曲 + * @param musicData 当前播放状态发生变化的歌曲 + */ + fun updateState(oldData: MusicData?, musicData: MusicData) + fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){} + fun onMusicCompletion(musicData: MusicData) {} + fun onDataDis(musicList: MutableList){} + +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaManager.kt index 2e8bdfd3b3..ef41a2e131 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaManager.kt @@ -1,28 +1,148 @@ package com.mogo.och.common.module.biz.media -import com.mogo.och.common.module.utils.CallerBase -import com.mogo.och.common.module.wigets.media.MediaItem +import android.content.Context +import android.view.View +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.tts.base.IMogoTTSCallback +import com.mogo.tts.base.LangTtsEntity -object MediaManager : CallerBase() { +object MediaManager { + + private var mediaService: MediaService? = + ARouter.getInstance().build(OchCommonConst.BIZ_Media).navigation() as MediaService + + fun addListener(tag:String, listener: IVideoListener){ + mediaService?.addVideoListener(tag,listener) + } + + fun removeListener(tag: String){ + mediaService?.removeVideoListener(tag) + } fun postSiteIntroduceInfo(list: MutableList){ - M_LISTENERS.forEach { - val listener = it.value - listener.diapatchMedia(list) - } + mediaService?.postSiteIntroduceInfo(list) } fun setMediaResume(){ - M_LISTENERS.forEach { - val listener = it.value - listener.setMediaResume() - } + mediaService?.setMediaResume() } fun setMediaPause(){ - M_LISTENERS.forEach { - val listener = it.value - listener.setMediaPause() + mediaService?.setMediaPause() + } + + fun setTTSFocusChange(isSpeaking:Boolean){ + mediaService?.setTTSFocusChange(isSpeaking) + } + + fun setVideoFocusChange(isPlaying:Boolean){ + mediaService?.setVideoFocusChange(isPlaying) + } + + object Audition{ + + fun stop() { + mediaService?.musicStop() + } + fun replayOrplayFirst(){ + mediaService?.musicReplayOrplayFirst() + } + + fun removeListener(tag: String) { + mediaService?.removeAuditionListener(tag) + } + + fun addListener(tag: String, listener: MusicDataChangeListener) { + mediaService?.addAuditionListener(tag,listener) + } + + fun isPlaying():Boolean?{ + return mediaService?.auditionIsPlaying() + } + + fun getPlaying(): MusicData? { + return mediaService?.getPlaying() + } + + fun play(musicData: MusicData) { + mediaService?.palyAudition(musicData) + } + + fun getPreAuditionData(it: MusicData): MusicData? { + return mediaService?.getPreAuditionData(it) + } + + fun getNextAuditionData(it: MusicData): MusicData? { + return mediaService?.getNextAuditionData(it) + } + + fun getAuditionDataList(): MutableList? { + return mediaService?.getAuditionDataList() + } + + fun toggle(musicData: MusicData) { + mediaService?.toggle(musicData) + } + + fun seekTo(progress: Int) { + mediaService?.seekTo(progress) + } + + } + + object Video{ + fun startSecondAds(){ + mediaService?.startSecondAds() + } + + fun getAdFragment(): Fragment? { + return mediaService?.getAdFragment() + } + + fun getAdView(context: Context): View?{ + return mediaService?.getAdView(context) + } + + fun createCacheFileDir() { + mediaService?.createCacheFileDir() + } + + fun init() { + mediaService?.initMediaData() + } + + fun unInit() { + mediaService?.unInitMediaData() + } + } + object Tts{ + + fun loadOuttts(){ + mediaService?.loadOuttts() + } + + fun releaesOuttts(){ + mediaService?.releaseOuttts() + } + + fun showNotice(notice: String?, level: Int, delayed: Long = 0,callBack: IMogoTTSCallback?=null){ + mediaService?.showNotice(notice,level,delayed,callBack) + } + + fun showNotice(listTTS: MutableList, level: Int, callBack: IMogoTTSCallback?=null){ + mediaService?.showNotice(listTTS,level,callBack) + } + + fun stopTts(){ + mediaService?.stopTTs() + } + + fun showNoticeOut(notice: String?) { + mediaService?.showNoticeOut(notice) } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaService.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaService.kt new file mode 100644 index 0000000000..787be3b1fa --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/MediaService.kt @@ -0,0 +1,76 @@ +package com.mogo.och.common.module.biz.media + +import android.content.Context +import android.view.View +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.template.IProvider +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.tts.base.IMogoTTSCallback +import com.mogo.tts.base.LangTtsEntity + +interface MediaService : IProvider { + + fun addVideoListener(tag: String, listener: IVideoListener) + + fun removeVideoListener(tag: String) + + fun postSiteIntroduceInfo(list: MutableList) + + fun setMediaResume() + + fun setMediaPause() + + fun setTTSFocusChange(speaking: Boolean) + + fun setVideoFocusChange(playing: Boolean) + + fun musicStop() + + fun musicReplayOrplayFirst() + + fun removeAuditionListener(tag: String) + + fun addAuditionListener(tag: String, listener: MusicDataChangeListener) + + fun auditionIsPlaying(): Boolean + + fun getPlaying(): MusicData? + + fun palyAudition(musicData: MusicData) + + fun getPreAuditionData(it: MusicData): MusicData + + fun getNextAuditionData(it: MusicData): MusicData + + fun toggle(musicData: MusicData) + + fun seekTo(progress: Int) + + fun getAuditionDataList(): MutableList + + fun showNotice(notice: String?, level: Int, delayed: Long, callBack: IMogoTTSCallback?) + + fun showNotice(listTTS: MutableList, level: Int, callBack: IMogoTTSCallback?=null) + + fun stopTTs() + + fun loadOuttts() + + fun releaseOuttts() + + fun showNoticeOut(notice: String?) + + fun startSecondAds() + + fun getAdFragment() :Fragment + + fun getAdView(context: Context): View + + fun createCacheFileDir() + + fun initMediaData() + + fun unInitMediaData() + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/VoiceNotice.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/VoiceNotice.kt new file mode 100644 index 0000000000..f1b015aada --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/VoiceNotice.kt @@ -0,0 +1,47 @@ +package com.mogo.och.common.module.biz.media + +import com.mogo.commons.voice.AIAssist +import com.mogo.tts.base.IMogoTTSCallback +import com.mogo.tts.base.LangTtsEntity + +object VoiceNotice { + + @JvmStatic + fun showNoticeOut(notice: String?) { + MediaManager.Tts.showNoticeOut(notice) + } + + @JvmStatic + fun showNotice(notice: String?) { + showNotice(notice, AIAssist.LEVEL0) + } + + @JvmStatic + fun showNotice(notice: String?, level: Int) { + showNotice(notice,level,0) + } + + @JvmStatic + fun showNotice(notice: String?, level: Int, delayed: Long) { + showNotice(notice, level, delayed,null) + } + + @JvmStatic + fun showNotice(notice: String?, level: Int, delayed: Long = 0,callBack:IMogoTTSCallback?=null) { + MediaManager.Tts.showNotice(notice,level,delayed,callBack) + } + + @JvmStatic + fun showNotice(listTTS: MutableList, level: Int,callBack: IMogoTTSCallback?=null) { + MediaManager.Tts.showNotice(listTTS,level,callBack) + } + + /** + * 中断当前在播语音 + */ + @JvmStatic + fun stopCurrentTts(){ + MediaManager.Tts.stopTts() + } + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MediaItem.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MediaItem.kt new file mode 100644 index 0000000000..e8b91949b7 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MediaItem.kt @@ -0,0 +1,53 @@ +package com.mogo.och.common.module.biz.media.data + +data class MediaItem( + var priority: Int, + var fileUrl: String, + var fileType: Int, + var coverImageUrl: String, + var title: String, + val isTemp: Boolean = false, + var localPath:String = "", + var pausePosition:Long = 0, +) { + companion object { + const val MEDIA_TYPE_IMAGE = 1 + const val MEDIA_TYPE_VIDEO = 2 + + const val PriorityConfi = 2 + const val PriorityAd = 1 + const val PrioritySite = 0 + + // 站点优先级 0 + // 广告优先级 1 + // 本地配置是 2 + } + + fun isImageType(): Boolean { + return this.fileType == MEDIA_TYPE_IMAGE + } + + fun isVideoType(): Boolean { + return this.fileType == MEDIA_TYPE_VIDEO + } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as MediaItem + + if (fileType != other.fileType) return false + if (fileUrl != other.fileUrl) return false + + return true + } + + override fun hashCode(): Int { + var result = fileType + result = 31 * result + fileUrl.hashCode() + return result + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MusicData.kt similarity index 94% rename from OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt rename to OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MusicData.kt index d0a23cf1be..ef29710c9b 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/MusicData.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/media/data/MusicData.kt @@ -1,4 +1,4 @@ -package com.mogo.och.common.module.manager.audition +package com.mogo.och.common.module.biz.media.data /** * 音乐文件 diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingCallback.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingCallback.java new file mode 100644 index 0000000000..65fb2d3161 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingCallback.java @@ -0,0 +1,5 @@ +package com.mogo.och.common.module.biz.routing; + +public interface RoutingCallback { + void showMap(boolean show); +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingManager.kt new file mode 100644 index 0000000000..9c84bf23c2 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingManager.kt @@ -0,0 +1,35 @@ +package com.mogo.och.common.module.biz.routing + +import android.view.View +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.launcher.ARouter +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_OCHCOMMON +import com.mogo.och.common.module.biz.time.TimeService +import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.manager.loop.BizLoopManager + +object RoutingManager { + + private const val TAG = M_OCHCOMMON+"RoutingManager" + + private var routingService: RoutingService? = + ARouter.getInstance().build(OchCommonConst.BIZ_ROUTING).navigation() as RoutingService + + + fun load(){ + OchChainLogManager.writeChainLogInit("初始化信息","初始化算路验证系统") + d(TAG,"初始化信息_初始化算路验证系统") + } + + fun getRoutingView():View?{ + return routingService?.getRoutingView() + } + + fun setRoutingCallback(callback: RoutingCallback?){ + routingService?.setRoutingCallback(callback) + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingService.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingService.kt new file mode 100644 index 0000000000..46f4323a15 --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/biz/routing/RoutingService.kt @@ -0,0 +1,13 @@ +package com.mogo.och.common.module.biz.routing + +import android.view.View +import androidx.fragment.app.Fragment +import com.alibaba.android.arouter.facade.template.IProvider + +interface RoutingService : IProvider { + + fun getRoutingView(): View? + + fun setRoutingCallback(callback: RoutingCallback?) + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt index 6a76f7839a..a4bb78e040 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/constant/OchCommonConst.kt @@ -37,6 +37,9 @@ class OchCommonConst { const val BIZ_SKIN = "/ochbiz/common/skin" const val BIZ_SCANNER = "/ochbiz/common/scanner" const val BIZ_TIME = "/ochbiz/common/time" + const val BIZ_Media = "/ochbiz/common/media" + + const val BIZ_ROUTING = "/ochbiz/common/routing" const val BIZ_OFFLINE = "/offlinedriver/offlinedata" const val BIZ_Bridge = "/birdge/bridge" @@ -73,6 +76,19 @@ class OchCommonConst { const val ARRIVE_AT_END_STATION_DISTANCE = 10 + // taxi 到达起始点围栏 + const val ARRIVE_AT_START_STATION_DISTANCE = 15 //围栏由20m改为50m 再次改为15m + + //算路终点UUID + const val TAXI_ROUTING_VERIFY_END_SITE = "taxi_routing_verify_end_site" + + //算路起点UUID + const val TAXI_ROUTING_VERIFY_START_SITE = "taxi_routing_verify_start_site" + + const val TYPE_MARKER_ROUTING_VERIFY = "TYPE_MARKER_TAXI_ROUTING_VERIFY" + + + //b1 b2 平均速度 bus的平均里程:25km/h const val BUS_AVERAGE_SPEED = 25 @@ -80,5 +96,7 @@ class OchCommonConst { const val Charter_AVERAGE_SPEED = 15 //T1T2的平均里程:38km/h const val TAXI_AVERAGE_SPEED = 38 + + const val PNC_ACTION_ENTERSTATION = "正在进站" } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/InputManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/InputManager.kt new file mode 100644 index 0000000000..aed49d981c --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/InputManager.kt @@ -0,0 +1,36 @@ +package com.mogo.och.common.module.manager + +import com.mogo.och.common.module.utils.CallerBase +import com.mogo.och.common.module.wigets.KeyboarView + +object InputManager: CallerBase() { + + var inputKey: KeyboarView?=null + + fun onTextChange(info:String){ + M_LISTENERS.forEach { + it.value.onTextChange(info) + } + } + + fun setKeyboardVisable(visible: Int) { + inputKey?.visibility = visible + } + + fun keyViewVisiblityChange(b: Boolean) { + M_LISTENERS.forEach { + it.value.onKeyVisiblityChange(b) + } + } + + fun clearInput() { + inputKey?.clearInput() + } + + +} + +interface InputTextChangeListener{ + fun onTextChange(info: String) + fun onKeyVisiblityChange(b: Boolean) +} diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/download/DownloadManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/download/DownloadManager.kt index 2520ff1378..c15d3c5536 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/download/DownloadManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/download/DownloadManager.kt @@ -8,6 +8,7 @@ import android.util.Log import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.download.DownloadUtils import com.mogo.eagle.core.utilcode.download.callback.IDownloadListener +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.EncryptUtils import com.mogo.eagle.core.utilcode.util.RegexUtils import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -22,7 +23,8 @@ object DownloadManager { private const val TAG = "DownloadManager" - private val waitDownLoadList = mutableListOf() + @Volatile + private var waitDownLoadList = mutableListOf() private val context: Context?=AbsMogoApplication.getApp() @@ -67,7 +69,7 @@ object DownloadManager { private fun getCacheFileName(mediaUrl: String): String { val fileSuffix = FileUtils.getExtension(mediaUrl) if (TextUtils.isEmpty(fileSuffix)) { - Log.e(TAG, "getCacheFileName 根据url获取文件后缀不合法,mediaUrl=$mediaUrl") + CallerLogger.e(TAG,"getCacheFileName 根据url获取文件后缀不合法,mediaUrl=$mediaUrl") return "" } return EncryptUtils.encryptMD5ToString(mediaUrl) + FileUtils.EXTENSION_SEPARATOR + fileSuffix @@ -78,12 +80,14 @@ object DownloadManager { com.mogo.eagle.core.utilcode.util.FileUtils.delete(localVideoPath) } OchChainLogManager.writechainLogDownload("删除本地文件","localVideoPath:${localVideoPath}") + CallerLogger.d(TAG,"删除本地文件 localVideoPath:${localVideoPath}") } fun downloadVideoFile(mediaUrl: String, listener: IDownloadListener?) { if (!RegexUtils.isURL(mediaUrl)) { OchChainLogManager.writechainLogDownload("准备下载","url 错误 ${mediaUrl}") + CallerLogger.d(TAG,"准备下载 url 错误 ${mediaUrl}") return } val downloadUrl = mediaUrl @@ -98,6 +102,7 @@ object DownloadManager { } + @Synchronized private fun go2Download(){ if(waitDownLoadList.isEmpty()){ return @@ -106,6 +111,7 @@ object DownloadManager { // 临时文件存在 需要删除重新下载 if (com.mogo.eagle.core.utilcode.util.FileUtils.isFileExists(first.downloadDir+File.separator+first.downloadFileName)) { OchChainLogManager.writechainLogDownload("删除临时文件","文件名称:${first.downloadDir+File.separator+first.downloadFileName}") + CallerLogger.d(TAG,"删除临时文件 文件名称:${first.downloadDir+File.separator+first.downloadFileName}") clearLocalFile(first.downloadDir+File.separator+first.downloadFileName) } // 改名后文件存在 不需要下载 @@ -114,10 +120,12 @@ object DownloadManager { waitDownLoadList.removeFirst() } OchChainLogManager.writechainLogDownload("取消下载文件已存在","信息:${first}") + CallerLogger.d(TAG,"取消下载文件已存在 信息:${first}") go2Download() return } OchChainLogManager.writechainLogDownload("准备下载","信息:${first}") + CallerLogger.d(TAG,"准备下载信息:${first}") DownloadUtils.downLoad( context, first.downloadUrl, @@ -126,16 +134,18 @@ object DownloadManager { object :IDownloadListener{ override fun onStart(url: String) { OchChainLogManager.writechainLogDownload("开始下载","url:${url}") + CallerLogger.d(TAG,"开始下载 url:${url}") first.listener?.onStart(url) } override fun onProgress(url: String, downloaded: Long, total: Long) { first.listener?.onProgress(url,downloaded,total) - OchChainLogManager.writechainLogDownload("下载中","url:${url}_downloaded${downloaded}_total:${total}",upload = false) +// OchChainLogManager.writechainLogDownload("下载中","url:${url}_downloaded${downloaded}_total:${total}",upload = false) } override fun onFinished(url: String, path: String) { OchChainLogManager.writechainLogDownload("下载成功","url:${url}---path:${path}") + CallerLogger.d(TAG,"下载成功-url:${url}---path:${path}") if(waitDownLoadList.size>0) { waitDownLoadList.removeFirst() } @@ -151,9 +161,11 @@ object DownloadManager { override fun onError(url: String, error: String?) { first.listener?.onError(url,error) OchChainLogManager.writechainLogDownload("下载错误","url:${url}---error:${error}") + CallerLogger.d(TAG,"下载成功","下载错误","url:${url}---error:${error}") clearLocalFile(first.downloadDir+File.separator+first.downloadFileName) if(first.downLoadCount>=5){ OchChainLogManager.writechainLogDownload("下载错误5次可终点关注","url:${url}---error:${error}") + CallerLogger.d(TAG,"下载错误5次可终点关注","url:${url}---error:${error}") if(waitDownLoadList.size>0) { waitDownLoadList.removeFirst() } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt index d9a9e0bc82..d31d4a7fa8 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/logchainanalytic/OchChainLogManager.kt @@ -64,8 +64,27 @@ object OchChainLogManager { const val EVENT_KEY_INFO_ERROR = "analytics_event_och_error" + // 算路验证模式 + const val EVENT_KEY_INFO_ROUTING = "analytics_event_och_routing" + + fun writeChainLogRouting(title: String, info: String , upload: Boolean = true) { + writeChainLog(title, info, upload, EVENT_KEY_INFO_ROUTING) + } + const val EVENT_KEY_INFO_VLM = "analytics_event_och_vlm" + const val EVENT_KEY_INFO_BRIDGE = "analytics_event_och_bridge" + + const val EVENT_KEY_INFO_MEDIA = "analytics_event_och_media" + + fun writeChainLogMedia(title: String,info: String) { + writeChainLog(title, info, true, EVENT_KEY_INFO_MEDIA) + } + + fun writeCHainLogBridge(title: String,info: String) { + writeChainLog(title, info, false, EVENT_KEY_INFO_BRIDGE) + } + fun writeChainLogEye(title: String, info: String) { writeChainLog(title, info, true, EVENT_KEY_INFO_CALL_EYE) } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt index 64d83cf5e4..54e85b7265 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManager.kt @@ -8,9 +8,7 @@ import android.os.Build import androidx.annotation.RequiresApi import com.mogo.commons.AbsMogoApplication import com.mogo.commons.voice.AIAssist -import com.mogo.commons.voice.IMogoVoiceCmdCallBack import com.mogo.eagle.core.function.call.telematic.CallerTelematicManager -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager @@ -18,7 +16,8 @@ import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg import com.mogo.och.common.module.utils.DateTimeUtil -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice +import com.mogo.tts.base.IMogoTTSCallback object LanSocketManager : LanSocketManagerJava() { @@ -53,7 +52,6 @@ object LanSocketManager : LanSocketManagerJava() { @JvmStatic fun sendMsgToClient(msg: BaseDPMsg?) { val message = GsonUtils.toJson(msg) - CallerLogger.d(TAG, "sendMsgToClient: $message") OchChainLogManager.writeChainLogLanSocket("发送msg到各个端",message,"send") CallerTelematicManager.sendMsgToAllClients(OchCommonConst.BUSINESS_STRING, message.toByteArray()) } @@ -61,13 +59,11 @@ object LanSocketManager : LanSocketManagerJava() { @JvmStatic fun sendMsgToServer(msg: BaseDPMsg?) { val message = GsonUtils.toJson(msg) - CallerLogger.d(TAG, "sendMsgToServer:$message") OchChainLogManager.writeChainLogLanSocket("发送msg到服务端(司机)",message,"send") CallerTelematicManager.sendMsgToServer(OchCommonConst.BUSINESS_STRING, message.toByteArray()) } override fun onReceivedMsg(type: Int, byteArray: ByteArray) { - CallerLogger.d(TAG, "收到数据:_type:${type},byteArray:${String(byteArray)}"); OchChainLogManager.writeChainLogLanSocket("收到数据","type:${type},byteArray:${String(byteArray)}","receive"); super.onReceivedMsg(type, byteArray) } @@ -90,19 +86,18 @@ object LanSocketManager : LanSocketManagerJava() { .build() mAudioManager.requestAudioFocus(mAudioFocusRequest) //抢占焦点 - VoiceNotice - .speakTTSVoiceWithLevel(msg, AIAssist.LEVEL0, object : IMogoVoiceCmdCallBack { - override fun onSpeakEnd(speakText: String?) { - mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) - } + VoiceNotice.showNotice(msg,AIAssist.LEVEL0,0,object :IMogoTTSCallback{ + override fun onSpeakEnd(speakText: String?) { + mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) + } - override fun onSpeakError(speakText: String?, errorMsg: String?) { - mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) - } + override fun onSpeakError(speakText: String?, errorMsg: String?) { + mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) + } - override fun onSpeakSelectTimeOut(speakText: String?) { - mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) - } - }) + override fun onSpeakSelectTimeOut(speakText: String?) { + mAudioManager.abandonAudioFocusRequest(mAudioFocusRequest) + } + }) } } \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManagerJava.java b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManagerJava.java index 1e416bbe44..96637fb332 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManagerJava.java +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/socket/lan/LanSocketManagerJava.java @@ -9,6 +9,7 @@ import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManage import com.mogo.eagle.core.utilcode.util.GsonUtils; import com.mogo.och.common.module.constant.OchCommonConst; import com.mogo.och.common.module.manager.socket.lan.bean.BaseDPMsg; +import com.mogo.och.common.module.manager.loop.BizLoopManager; import java.util.ArrayList; import java.util.List; @@ -54,24 +55,28 @@ public class LanSocketManagerJava implements IReceivedMsgListener { @Override public void onReceivedMsg(int type, @NonNull byte[] byteArray) { - if (OchCommonConst.BUSINESS_STRING == type) { - try { - BaseDPMsg baseMsg = GsonUtils.fromJson(new String(byteArray), BaseDPMsg.class); - if(baseMsg!=null){ - List iLanMessageListenerJavas = mListeners.get(baseMsg.getType()); - if(iLanMessageListenerJavas!=null){ - for (ILanMessageListener iLanMessageListenerJava : iLanMessageListenerJavas) { - Class target = iLanMessageListenerJava.targetLan(); - BaseDPMsg baseDPMsg = GsonUtils.fromJson(new String(byteArray), target); - iLanMessageListenerJava.onLanMsgReceived(baseDPMsg); + BizLoopManager.INSTANCE.runInIoThread(new Runnable() { + @Override + public void run() { + if (OchCommonConst.BUSINESS_STRING == type) { + try { + BaseDPMsg baseMsg = GsonUtils.fromJson(new String(byteArray), BaseDPMsg.class); + if(baseMsg!=null){ + List iLanMessageListenerJavas = mListeners.get(baseMsg.getType()); + if(iLanMessageListenerJavas!=null){ + for (ILanMessageListener iLanMessageListenerJava : iLanMessageListenerJavas) { + Class target = iLanMessageListenerJava.targetLan(); + BaseDPMsg baseDPMsg = GsonUtils.fromJson(new String(byteArray), target); + iLanMessageListenerJava.onLanMsgReceived(baseDPMsg); + } + } } + } catch (Exception e) { + e.printStackTrace(); } } - }catch (Exception e){ - e.printStackTrace(); - } - - } + } + }); } @Override @@ -89,4 +94,8 @@ public class LanSocketManagerJava implements IReceivedMsgListener { public void onFusionColor(boolean fusionColor) { } + + @Override + public void onB2DemoMode(boolean isB2DemoMode) { + } } diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/KeyboarView.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/KeyboarView.kt new file mode 100644 index 0000000000..624f9734fd --- /dev/null +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/KeyboarView.kt @@ -0,0 +1,124 @@ +package com.mogo.och.common.module.wigets + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.View +import androidx.constraintlayout.widget.ConstraintLayout +import com.mogo.eagle.core.utilcode.kotlin.onClick +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.ClickUtils +import com.mogo.och.common.module.R +import com.mogo.och.common.module.manager.InputManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import kotlinx.android.synthetic.main.common_keyboard_view.view.aciv_close_key +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_0 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_1 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_2 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_3 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_4 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_5 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_6 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_7 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_8 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_9 +import kotlinx.android.synthetic.main.common_keyboard_view.view.actv_key_del + +class KeyboarView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : ConstraintLayout(context, attrs, defStyleAttr), View.OnClickListener { + companion object { + const val TAG = "LoadingMapStatusView" + } + + private val currentText = StringBuilder() + + init { + LayoutInflater.from(context).inflate(R.layout.common_keyboard_view, this, true) + initView() + } + + private fun initView() { + aciv_close_key.onClick { + visibility = GONE + } + actv_key_0.setOnClickListener(this) + actv_key_1.setOnClickListener(this) + actv_key_2.setOnClickListener(this) + actv_key_3.setOnClickListener(this) + actv_key_4.setOnClickListener(this) + actv_key_5.setOnClickListener(this) + actv_key_6.setOnClickListener(this) + actv_key_7.setOnClickListener(this) + actv_key_8.setOnClickListener(this) + actv_key_9.setOnClickListener(this) + actv_key_del.setOnClickListener(this) + } + + override fun onClick(v: View?) { + if (ClickUtils.isClickTooFrequent(this, 100)) { + return + } + when (v?.id) { + R.id.actv_key_0 -> {changeText("0")} + R.id.actv_key_1 -> {changeText("1")} + R.id.actv_key_2 -> {changeText("2")} + R.id.actv_key_3 -> {changeText("3")} + R.id.actv_key_4 -> {changeText("4")} + R.id.actv_key_5 -> {changeText("5")} + R.id.actv_key_6 -> {changeText("6")} + R.id.actv_key_7 -> {changeText("7")} + R.id.actv_key_8 -> {changeText("8")} + R.id.actv_key_9 -> {changeText("9")} + R.id.actv_key_del -> {changeText(null)} + else -> {} + } + } + + fun changeText(info: String?) { + OchChainLogManager.writeChainLogRouting("自定义键盘", "输入${info}--结果:${currentText}") + if (info.isNullOrEmpty()) { + if (currentText.isNotEmpty()) { + currentText.deleteCharAt(currentText.length - 1) + notifyDataChange(currentText.toString()) + } + } else { + currentText.append(info) + notifyDataChange(currentText.toString()) + } + } + + private fun notifyDataChange(info: String) { + InputManager.onTextChange(info) + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(isVisible){ + InputManager.keyViewVisiblityChange(true) + }else{ + InputManager.keyViewVisiblityChange(false) + } + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + CallerLogger.d(TAG, "onAttachedToWindow") + InputManager.inputKey = this + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerLogger.d(TAG, "onDetachedFromWindow") + InputManager.inputKey = null + } + + fun clearInput() { + currentText.clear() + notifyDataChange(currentText.toString()) + } + + +} \ No newline at end of file diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerFragment.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerFragment.kt deleted file mode 100644 index 1f873ab568..0000000000 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/wigets/media/MediaPlayerFragment.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.mogo.och.common.module.wigets.media - -import com.mogo.commons.mvp.MvpFragment -import com.mogo.commons.mvp.Presenter -import com.mogo.eagle.core.function.main.MainMoGoApplication -import com.mogo.eagle.core.utilcode.kotlin.onClick -import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.R -import com.mogo.och.common.module.biz.media.IMediaDispatch -import com.mogo.och.common.module.biz.media.MediaManager -import com.mogo.och.common.module.manager.download.DownloadManager -import com.mogo.och.common.module.manager.loop.BizLoopManager -import com.mogo.och.common.module.utils.RxUtils -import com.shuyu.gsyvideoplayer.GSYVideoManager -import io.reactivex.disposables.Disposable -import kotlinx.android.synthetic.main.fragment_video_player.acb_add_site_video -import kotlinx.android.synthetic.main.fragment_video_player.imageVideoRotationView - -/** - * @author: wangmingjun - * @date: 2022/4/12 - */ -class MediaPlayerFragment : - MvpFragment(), IMediaDispatch { - - companion object { - private val TAG = MediaPlayerFragment::class.java.simpleName - } - - private var arrayListOf = mutableListOf() - - override fun getLayoutId(): Int { - return R.layout.fragment_video_player - } - - override fun createPresenter(): MediaPlayerPresenter { - return MediaPlayerPresenter(this) - } - - override fun getTagName(): String { - return TAG - } - - override fun initViews() { - acb_add_site_video.onClick { - val siteList = mutableListOf() -// siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/defaultPath/b47f361c3de6ea490f3086407fc0376f/a1%E8%B7%AF%E7%BA%BF%281%29.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title")) - siteList.add(MediaItem(MediaItem.PrioritySite,"https://img.zhidaozhixing.com/fileServer/online_car_hailing/1676357557335/3.mp4",MediaItem.MEDIA_TYPE_VIDEO,"","title")) - setHightPriorityMediaItem(siteList) - } - MediaManager.addListener(TAG,this) - MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext) - MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener { - override fun onMediaDataSourceChanged(list: List) { - val isNewData = arrayListOf.isNotEmpty() - CallerLogger.d( - TAG, "onMediaDataSourceChanged:isNewData=$isNewData, list=${GsonUtils.toJson(list)}" - ) - arrayListOf.clear() - arrayListOf.addAll(list) - UiThreadHandler.post { - if (isNewData) { - imageVideoRotationView?.setNewMediaData(arrayListOf) - } else { - imageVideoRotationView?.setMediaData(arrayListOf) - } - } - } - }) - } - - fun setHightPriorityMediaItem(list: MutableList){ - context?.let {context-> - val cacheList = list.filter { - if(!MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl)){ - DownloadManager.downloadVideoFile(it.fileUrl,null) - } - MediaFileCacheManager.isLocalCacheFileExists(context,it.fileUrl) - } - ThreadUtils.runOnUiThread { - imageVideoRotationView.setsetHightPriorityMediaItem(cacheList.toMutableList()) - } - } - - - } - - override fun onPause() { - super.onPause() - imageVideoRotationView.setPause() - } - - override fun onResume() { - super.onResume() - imageVideoRotationView.setResume() - } - - override fun onDestroy() { - MediaDataSourceManager.unInit(TAG) - GSYVideoManager.releaseAllVideos() - MediaManager.removeListener(TAG) - super.onDestroy() - } - - private var fisrtData: Disposable? = null - - override fun diapatchMedia(list: MutableList) { - if(RxUtils.isNotDisposed(fisrtData)){ - return - } - fisrtData = RxUtils.createSubscribe(3_000) {} - setHightPriorityMediaItem(list) - } - - override fun setMediaPause() { - super.setMediaPause() - BizLoopManager.runInMainThread{ - imageVideoRotationView.setPause() - } - } - - override fun setMediaResume() { - super.setMediaResume() - BizLoopManager.runInMainThread { - imageVideoRotationView.setResume() - } - } -} - -class MediaPlayerPresenter(view: MediaPlayerFragment?) : - Presenter(view) \ No newline at end of file diff --git a/OCH/common/common/src/main/res/drawable-nodpi/biz_routing_search_orderid_bg.png b/OCH/common/common/src/main/res/drawable-nodpi/biz_routing_search_orderid_bg.png new file mode 100644 index 0000000000..3230b7a125 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/biz_routing_search_orderid_bg.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_key_close.png b/OCH/common/common/src/main/res/drawable-nodpi/common_key_close.png new file mode 100644 index 0000000000..fefe722be8 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_key_close.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_normal.png b/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_normal.png new file mode 100644 index 0000000000..52ba81284b Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_normal.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_press.png b/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_press.png new file mode 100644 index 0000000000..d8eb58d2a1 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_key_del_press.png differ diff --git a/OCH/common/common/src/main/res/drawable-nodpi/common_key_press.png b/OCH/common/common/src/main/res/drawable-nodpi/common_key_press.png new file mode 100644 index 0000000000..1310300e30 Binary files /dev/null and b/OCH/common/common/src/main/res/drawable-nodpi/common_key_press.png differ diff --git a/OCH/common/common/src/main/res/drawable/common_key_del_selector.xml b/OCH/common/common/src/main/res/drawable/common_key_del_selector.xml new file mode 100644 index 0000000000..bf9fc1893c --- /dev/null +++ b/OCH/common/common/src/main/res/drawable/common_key_del_selector.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/drawable/common_key_normal.xml b/OCH/common/common/src/main/res/drawable/common_key_normal.xml new file mode 100644 index 0000000000..f8352f8655 --- /dev/null +++ b/OCH/common/common/src/main/res/drawable/common_key_normal.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/drawable/common_key_selector.xml b/OCH/common/common/src/main/res/drawable/common_key_selector.xml new file mode 100644 index 0000000000..bc40b0d49c --- /dev/null +++ b/OCH/common/common/src/main/res/drawable/common_key_selector.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/layout/common_keyboard_view.xml b/OCH/common/common/src/main/res/layout/common_keyboard_view.xml new file mode 100644 index 0000000000..53d222b599 --- /dev/null +++ b/OCH/common/common/src/main/res/layout/common_keyboard_view.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/values/colors.xml b/OCH/common/common/src/main/res/values/colors.xml index 80f2ebb605..975ee81bf3 100644 --- a/OCH/common/common/src/main/res/values/colors.xml +++ b/OCH/common/common/src/main/res/values/colors.xml @@ -49,7 +49,9 @@ #3B3D44 #2E323A #ffffffff + #fcffffff #1Affffff + #1fffffff #80000000 #2EACFF #D4D4D4 diff --git a/OCH/common/common/src/main/res/values/ids.xml b/OCH/common/common/src/main/res/values/ids.xml index 3b52790d4e..e9e7393dc5 100644 --- a/OCH/common/common/src/main/res/values/ids.xml +++ b/OCH/common/common/src/main/res/values/ids.xml @@ -2,4 +2,6 @@ + + \ No newline at end of file diff --git a/OCH/common/common/src/main/res/values/strings.xml b/OCH/common/common/src/main/res/values/strings.xml index 73e44a4822..2605487c1d 100644 --- a/OCH/common/common/src/main/res/values/strings.xml +++ b/OCH/common/common/src/main/res/values/strings.xml @@ -41,6 +41,10 @@ 返回 + 滑动出发 + 到站 + 结束 + 请等待升级完成后再选择任务 diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.java b/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.java deleted file mode 100644 index 53ea4f8222..0000000000 --- a/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.java +++ /dev/null @@ -1,214 +0,0 @@ -package com.mogo.och.data.bean; - -import com.google.gson.annotations.SerializedName; -import com.mogo.eagle.core.data.map.MogoLocation; - -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Objects; - -/** - * 单个网约车小巴车站信息 - * - * @author tongchenfei - */ -public class BusStationBean { - private int siteId; - @SerializedName(value = "name",alternate = {"siteName"}) - private String name; - private String nameKr; - private int seq; - private double gcjLon; //高德 - private double gcjLat; //高德 - @SerializedName(value = "lon",alternate = {"wgs84Lon"}) - private double lon; //高精坐标 - @SerializedName(value = "lat",alternate = {"wgs84Lat"}) - private double lat; //高精坐标 - private int drivingStatus;//行驶信息,0初始值;1已经过;2当前站;3未到站 - private boolean leaving;// 为出发false 出发true - private String introduction;// 站点简介 - private boolean isPlayTts; - private int pointType; // 1:途径点 2:禁行点 3:站点 - private List videoList; - - public String getNameKr() { - return nameKr; - } - - public void setNameKr(String nameKr) { - this.nameKr = nameKr; - } - - public int getSiteId() { - return siteId; - } - - public String getName() { - return name; - } - - public int getSeq() { - return seq; - } - - public double getGcjLon() { - return gcjLon; - } - - public double getGcjLat() { - return gcjLat; - } - - public double getLon() { - return lon; - } - - public double getLat() { - return lat; - } - - public int getDrivingStatus() { - return drivingStatus; - } - - public boolean isLeaving() { - return leaving; - } - - public void setSiteId(int siteId) { - this.siteId = siteId; - } - - public void setName(String name) { - this.name = name; - } - - public void setSeq(int seq) { - this.seq = seq; - } - - public void setGcjLon(double gcjLon) { - this.gcjLon = gcjLon; - } - - public void setGcjLat(double gcjLat) { - this.gcjLat = gcjLat; - } - - public void setLon(double lon) { - this.lon = lon; - } - - public void setLat(double lat) { - this.lat = lat; - } - - public void setDrivingStatus(int drivingStatus) { - this.drivingStatus = drivingStatus; - } - - public void setLeaving(boolean leaving) { - this.leaving = leaving; - } - - public String getIntroduction() { - return introduction; - } - - public void setIntroduction(String introduction) { - this.introduction = introduction; - } - - public boolean isPlayTts() { - return isPlayTts; - } - - public void setPlayTts(boolean playTts) { - isPlayTts = playTts; - } - - public List getVideoList() { - return videoList; - } - - public void setVideoList(List videoList) { - this.videoList = videoList; - } - - public int getPointType() { - return pointType; - } - - public void setPointType(int pointType) { - this.pointType = pointType; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - BusStationBean that = (BusStationBean) o; - return siteId == that.siteId - && seq == that.seq - && Double.compare(gcjLon, that.gcjLon) == 0 - && Double.compare(gcjLat, that.gcjLat) == 0 - && Double.compare(lon, that.lon) == 0 - && Double.compare(lat, that.lat) == 0 - && drivingStatus == that.drivingStatus - && leaving == that.leaving && isPlayTts == that.isPlayTts - && pointType == that.pointType - && Objects.equals(name, that.name) - && Objects.equals(nameKr, that.nameKr) - && Objects.equals(introduction, that.introduction) - && Objects.equals(videoList, that.videoList); - } - - @Override - public int hashCode() { - int result = siteId; - result = 31 * result + Objects.hashCode(name); - result = 31 * result + Objects.hashCode(nameKr); - result = 31 * result + seq; - result = 31 * result + Double.hashCode(gcjLon); - result = 31 * result + Double.hashCode(gcjLat); - result = 31 * result + Double.hashCode(lon); - result = 31 * result + Double.hashCode(lat); - result = 31 * result + drivingStatus; - result = 31 * result + Boolean.hashCode(leaving); - result = 31 * result + Objects.hashCode(introduction); - result = 31 * result + Boolean.hashCode(isPlayTts); - result = 31 * result + pointType; - result = 31 * result + Objects.hashCode(videoList); - return result; - } - - @Override - public String toString() { - return "BusStationBean{" + - "siteId=" + siteId + - ", name='" + name + '\'' + - ", nameKr='" + nameKr + '\'' + - ", seq=" + seq + - ", gcjLon=" + gcjLon + - ", gcjLat=" + gcjLat + - ", lon=" + lon + - ", lat=" + lat + - ", drivingStatus=" + drivingStatus + - ", leaving=" + leaving + - ", introduction='" + introduction + '\'' + - ", isPlayTts=" + isPlayTts + - ", pointType=" + pointType + - ", videoList=" + videoList + - '}'; - } - - @NotNull - public MogoLocation toMogoLocation() { - MogoLocation result = new MogoLocation(); - result.setLatitude(gcjLat); - result.setLongitude(gcjLon); - return result; - } -} diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.kt b/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.kt new file mode 100644 index 0000000000..bf1998a74e --- /dev/null +++ b/OCH/common/data/src/main/java/com/mogo/och/data/bean/BusStationBean.kt @@ -0,0 +1,169 @@ +package com.mogo.och.data.bean + +import com.google.gson.annotations.SerializedName +import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters.AutoPilotLonLat +import com.mogo.eagle.core.data.map.MogoLocation +import java.util.Objects + +/** + * 单个网约车小巴车站信息 + * + * @author tongchenfei + */ +open class BusStationBean { + var siteId: Int = 0 + + @JvmField + @SerializedName(value = "name", alternate = ["siteName"]) + var name: String? = null + var nameKr: String? = null + var seq: Int = 0 + @JvmField + var gcjLon: Double = 0.0 //高德 + @JvmField + var gcjLat: Double = 0.0 //高德 + + @SerializedName(value = "lon", alternate = ["wgs84Lon"]) + var lon: Double = 0.0 //高精坐标 + + @SerializedName(value = "lat", alternate = ["wgs84Lat"]) + var lat: Double = 0.0 //高精坐标 + @JvmField + var drivingStatus: Int = 0 //行驶信息,0初始值;1已经过;2当前站;3未到站 + var isLeaving: Boolean = false // 为出发false 出发true + var introduction: String? = null // 站点简介 + var isPlayTts: Boolean = false + var pointType: Int = 0 // 1:途径点 2:禁行点 3:站点 + var videoList: List? = null + + var passPoints: List? = null // 用于算路的经停点 + var blackPoints: List? = null // 用于算路的黑名單點 + + + override fun equals(o: Any?): Boolean { + if (this === o) return true + if (o == null || javaClass != o.javaClass) return false + + val that = o as BusStationBean + return siteId == that.siteId && seq == that.seq && java.lang.Double.compare( + gcjLon, + that.gcjLon + ) == 0 && java.lang.Double.compare( + gcjLat, + that.gcjLat + ) == 0 && java.lang.Double.compare(lon, that.lon) == 0 && java.lang.Double.compare( + lat, + that.lat + ) == 0 && drivingStatus == that.drivingStatus && isLeaving == that.isLeaving && isPlayTts == that.isPlayTts && pointType == that.pointType && name == that.name + && nameKr == that.nameKr + && introduction == that.introduction + && videoList == that.videoList + } + + override fun hashCode(): Int { + var result = siteId + result = 31 * result + Objects.hashCode(name) + result = 31 * result + Objects.hashCode(nameKr) + result = 31 * result + seq + result = 31 * result + java.lang.Double.hashCode(gcjLon) + result = 31 * result + java.lang.Double.hashCode(gcjLat) + result = 31 * result + java.lang.Double.hashCode(lon) + result = 31 * result + java.lang.Double.hashCode(lat) + result = 31 * result + drivingStatus + result = 31 * result + java.lang.Boolean.hashCode(isLeaving) + result = 31 * result + Objects.hashCode(introduction) + result = 31 * result + java.lang.Boolean.hashCode(isPlayTts) + result = 31 * result + pointType + result = 31 * result + Objects.hashCode(videoList) + return result + } + + override fun toString(): String { + return "BusStationBean{" + + "siteId=" + siteId + + ", name='" + name + '\'' + + ", nameKr='" + nameKr + '\'' + + ", seq=" + seq + + ", gcjLon=" + gcjLon + + ", gcjLat=" + gcjLat + + ", lon=" + lon + + ", lat=" + lat + + ", drivingStatus=" + drivingStatus + + ", leaving=" + isLeaving + + ", introduction='" + introduction + '\'' + + ", isPlayTts=" + isPlayTts + + ", pointType=" + pointType + + ", videoList=" + videoList + + '}' + } + + fun toMogoLocation(): MogoLocation { + val result = MogoLocation() + result.latitude = gcjLat + result.longitude = gcjLon + return result + } + + fun getWayBlackLatLons( + ): Pair, MutableList> { + val wayLatLons = mutableListOf() + // 途经点 + if (!passPoints.isNullOrEmpty()) { + for (mogoLatLng in passPoints!!) { + wayLatLons.add( + AutoPilotLonLat( + mogoLatLng.lat, + mogoLatLng.lon, + when (mogoLatLng.pointType) { + 1 -> {//途径点 + false + } + + 2 -> {//禁行点 + false + } + + 3 -> {//站点 + true + } + + else -> { + false + } + } + ) + ) + } + } + val blackLatLons = mutableListOf() + // 黑名单点 + if (!blackPoints.isNullOrEmpty()) { + for (mogoLatLng in blackPoints!!) { + blackLatLons.add( + AutoPilotLonLat( + mogoLatLng.lat, + mogoLatLng.lon, + when (mogoLatLng.pointType) { + 1 -> {//途径点 + false + } + + 2 -> {//禁行点 + false + } + + 3 -> {//站点 + true + } + + else -> { + false + } + } + ) + ) + } + } + return Pair(wayLatLons,blackLatLons) + } +} diff --git a/OCH/common/data/src/main/java/com/mogo/och/data/bean/ContraiInfo.kt b/OCH/common/data/src/main/java/com/mogo/och/data/bean/ContraiInfo.kt index 59ed5743d6..9778e146e9 100644 --- a/OCH/common/data/src/main/java/com/mogo/och/data/bean/ContraiInfo.kt +++ b/OCH/common/data/src/main/java/com/mogo/och/data/bean/ContraiInfo.kt @@ -75,7 +75,7 @@ data class ContraiInfo( blackLatLons.add( AutoPilotLonLat( mogoLatLng.lat, - mogoLatLng.lat, + mogoLatLng.lon, when (mogoLatLng.pointType) { 1 -> {//途径点 false diff --git a/OCH/facade/script/och.gradle b/OCH/facade/script/och.gradle index 7ee8273cea..f4dc67ab14 100644 --- a/OCH/facade/script/och.gradle +++ b/OCH/facade/script/och.gradle @@ -14,15 +14,15 @@ project.dependencies { implementation project.project(':OCH:shuttle:passenger_weaknet') implementation project.project(':OCH:taxi:unmanned-passenger') implementation project.project(':OCH:charter:passenger') - }else if(isBaiLing()){ - implementation project.project(':OCH:offline:driver') - implementation project.project(':OCH:shuttle:driver_weaknet') - implementation project.project(':OCH:shuttle:passenger_weaknet') - implementation project.project(':OCH:charter:driver') - implementation project.project(':OCH:charter:passenger') - implementation project.project(':OCH:sweeper:driver') - implementation project.project(':OCH:taxi:unmanned-driver') - implementation project.project(':OCH:taxi:unmanned-passenger') +// }else if(isBaiLing()){ +// implementation project.project(':OCH:offline:driver') +// implementation project.project(':OCH:shuttle:driver_weaknet') +// implementation project.project(':OCH:shuttle:passenger_weaknet') +// implementation project.project(':OCH:charter:driver') +// implementation project.project(':OCH:charter:passenger') +// implementation project.project(':OCH:sweeper:driver') +// implementation project.project(':OCH:taxi:unmanned-driver') +// implementation project.project(':OCH:taxi:unmanned-passenger') }else { implementation project.project(':OCH:offline:driver') implementation project.project(':OCH:shuttle:driver_weaknet') diff --git a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt index 73c5213017..6aed67ac68 100644 --- a/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt +++ b/OCH/facade/src/main/java/com/mogo/och/facade/route/FacadeDriverProvider.kt @@ -12,6 +12,7 @@ import com.mogo.och.common.module.biz.lansocket.LoginLanDriverSocket import com.mogo.och.common.module.biz.login.EnumLoginStatus import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.biz.offline.OfflineManager +import com.mogo.och.common.module.biz.routing.RoutingManager import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.facade.constant.FacadeConst @@ -43,6 +44,7 @@ class FacadeDriverProvider : FacadeProvider() { CheckVinManager.load() OfflineManager.load() OTAManager.load() + RoutingManager.load() } } diff --git a/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/6.json b/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/6.json index 19a29cd84b..70a886100c 100644 --- a/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/6.json +++ b/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/6.json @@ -2,11 +2,11 @@ "formatVersion": 1, "database": { "version": 6, - "identityHash": "9da3a45e98fe1252081e52f5fbc864be", + "identityHash": "d0c810058283199a6d02e82906b6139a", "entities": [ { "tableName": "contrail_data_table", - "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT)", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT, `source` INTEGER)", "fields": [ { "fieldPath": "id", @@ -20,6 +20,12 @@ "affinity": "INTEGER", "notNull": false }, + { + "fieldPath": "contrailId", + "columnName": "contrail_id", + "affinity": "INTEGER", + "notNull": false + }, { "fieldPath": "csvFileUrl", "columnName": "csv_file_url", @@ -55,13 +61,19 @@ "columnName": "md5", "affinity": "TEXT", "notNull": false + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "INTEGER", + "notNull": false } ], "primaryKey": { + "autoGenerate": true, "columnNames": [ "id" - ], - "autoGenerate": true + ] }, "indices": [ { @@ -133,10 +145,10 @@ } ], "primaryKey": { + "autoGenerate": true, "columnNames": [ "id" - ], - "autoGenerate": true + ] }, "indices": [ { @@ -241,10 +253,10 @@ } ], "primaryKey": { + "autoGenerate": true, "columnNames": [ "id" - ], - "autoGenerate": true + ] }, "indices": [ { @@ -394,10 +406,10 @@ } ], "primaryKey": { + "autoGenerate": true, "columnNames": [ "id" - ], - "autoGenerate": true + ] }, "indices": [], "foreignKeys": [] @@ -450,10 +462,10 @@ } ], "primaryKey": { + "autoGenerate": true, "columnNames": [ "id" - ], - "autoGenerate": true + ] }, "indices": [ { @@ -481,7 +493,7 @@ "views": [], "setupQueries": [ "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", - "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '9da3a45e98fe1252081e52f5fbc864be')" + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'd0c810058283199a6d02e82906b6139a')" ] } } \ No newline at end of file diff --git a/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/7.json b/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/7.json new file mode 100644 index 0000000000..a33ab2dfdf --- /dev/null +++ b/OCH/offline/driver/schemas/com.mogo.och.offline.repository.db.MyDataBase/7.json @@ -0,0 +1,573 @@ +{ + "formatVersion": 1, + "database": { + "version": 7, + "identityHash": "b58ea76c5ce6f4b721e3fcd4d8945496", + "entities": [ + { + "tableName": "contrail_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT, `source` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "contrailId", + "columnName": "contrail_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "csvFileUrl", + "columnName": "csv_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "csvFileMd5", + "columnName": "csv_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileUrl", + "columnName": "txt_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileMd5", + "columnName": "txt_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contrailSaveTime", + "columnName": "contrail_save_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_contrail_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + }, + { + "name": "index_contrail_data_table_md5", + "unique": false, + "columnNames": [ + "md5" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_md5` ON `${TABLE_NAME}` (`md5`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "line_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `line_name` TEXT, `end_station_name` TEXT, `tenant_id` INTEGER, `project_name` TEXT, `line_get_time` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "endStationName", + "columnName": "end_station_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "tenantId", + "columnName": "tenant_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "projectName", + "columnName": "project_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "linegetTime", + "columnName": "line_get_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_line_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_line_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "site_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `site_id` INTEGER, `line_id` INTEGER, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `introduction` TEXT, `is_play_tts` INTEGER, `md5` TEXT, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoListDB", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_site_data_table_site_id", + "unique": false, + "columnNames": [ + "site_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_site_id` ON `${TABLE_NAME}` (`site_id`)" + }, + { + "name": "index_site_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "used_line_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `line_name` TEXT, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `driving_status` INTEGER, `leaving` INTEGER, `arrived_time` INTEGER, `leave_time` INTEGER, `introduction` TEXT, `is_play_tts` INTEGER, `event_save_time` INTEGER NOT NULL, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "drivingStatus", + "columnName": "driving_status", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaving", + "columnName": "leaving", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "arrivedTime", + "columnName": "arrived_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaveTime", + "columnName": "leave_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "videoList", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "temp_task_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `line_id` INTEGER, `start_time` INTEGER NOT NULL, `end_time` INTEGER, `task_get_time` INTEGER NOT NULL, `status` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "startTime", + "columnName": "start_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "endtime", + "columnName": "end_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskgetTime", + "columnName": "task_get_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_temp_task_data_table_task_id", + "unique": false, + "columnNames": [ + "task_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_temp_task_data_table_task_id` ON `${TABLE_NAME}` (`task_id`)" + }, + { + "name": "index_temp_task_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_temp_task_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "point_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `site_id` INTEGER, `md5` TEXT, `seq` INTEGER, `point_type` INTEGER, `longitude` REAL, `latitude` REAL, `sub_seq` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "contrailId", + "columnName": "contrail_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "pointType", + "columnName": "point_type", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "longitude", + "columnName": "longitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "latitude", + "columnName": "latitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "subSeq", + "columnName": "sub_seq", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b58ea76c5ce6f4b721e3fcd4d8945496')" + ] + } +} \ No newline at end of file diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt index 1aee807bba..7e19fb84e9 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/LineModel.kt @@ -33,11 +33,14 @@ import com.mogo.och.offline.model.OrderModel.isGoingToNextStation import com.mogo.och.offline.repository.RepositoryManager import com.mogo.och.offline.repository.db.bean.TaskDataBean import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean +import com.mogo.och.offline.repository.db.repository.PointDb import com.mogo.och.offline.repository.db.repository.SiteDb import com.mogo.och.offline.repository.db.repository.TaskDb import com.mogo.och.offline.repository.db.repository.TaskSiteDb import com.mogo.och.offline.repository.exception.DataException +import com.mogo.och.offline.repository.net.OrderServiceManager import com.mogo.och.offline.repository.net.bean.BindLineListResponse +import com.mogo.och.offline.repository.net.bean.PointResponse import com.mogo.och.offline.util.ShuttleVoiceManager import io.reactivex.Observer import io.reactivex.android.schedulers.AndroidSchedulers @@ -205,6 +208,71 @@ object LineModel { }) } + + + private val waitSysData = mutableSetOf() + private val isRequestingContrainInfo = AtomicBoolean(false) + + + fun synContraiInfo(needUpdatePoint: MutableList) { + + waitSysData.addAll(needUpdatePoint) + if(isRequestingContrainInfo.get()){ + // 正在请求 + OchChainLogManager.writeChainLogNet(false,"同步轨迹","正在同步轨迹请稍等 ") + return + } + isRequestingContrainInfo.set(true) + + val lines = mutableListOf() + waitSysData.forEach { + lines.add(it) + } + OchChainLogManager.writeChainLogNet(false,"同步轨迹","轨迹变更需同步禁行点和途径点 线路:${lines}") + OrderServiceManager.queryPointsByLinesId(lines) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(Schedulers.io()) + ?.subscribe(object : Observer> { + override fun onSubscribe(d: Disposable) { + d(TAG, "queryPointsByLinesId onSubscribe") + } + + override fun onError(e: Throwable) { + d(TAG, "同步轨迹 onError${e.printStackTrace()} 同步轨迹失败 5s种后重试 线路:${lines}") + OchChainLogManager.writeChainLogNet(false,"同步轨迹","同步轨迹失败 5s种后重试 线路:${lines}") + RxUtils.createSubscribe(5_000){ + synContraiInfo(needUpdatePoint) + } + isRequestingContrainInfo.set(false) + } + + override fun onComplete() { + d(TAG, "endTask onComplete") + } + + override fun onNext(data: List) { + try { + PointDb.addOrUpdate(data) + for (datum in data) { + waitSysData.remove(datum.lineId) + } + isRequestingContrainInfo.set(false) + if(waitSysData.isNotEmpty()){ + synContraiInfo(needUpdatePoint) + } + OchChainLogManager.writeChainLogNet(false,"同步轨迹","网络请求重构 轨迹信息${data}") + d(TAG, "同步轨迹网络成功") + }catch (e:Exception){ + OchChainLogManager.writeChainLogDb("同步轨迹","同步轨迹时报错 轨迹信息${data} 错误信息${e.message}") + synContraiInfo(needUpdatePoint) + } + + } + }) + } + + + /** * 开始任务 */ diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt index b885b237c2..e7797e40af 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/model/ThirdDeviceData.kt @@ -82,8 +82,8 @@ object ThirdDeviceData { LedScreenManager.sendTripInfo2Led( LedScreenManager.LEAVE_STATION, lineInfo.lineName, - start.name, - end.name, + start.name?:"", + end.name?:"", LineModel.isLastStation() == true ) } @@ -100,8 +100,8 @@ object ThirdDeviceData { LedScreenManager.sendTripInfo2Led( LedScreenManager.ARRIVE_STATION, lineInfo.lineName, - start.name, - end.name, + start.name?:"", + end.name?:"", LineModel.isLastStation(end) ) } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt index 69052b4d23..ddf5369ca1 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/RepositoryManager.kt @@ -15,10 +15,13 @@ import com.mogo.och.data.bean.SiteIntroduce import com.mogo.och.offline.repository.db.bean.LineDataBean import com.mogo.och.offline.model.LineModel import com.mogo.och.offline.model.LineModel.currentTask +import com.mogo.och.offline.repository.db.bean.ContrailDataBean +import com.mogo.och.offline.repository.db.bean.PointDataBean import com.mogo.och.offline.repository.db.bean.TaskDataBean import com.mogo.och.offline.repository.db.bean.TaskSiteDataBean import com.mogo.och.offline.repository.db.repository.ContraiDb import com.mogo.och.offline.repository.db.repository.LineDb +import com.mogo.och.offline.repository.db.repository.PointDb import com.mogo.och.offline.repository.db.repository.TaskDb import com.mogo.och.offline.repository.db.repository.TaskSiteDb import com.mogo.och.offline.repository.net.OrderServiceManager @@ -80,7 +83,7 @@ object RepositoryManager { TaskSiteDb.deleteErrorData(it) return@flatMap Observable.just(false) } - val db2Beans = db2Beans(runnintTaskAndSites) + val db2Beans = db2Beans(runnintTaskAndSites,currentTask!!.lineId) LineModel.stationList = db2Beans.first LineModel.startStationIndex = db2Beans.second LineModel.stationList?.let { stationlist-> @@ -101,7 +104,7 @@ object RepositoryManager { OchChainLogManager.writeChainLogAutopilot("轨迹错误",this.toString()) CallerLogger.d(TAG,"轨迹错误,$this") } - LineManager.setContraiInfo(ContraiInfo(lineId!!,csvFileUrl!!,csvFileMd5!!,txtFileUrl!!,txtFileMd5!!,contrailSaveTime!!)) + LineManager.setContraiInfo(ContraiInfo(lineId!!,csvFileUrl!!,csvFileMd5!!,txtFileUrl!!,txtFileMd5!!,contrailSaveTime!!,source = source?: ContrailDataBean.SOURCETYPEROUTING)) } } return@flatMap Observable.just(true) @@ -186,7 +189,7 @@ object RepositoryManager { } - fun db2Beans(runnintTaskAndSites: List?): Pair,Int> { + fun db2Beans(runnintTaskAndSites: List?, lineId: Long?): Pair,Int> { val result = mutableListOf() var temp: BusStationBean? = null var currentStationIndex = -1 @@ -195,6 +198,7 @@ object RepositoryManager { LineManager.setLineInfo(lineInfo) return Pair(result,currentStationIndex) } + val points = PointDb.queryPointByLineId(lineId) runnintTaskAndSites.forEachIndexed { index, taskAndsite -> temp = BusStationBean() temp?.drivingStatus = (taskAndsite.drivingStatus ?: 0) @@ -209,6 +213,26 @@ object RepositoryManager { temp?.isPlayTts = java.lang.Boolean.TRUE == taskAndsite.isPlayTts temp?.seq = (taskAndsite.seq ?: 0) temp?.siteId = if (taskAndsite.siteId == null) 0 else taskAndsite.siteId!!.toInt() + points?.let { + val sitePoint = it.filter { + it.siteId?.toInt() == temp?.siteId + } + val tempPassPoints = mutableListOf() + val tempblackPoints = mutableListOf() + sitePoint.forEach { point-> + when (point.pointType) { + PointDataBean.pointTypePass -> { + tempPassPoints.add(point.toStation()) + } + PointDataBean.pointTypeBlack -> { + tempblackPoints.add(point.toStation()) + } + else -> {} + } + } + temp?.passPoints = tempPassPoints + temp?.blackPoints = tempblackPoints + } if(!taskAndsite.videoList.isNullOrEmpty()){ try { val list = GsonUtils.fromJson>( diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt index c99ef83a5f..040f028c3f 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/MyDataBase.kt @@ -3,6 +3,8 @@ package com.mogo.och.offline.repository.db import androidx.room.Database import androidx.room.Room import androidx.room.RoomDatabase +import androidx.room.migration.Migration +import androidx.sqlite.db.SupportSQLiteDatabase import androidx.sqlite.db.SupportSQLiteOpenHelper import com.mogo.commons.AbsMogoApplication import com.mogo.commons.env.Project @@ -18,12 +20,14 @@ import com.mogo.och.offline.repository.db.dao.LineDataDao import com.mogo.och.offline.repository.db.dao.SiteDataDao import com.mogo.och.offline.repository.db.dao.TaskDataDao import com.mogo.och.offline.repository.db.dao.TaskSiteDataDao +import com.mogo.och.offline.repository.db.bean.PointDataBean +import com.mogo.och.offline.repository.db.dao.PointDataDao //注解Database告诉系统这是Room数据库对象 //entities指定该数据库有哪些表,多张表就逗号分隔 //version指定数据库版本号,升级时需要用到 //数据库继承自RoomDatabase -@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskSiteDataBean::class, TaskDataBean::class], version = 6) +@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskSiteDataBean::class, TaskDataBean::class,PointDataBean::class], version = 7) abstract class MyDataBase : RoomDatabase() { private val dbRepositorys = mutableListOf() @@ -43,12 +47,20 @@ abstract class MyDataBase : RoomDatabase() { abstract val contrailDataDao: ContrailDataDao? abstract val lineDataDao: LineDataDao? abstract val siteDataDao: SiteDataDao? - + abstract val pointDataDao: PointDataDao? abstract val taskDataDao: TaskDataDao? abstract val taskSiteDataDao: TaskSiteDataDao? companion object { + private val MIGRATION_6_7 = object : Migration(6, 7) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `${PointDataBean.tableName}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `site_id` INTEGER, `md5` TEXT, `seq` INTEGER, `point_type` INTEGER, `longitude` REAL, `latitude` REAL, `sub_seq` INTEGER)") + database.execSQL("ALTER TABLE ${ContrailDataBean.tableName} ADD COLUMN contrail_id INTEGER") + database.execSQL("ALTER TABLE ${ContrailDataBean.tableName} ADD COLUMN source INTEGER") + } + } + fun getDBName():MyDataBase{ val roomName = when (ProjectUtils.getProjectType()) { Project.SAAS -> { @@ -69,6 +81,7 @@ abstract class MyDataBase : RoomDatabase() { MyDataBase::class.java, dbFile.path ) + .addMigrations(MIGRATION_6_7) .fallbackToDestructiveMigration() .build() } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/ContrailDataBean.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/ContrailDataBean.kt index 7abc718bdf..293966dee4 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/ContrailDataBean.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/ContrailDataBean.kt @@ -18,6 +18,13 @@ data class ContrailDataBean( @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER, index = true) var lineId: Long? = null, + /** + * 轨迹id + */ + @ColumnInfo(name = "contrail_id", typeAffinity = ColumnInfo.INTEGER) + var contrailId: Long? = null, + + /** * csv格式的轨迹文件 */ @@ -54,9 +61,18 @@ data class ContrailDataBean( @ColumnInfo(name = "md5", typeAffinity = ColumnInfo.TEXT, index = true) var md5: String? = null, + /** + * 轨迹id + */ + @ColumnInfo(name = "source", typeAffinity = ColumnInfo.INTEGER) + var source: Int? = null, + + + ) { companion object { const val tableName: String = "contrail_data_table" + const val SOURCETYPEROUTING = 2 } override fun toString(): String { diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/PointDataBean.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/PointDataBean.kt new file mode 100644 index 0000000000..6eefebb25b --- /dev/null +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/bean/PointDataBean.kt @@ -0,0 +1,87 @@ +package com.mogo.och.offline.repository.db.bean + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.mogo.och.data.bean.BusStationBean + +@Entity(tableName = PointDataBean.tableName) +data class PointDataBean( + + @PrimaryKey(autoGenerate = true) var id: Int = 0, + + /** + * 点所属线路Id + */ + @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER) + var lineId: Long? = null, + + /** + * 轨迹id + */ + @ColumnInfo(name = "contrail_id", typeAffinity = ColumnInfo.INTEGER) + var contrailId: Long? = null, + + /** + * A--B--C--D + * A--B 的途径点 siteId = B.id + * B--C 的途径点 siteId = C.id + * C--D 的途径点 siteId = D.id + */ + @ColumnInfo(name = "site_id", typeAffinity = ColumnInfo.INTEGER) + var siteId: Long? = null, + + /** + * ContrailDataBean 表格中的md5值 + */ + @ColumnInfo(name = "md5", typeAffinity = ColumnInfo.TEXT) + var md5: String? = null, + + + + /** + * 排队组 + */ + @ColumnInfo(name = "seq", typeAffinity = ColumnInfo.INTEGER) + var seq: Int? = null, + + /** + * 点的类型 + */ + @ColumnInfo(name = "point_type", typeAffinity = ColumnInfo.INTEGER) + var pointType: Int? = null, + + /** + * 高精坐标 + */ + @ColumnInfo(name = "longitude", typeAffinity = ColumnInfo.REAL) + var longitude: Double? = null, + + /** + * 高精坐标 + */ + @ColumnInfo(name = "latitude", typeAffinity = ColumnInfo.REAL) + var latitude: Double? = null, + + /** + * 组内排序 + */ + @ColumnInfo(name = "sub_seq", typeAffinity = ColumnInfo.INTEGER) + var subSeq: Int? = null, + +) { + fun toStation(): BusStationBean { + val temp = BusStationBean() + temp.lat = latitude?:0.0 + temp.lon = longitude?:0.0 + temp.pointType = pointType?:pointTypePass + temp.isLeaving = true + return temp + } + + companion object { + const val tableName = "point_data_table" + const val pointTypePass = 1 + const val pointTypeBlack = 2 + } +} diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/ContrailDataDao.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/ContrailDataDao.kt index 6a9fbec36a..2ebe197990 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/ContrailDataDao.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/ContrailDataDao.kt @@ -39,6 +39,9 @@ interface ContrailDataDao { } } + @Query("UPDATE ${ContrailDataBean.tableName} SET contrail_id = :contrailId ,source = :source WHERE line_id = :lineId") + fun updateIdAndSource(contrailId: Long, source: Int, lineId: Long) + } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/PointDataDao.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/PointDataDao.kt new file mode 100644 index 0000000000..4b840739a0 --- /dev/null +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/dao/PointDataDao.kt @@ -0,0 +1,39 @@ +package com.mogo.och.offline.repository.db.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import com.mogo.och.offline.repository.db.bean.PointDataBean + +@Dao +interface PointDataDao { + //插入数据 + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg lineDataBean: PointDataBean) + + //插入数据 + @Transaction + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertTra(vararg lineDataBean: PointDataBean) + + + //删除数据 + @Delete + fun delete(vararg lineDataBean: PointDataBean) + + + // 线路删除时同步删除所属轨迹信息 + @Transaction + @Query("DELETE FROM ${PointDataBean.tableName} WHERE line_id in (:lineId)") + fun deleteByLineIdTra(lineId: List) + + @Transaction + @Query("DELETE FROM ${PointDataBean.tableName} WHERE line_id in (:lineId)") + fun deleteByLineId(lineId: List) + + @Query("SELECT * FROM ${PointDataBean.tableName} WHERE line_id = :lineId") + fun queryPointByLineId(lineId: Long) : List? +} diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt index 41c14ce122..5db71de3bc 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/ContraiDb.kt @@ -2,6 +2,7 @@ package com.mogo.och.offline.repository.db.repository import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.offline.model.LineModel import com.mogo.och.offline.repository.db.bean.ContrailDataBean import com.mogo.och.offline.repository.db.IDbRepository import com.mogo.och.offline.repository.db.MyDataBase @@ -26,6 +27,7 @@ object ContraiDb : IDbRepository { val runnable = Runnable { // 校验数据个数 contrailDao?.let { contrailDao-> + val needUpdatePoint = mutableListOf() contrailDatalist.forEach { val md5Source = it.toString() val md5Hex = DigestUtils.md5Hex(md5Source) @@ -33,6 +35,7 @@ object ContraiDb : IDbRepository { if(queryContrailByMd5.isNullOrEmpty()){// 没有值或者值有变化 val needUpdate = contrailDao.queryContrailByLineIdOne(it.lineId!!) it.md5 = md5Hex + needUpdatePoint.add(it.lineId!!) if(needUpdate!=null){// 更新 it.id = needUpdate.id contrailDao.update(it.csvFileUrl?:"",it.csvFileMd5?:"",it.txtFileUrl?:"",it.txtFileMd5?:"",System.currentTimeMillis(),md5Hex,needUpdate.id) @@ -41,7 +44,12 @@ object ContraiDb : IDbRepository { } } } + if(needUpdatePoint.isNotEmpty()){ + LineModel.synContraiInfo(needUpdatePoint) + } } + + } BizLoopManager.runInIoThread(runnable) } @@ -74,4 +82,11 @@ object ContraiDb : IDbRepository { ) addOrUpdate(mutableListOf(runningLine)) } + + fun upDateIdAndsource(contrailId: Long?, source: Int?, lineId: Long?) { + if(contrailId!=null&&source!=null&&lineId!=null){ + contrailDao?.updateIdAndSource(contrailId,source,lineId) + } + } + } \ No newline at end of file diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/PointDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/PointDb.kt new file mode 100644 index 0000000000..acd0c03d34 --- /dev/null +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/PointDb.kt @@ -0,0 +1,111 @@ +package com.mogo.och.offline.repository.db.repository + +import com.mogo.och.offline.repository.db.IDbRepository +import com.mogo.och.offline.repository.db.MyDataBase +import com.mogo.och.offline.repository.db.bean.ContrailDataBean +import com.mogo.och.offline.repository.db.bean.PointDataBean +import com.mogo.och.offline.repository.db.dao.PointDataDao +import com.mogo.och.offline.repository.net.bean.PointResponse + +object PointDb: IDbRepository { + + private var pointDao: PointDataDao?=null + get() { + if(field==null){ + field = MyDataBase.instance?.pointDataDao + register() + } + return field + } + + + override fun release() { + pointDao = null + } + + fun queryPointByLineId(lineId: Long?): List? { + lineId?.let { + return pointDao?.queryPointByLineId(lineId) + } + return null + } + + fun addOrUpdate(serverDataList:List) { + val contaiBeans = mutableListOf() + val needDelete = mutableListOf() + val needUpdateLineInfos = mutableListOf() + + serverDataList.forEach { contrailInfo -> + val lineId = contrailInfo.lineId + val siteList = SiteDb.querySiteByLineId(lineId) + val contraiBean = ContraiDb.queryAutopilotInfoByLineid(lineId) + + contraiBean?.let { + contraiBean.source = contrailInfo.source + contraiBean.contrailId = contrailInfo.contrailId + needUpdateLineInfos.add(contraiBean) + } + + val segmentPointList = contrailInfo.segmentPointList + needDelete.add(lineId) + segmentPointList.forEachIndexed { index, segmentPoint -> + val siteIndex = segmentPoint.segment + siteList?.let { siteListTemp-> + siteIndex?.let {siteIndexTemp-> + // 途径点和禁行点所有站点 + val siteDataBean = siteListTemp[siteIndexTemp] + segmentPoint.pointList?.forEachIndexed { index, point -> + val pointTemp = PointDataBean() + pointTemp.lineId = lineId + pointTemp.contrailId = contrailInfo.contrailId + pointTemp.siteId = siteDataBean.siteId + pointTemp.md5 = contraiBean?.md5?:"" + pointTemp.seq = siteIndex + pointTemp.pointType = PointDataBean.pointTypePass + pointTemp.longitude = point.longitude + pointTemp.latitude = point.latitude + pointTemp.subSeq = index + contaiBeans.add(pointTemp) + } + segmentPoint.blackList?.forEachIndexed { index, black -> + val pointTemp = PointDataBean() + pointTemp.lineId = lineId + pointTemp.contrailId = contrailInfo.contrailId + pointTemp.siteId = siteDataBean.siteId + pointTemp.md5 = contraiBean?.md5?:"" + pointTemp.seq = siteIndex + pointTemp.pointType = PointDataBean.pointTypeBlack + pointTemp.longitude = black.longitude + pointTemp.latitude = black.latitude + pointTemp.subSeq = index + contaiBeans.add(pointTemp) + } + } + } + } + if(needUpdateLineInfos.size<100){ + needUpdateLineInfos.forEach { + ContraiDb.upDateIdAndsource(it.contrailId,it.source,it.lineId) + } + }else{ + MyDataBase.instance?.runInTransaction{ + needUpdateLineInfos.forEach { + ContraiDb.upDateIdAndsource(it.contrailId,it.source,it.lineId) + } + } + } + if(needDelete.size<100) { + pointDao?.deleteByLineId(needDelete) + }else{ + pointDao?.deleteByLineIdTra(needDelete) + } + if(contaiBeans.size<100) { + pointDao?.insert(*contaiBeans.toTypedArray()) + }else{ + pointDao?.insertTra(*contaiBeans.toTypedArray()) + } + } + } + + +} \ No newline at end of file diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt index 4ba3ec51d4..3bc8df472f 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/db/repository/SiteDb.kt @@ -3,7 +3,6 @@ package com.mogo.och.offline.repository.db.repository import androidx.room.Transaction import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.TAG import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.offline.repository.db.bean.SiteDataBean @@ -13,6 +12,8 @@ import com.mogo.och.offline.repository.db.dao.SiteDataDao object SiteDb: IDbRepository { + private val TAG = "SiteDb" + private var siteDataDao: SiteDataDao? = null get() { if(field==null){ diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java index 536004ca4e..d9f903df86 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/IBascApiService.java @@ -1,9 +1,14 @@ package com.mogo.och.offline.repository.net; import com.mogo.och.offline.repository.net.bean.BindLineListResponse; +import com.mogo.och.offline.repository.net.bean.PointsResponse; +import com.mogo.och.offline.repository.net.bean.QueryPointRequest; import io.reactivex.Observable; +import retrofit2.http.Body; import retrofit2.http.GET; import retrofit2.http.Header; +import retrofit2.http.Headers; +import retrofit2.http.POST; import retrofit2.http.Query; /** @@ -28,5 +33,9 @@ public interface IBascApiService { @GET("/och-shuttle-cabin/api/business/v1/driver/queryBindLineListBySn") Observable daliQueryBindLineListBySn(@Header ("appId") String appId, @Header("ticket") String ticket, @Query("sn") String sn); + @Headers( {"Content-Type:application/json;charset=UTF-8"} ) + @POST( "/och-contrail/contrail/queryCabinContrailByLines" ) + Observable queryCabinContrailByLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Body QueryPointRequest request); + } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt index e23d134362..d1fc709fbc 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/OrderServiceManager.kt @@ -5,11 +5,17 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.network.MoGoRetrofitFactory import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.common.module.constant.OchCommonConst +import com.mogo.och.common.module.network.OchCommonNet import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.offline.repository.net.bean.BindLineListResponse +import com.mogo.och.offline.repository.net.bean.PointResponse +import com.mogo.och.offline.repository.net.bean.QueryPointRequest +import com.zhidao.thirdlogin.LoginManager +import io.reactivex.Observable /** * @author: wangmingjun @@ -55,4 +61,23 @@ object OrderServiceManager { ) } } + + fun queryPointsByLinesId( + data: MutableList + ): Observable>? { + + val request = QueryPointRequest(LoginStatusManager.getOchBizInfo()?.businessType ?: 11, data) + return mService.queryCabinContrailByLines( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + request, + ) + .transformIoTry() + .flatMap(OchCommonNet("queryPointsByLinesId",false)) + .flatMap { + Observable.just(it.data?: mutableListOf()) + } + } + + } \ No newline at end of file diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/PointResponse.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/PointResponse.kt new file mode 100644 index 0000000000..2ea504184d --- /dev/null +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/PointResponse.kt @@ -0,0 +1,42 @@ +package com.mogo.och.offline.repository.net.bean + +import com.mogo.eagle.core.data.BaseData + + +class PointsResponse : BaseData() { + var data: MutableList?=null +} + +data class Point( + val latitude: Double, + val longitude: Double, + val pointType: Int, + val segment: Int +) + +data class Black( + val latitude: Double, + val longitude: Double, + val pointType: Int, + val segment: Int +) + +data class PointResponse( + val businessType: Int, + val contrailId: Long, + val contrailSaveTime: Long, + val csvFileMd5: String, + val csvFileUrl: String, + val lineId: Long, + val lineName: String, + val segmentPointList: List, + val source: Int, + val txtFileMd5: String, + val txtFileUrl: String +) + +data class SegmentPoint( + val blackList: List, + val pointList: List, + val segment: Int? +) \ No newline at end of file diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/QueryPointRequest.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/QueryPointRequest.kt new file mode 100644 index 0000000000..6cbf3f2b51 --- /dev/null +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/repository/net/bean/QueryPointRequest.kt @@ -0,0 +1,10 @@ +package com.mogo.och.offline.repository.net.bean + +/** + * 通过lineid 获取轨迹id + */ +data class QueryPointRequest(val businessType: Int,val lineIds:MutableList){ + companion object{ + + } +} diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt index 95a6584fa2..1f6f5783f1 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/ui/taskrunning/TaskRunningView.kt @@ -96,6 +96,10 @@ class TaskRunningView : ConstraintLayout, TaskRunningModel.SwtichLineViewCallbac }) closeLineConfirmDialog.show() } + actv_running_task_time.onClick { + val initAutopilotControlParameters = LineManager.initAutopilotControlParameters() + CallerLogger.d(TAG,"启动自驾的参数:${initAutopilotControlParameters}") + } } override fun onAttachedToWindow() { diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt index 0169e1ca5b..48d7553b40 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/OffLineTrajectoryManager.kt @@ -87,7 +87,7 @@ object OffLineTrajectoryManager : ITrajectoryListListener { "下发轨迹报错:没有轨迹或线路信息 contraiInfo:${LineManager.contraiInfo} lineInfos:${LineManager.lineInfos}" ) } else { - mAutopilotControlParameters = LineManager.initAutopilotControlParameters() + mAutopilotControlParameters = LineManager.initAutopilotControlParametersFromContrai() } } diff --git a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt index cb0466974e..30d2e4645f 100644 --- a/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt +++ b/OCH/offline/driver/src/main/java/com/mogo/och/offline/util/ShuttleVoiceManager.kt @@ -7,7 +7,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg import com.mogo.och.common.module.utils.ResourcesUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.offline.R import com.mogo.skin.utils.SkinResources import com.mogo.tts.base.LangTtsEntity diff --git a/OCH/offline/driver/src/main/res/values/strings.xml b/OCH/offline/driver/src/main/res/values/strings.xml index c0cfeb72b5..eb08f5e16d 100644 --- a/OCH/offline/driver/src/main/res/values/strings.xml +++ b/OCH/offline/driver/src/main/res/values/strings.xml @@ -19,7 +19,7 @@ 您确认要结束任务吗? - 蘑菇小巴正在进站 + 欢迎乘坐蘑菇小巴 蘑菇小巴出发咯 当前网络良好(%1$s) diff --git a/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/7.json b/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/7.json new file mode 100644 index 0000000000..39d39f6f62 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/schemas/com.mogo.och.weaknet.repository.db.MyDataBase/7.json @@ -0,0 +1,861 @@ +{ + "formatVersion": 1, + "database": { + "version": 7, + "identityHash": "74e6f2a37be355d3c235b4a0b837cf5d", + "entities": [ + { + "tableName": "contrail_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `csv_file_url` TEXT, `csv_file_md5` TEXT, `txt_file_url` TEXT, `txt_file_md5` TEXT, `contrail_save_time` INTEGER, `md5` TEXT, `source` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "contrailId", + "columnName": "contrail_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "csvFileUrl", + "columnName": "csv_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "csvFileMd5", + "columnName": "csv_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileUrl", + "columnName": "txt_file_url", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "txtFileMd5", + "columnName": "txt_file_md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "contrailSaveTime", + "columnName": "contrail_save_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_contrail_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + }, + { + "name": "index_contrail_data_table_md5", + "unique": false, + "columnNames": [ + "md5" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_contrail_data_table_md5` ON `${TABLE_NAME}` (`md5`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "line_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `line_name` TEXT, `end_station_name` TEXT, `line_get_time` INTEGER NOT NULL)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "endStationName", + "columnName": "end_station_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "linegetTime", + "columnName": "line_get_time", + "affinity": "INTEGER", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_line_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_line_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "site_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `site_id` INTEGER, `line_id` INTEGER, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `introduction` TEXT, `is_play_tts` INTEGER, `md5` TEXT, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "videoListDB", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_site_data_table_site_id", + "unique": false, + "columnNames": [ + "site_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_site_id` ON `${TABLE_NAME}` (`site_id`)" + }, + { + "name": "index_site_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_site_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "task_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `shifts_id` INTEGER, `task_id` INTEGER, `line_id` INTEGER, `task_data` INTEGER, `task_start_time` INTEGER, `start_time` INTEGER, `end_time` INTEGER, `task_get_time` INTEGER NOT NULL, `status` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "shiftsId", + "columnName": "shifts_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskDate", + "columnName": "task_data", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskStartTime", + "columnName": "task_start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "startTime", + "columnName": "start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "endtime", + "columnName": "end_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskgetTime", + "columnName": "task_get_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "status", + "columnName": "status", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_task_data_table_task_id", + "unique": false, + "columnNames": [ + "task_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_task_data_table_task_id` ON `${TABLE_NAME}` (`task_id`)" + }, + { + "name": "index_task_data_table_line_id", + "unique": false, + "columnNames": [ + "line_id" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_task_data_table_line_id` ON `${TABLE_NAME}` (`line_id`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "used_task_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `task_id` INTEGER, `shifts_id` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `line_name` TEXT, `name` TEXT, `name_kr` TEXT, `seq` INTEGER, `gcj_lon` REAL, `gcj_lat` REAL, `lon` REAL, `lat` REAL, `driving_status` INTEGER, `leaving` INTEGER, `arrived_time` INTEGER, `leave_time` INTEGER, `introduction` TEXT, `is_play_tts` INTEGER, `event_save_time` INTEGER NOT NULL, `videoList` TEXT)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "shiftsId", + "columnName": "shifts_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "line_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "nameKr", + "columnName": "name_kr", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "gcjLon", + "columnName": "gcj_lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "gcjLat", + "columnName": "gcj_lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lon", + "columnName": "lon", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "lat", + "columnName": "lat", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "drivingStatus", + "columnName": "driving_status", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaving", + "columnName": "leaving", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "arrivedTime", + "columnName": "arrived_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "leaveTime", + "columnName": "leave_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "introduction", + "columnName": "introduction", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "isPlayTts", + "columnName": "is_play_tts", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "videoList", + "columnName": "videoList", + "affinity": "TEXT", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "event_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `event_type` TEXT, `shifts_id` INTEGER, `lineId` INTEGER, `task_date` INTEGER, `lineName` TEXT, `task_id` INTEGER, `task_start_time` INTEGER, `business_time` INTEGER, `write_version` INTEGER, `site_id` INTEGER, `seq` INTEGER, `driver_id` INTEGER, `event_save_time` INTEGER NOT NULL, `update_status` INTEGER NOT NULL, `msg_id` TEXT, `update_time` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "eventType", + "columnName": "event_type", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "shiftsId", + "columnName": "shifts_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "lineId", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskDate", + "columnName": "task_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineName", + "columnName": "lineName", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskStartTime", + "columnName": "task_start_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "businessTime", + "columnName": "business_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "writeVersion", + "columnName": "write_version", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "driverId", + "columnName": "driver_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updateStatus", + "columnName": "update_status", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "msgId", + "columnName": "msg_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "upDateTime", + "columnName": "update_time", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_event_data_table_event_save_time", + "unique": false, + "columnNames": [ + "event_save_time" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_event_data_table_event_save_time` ON `${TABLE_NAME}` (`event_save_time`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "writeoff_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `msg_id` TEXT, `expiry_time` INTEGER, `booking_time` INTEGER, `type` INTEGER, `shifts_id` INTEGER, `task_id` INTEGER, `task_date` INTEGER, `line_id` INTEGER, `site_id` INTEGER, `driver_id` INTEGER, `available_times` INTEGER, `order_no` TEXT, `uid` TEXT, `seq` TEXT, `business_time` INTEGER, `tick_size` INTEGER, `tick_name` TEXT, `event_save_time` INTEGER NOT NULL, `update_status` INTEGER NOT NULL, `update_time` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "msgId", + "columnName": "msg_id", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "expiryTime", + "columnName": "expiry_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "bookingTime", + "columnName": "booking_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "shiftsId", + "columnName": "shifts_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskId", + "columnName": "task_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "taskDate", + "columnName": "task_date", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "driverId", + "columnName": "driver_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "availableTimes", + "columnName": "available_times", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "orderNo", + "columnName": "order_no", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "phone", + "columnName": "seq", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "businessTime", + "columnName": "business_time", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticketSize", + "columnName": "tick_size", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "ticketName", + "columnName": "tick_name", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "eventSaveTime", + "columnName": "event_save_time", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "updateStatus", + "columnName": "update_status", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "upDateTime", + "columnName": "update_time", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [ + { + "name": "index_writeoff_data_table_event_save_time", + "unique": false, + "columnNames": [ + "event_save_time" + ], + "orders": [], + "createSql": "CREATE INDEX IF NOT EXISTS `index_writeoff_data_table_event_save_time` ON `${TABLE_NAME}` (`event_save_time`)" + } + ], + "foreignKeys": [] + }, + { + "tableName": "point_data_table", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `site_id` INTEGER, `md5` TEXT, `seq` INTEGER, `point_type` INTEGER, `longitude` REAL, `latitude` REAL, `sub_seq` INTEGER)", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "lineId", + "columnName": "line_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "contrailId", + "columnName": "contrail_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "siteId", + "columnName": "site_id", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "md5", + "columnName": "md5", + "affinity": "TEXT", + "notNull": false + }, + { + "fieldPath": "seq", + "columnName": "seq", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "pointType", + "columnName": "point_type", + "affinity": "INTEGER", + "notNull": false + }, + { + "fieldPath": "longitude", + "columnName": "longitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "latitude", + "columnName": "latitude", + "affinity": "REAL", + "notNull": false + }, + { + "fieldPath": "subSeq", + "columnName": "sub_seq", + "affinity": "INTEGER", + "notNull": false + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '74e6f2a37be355d3c235b4a0b837cf5d')" + ] + } +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt index e6446e10db..8f62cb2fca 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ShuttleDriverProvider.kt @@ -22,6 +22,7 @@ import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.repository.RepositoryManager import com.mogo.och.weaknet.repository.db.repository.WriteOffDb import com.mogo.och.weaknet.ui.bizswitch.SwitchBizView +import com.mogo.och.weaknet.ui.modeswitch.TopSwitchBizView import com.mogo.och.weaknet.ui.qr.QrOpenView import com.mogo.och.weaknet.util.BusAnalyticsManager import com.mogo.och.weaknet.util.BusTrajectoryManager @@ -73,7 +74,7 @@ class ShuttleDriverProvider : CommonServiceImpl() { override fun createOchBusinessView(context: Context?): View? { d(TAG, "createOchBusinessView") return context?.let { - SwitchBizView(it) + TopSwitchBizView(it) } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/QueryPointRequest.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/QueryPointRequest.kt new file mode 100644 index 0000000000..d4be5507a3 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/request/QueryPointRequest.kt @@ -0,0 +1,10 @@ +package com.mogo.och.weaknet.bean.request + +/** + * 通过lineid 获取轨迹id + */ +data class QueryPointRequest(val businessType: Int,val lineIds:MutableList){ + companion object{ + + } +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/BusRoutesResponse.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/BusRoutesResponse.kt index d589026918..a4caacd8fb 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/BusRoutesResponse.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/BusRoutesResponse.kt @@ -9,7 +9,9 @@ import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.LineInfo import com.mogo.och.data.bean.SiteIntroduce import com.mogo.och.weaknet.model.LineModel +import com.mogo.och.weaknet.repository.db.bean.PointDataBean import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean +import com.mogo.och.weaknet.repository.db.repository.PointDb import com.mogo.och.weaknet.repository.db.repository.TaskSiteDb import java.lang.Boolean import kotlin.String @@ -30,7 +32,7 @@ class BusRoutesResponse : BaseData() { companion object { - fun db2Beans(runnintTaskAndSites: List?): Pair,Int> { + fun db2Beans(runnintTaskAndSites: List?, lineId: Long?): Pair,Int> { val result = mutableListOf() var temp: BusStationBean? = null var currentStationIndex = -1 @@ -39,6 +41,7 @@ class BusRoutesResponse : BaseData() { LineManager.setLineInfo(lineInfo) return Pair(result,currentStationIndex) } + val points = PointDb.queryPointByLineId(lineId) runnintTaskAndSites.forEachIndexed { index, taskAndsite -> temp = BusStationBean() temp?.drivingStatus = (taskAndsite.drivingStatus ?: 0) @@ -53,6 +56,30 @@ class BusRoutesResponse : BaseData() { temp?.isPlayTts = Boolean.TRUE == taskAndsite.isPlayTts temp?.seq = (taskAndsite.seq ?: 0) temp?.siteId = if (taskAndsite.siteId == null) 0 else taskAndsite.siteId!!.toInt() + points?.let { pointList-> + val sitePoint = pointList.filter { + it.siteId?.toInt() == temp?.siteId + }.sortedWith( + compareBy { it.subSeq } +// .thenBy {it.subSeq } + ) + val tempPassPoints = mutableListOf() + val tempblackPoints = mutableListOf() + sitePoint.forEach { point-> + when (point.pointType) { + PointDataBean.pointTypePass -> { + tempPassPoints.add(point.toStation()) + } + PointDataBean.pointTypeBlack -> { + tempblackPoints.add(point.toStation()) + } + else -> {} + } + } + temp?.passPoints = tempPassPoints + temp?.blackPoints = tempblackPoints + } + if(!taskAndsite.videoList.isNullOrEmpty()){ try { val list = GsonUtils.fromJson>( diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/PointResponse.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/PointResponse.kt new file mode 100644 index 0000000000..2f2a71cee6 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/bean/response/PointResponse.kt @@ -0,0 +1,42 @@ +package com.mogo.och.weaknet.bean.response + +import com.mogo.eagle.core.data.BaseData + + +class PointsResponse : BaseData() { + var data: MutableList?=null +} + +data class Point( + val latitude: Double, + val longitude: Double, + val pointType: Int, + val segment: Int +) + +data class Black( + val latitude: Double, + val longitude: Double, + val pointType: Int, + val segment: Int +) + +data class PointResponse( + val businessType: Int, + val contrailId: Long, + val contrailSaveTime: Long, + val csvFileMd5: String, + val csvFileUrl: String, + val lineId: Long, + val lineName: String, + val segmentPointList: List, + val source: Int, + val txtFileMd5: String, + val txtFileUrl: String +) + +data class SegmentPoint( + val blackList: List, + val pointList: List, + val segment: Int? +) \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt index c608e14617..1a147042b3 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/LineModel.kt @@ -58,24 +58,13 @@ object LineModel { const val TAG = "${M_BUS}BusLineModel" - private val context = AbsMogoApplication.getApp() - - // 判断接口是否变化 - private const val EXECUTABLECHANGEMD5 = "EXECUTABLECHANGEMD5" - - // 展示上一次刷新时间 - const val EXECUTABLECHANGETIME = "executablechangetime" - var currentTask: TaskDataBean?=null // 当前任务的站点列表 var stationList:MutableList? = mutableListOf() + private var startTaskDisposable: Disposable?=null - private val isRequesting = AtomicBoolean(false) - private var startTaskDisposable:Disposable?=null - - private var queryCarInfo: Disposable? = null // 当前站点 @JvmStatic @@ -86,7 +75,7 @@ object LineModel { d(TAG,"init") mContext = AbsMogoApplication.getApp() EventModel.load() - queryCarExecutableTaskList(true) + SynchDataModel.queryCarExecutableTaskList(true) } @JvmStatic @@ -94,10 +83,11 @@ object LineModel { fun release() { d(TAG,"release") mContext = null - isRequesting.set(false) + + SynchDataModel.release() EventModel.release() mBusLinesCallbackMap.clear() - RxUtils.disposeSubscribe(queryCarInfo) + } @JvmStatic @@ -110,99 +100,12 @@ object LineModel { mBusLinesCallbackMap[tag] = callback } - fun refreshTask() { - RxUtils.disposeSubscribe(queryCarInfo) - queryCarExecutableTaskList(false) + fun getBusLinesCallbackMap(): MutableMap { + return mBusLinesCallbackMap } - /** - * 同步基础信息 - */ - private fun queryCarExecutableTaskList(isBackground:Boolean) { - if(isRequesting.get()){ - d(TAG,"正在同步请稍等") - val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0) - mBusLinesCallbackMap.forEach { callback -> - callback.value.onRefreshSuccess(lastUpdateTime) - } - return - } - isRequesting.set(true) - d(TAG,"开始同步数据") - RepositoryManager.queryCarExecutableTaskList( - object : OchCommonServiceCallback { - override fun onSuccess(data: CarExecutableTaskResponse) { - isRequesting.set(false) - d(TAG,"同步数据成功") - RxUtils.disposeSubscribe(queryCarInfo) - queryCarInfo = RxUtils.createSubscribe(60_000) { - queryCarExecutableTaskList(true) - } - // 第一次过滤 请求返回值的md5 - val currentRequest = DigestUtils.md5Hex(data.data.toString()) - val lastChangeMd5 = SharedPrefsMgr.getInstance().getString(EXECUTABLECHANGEMD5) - val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0) - val currentTimeStamp = DateTimeUtil.getCurrentTimeStamp() - - SharedPrefsMgr.getInstance().putLong(EXECUTABLECHANGETIME, currentTimeStamp) - val sameDay = DateTimeUtil.isSameDay(currentTimeStamp, lastUpdateTime) - mBusLinesCallbackMap.forEach { callback -> - callback.value.onRefreshSuccess(currentTimeStamp) - } - if (isBackground) { - if (currentRequest == lastChangeMd5 && sameDay) { - return - } - } - SharedPrefsMgr.getInstance().putString(EXECUTABLECHANGEMD5, currentRequest) - OchChainLogManager.writeChainLog( - "数据发生变化", - "接口信息发生变化 $lastChangeMd5 new md5${currentRequest}" - ) - val startTime = System.currentTimeMillis() - CarExecutableTaskResponse.save2Db(data) - d(TAG,"更新数据耗时${System.currentTimeMillis()-startTime}") - RxUtils.createSubscribe(800) { - // 等待写入数据库 - mBusLinesCallbackMap.forEach { callback -> - callback.value.onRefreshSuccessWIthData() - } - } - } - - override fun onError() { - isRequesting.set(false) - d(TAG,"同步数据失败 onError") - RxUtils.disposeSubscribe(queryCarInfo) - queryCarInfo = RxUtils.createSubscribe(60_000) { - queryCarExecutableTaskList(true) - } - if (!isBackground) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort(ResourcesUtils.getString(R.string.network_error_tip)) - } else { - ToastUtils.showShort(ResourcesUtils.getString(R.string.request_error_tip)) - } - } - } - - override fun onFail(code: Int, failMsg: String) { - isRequesting.set(false) - d(TAG,"同步数据失败 onFail") - RxUtils.disposeSubscribe(queryCarInfo) - queryCarInfo = RxUtils.createSubscribe(60_000) { - queryCarExecutableTaskList(true) - } - if (!isBackground) { - if (!NetworkUtils.isConnected(mContext)) { - ToastUtils.showShort("网络异常,请稍后重试") - } else { - ToastUtils.showShort(failMsg) - } - } - - } - }) + fun refreshTask() { + SynchDataModel.queryCarExecutableTaskList(false) } /** diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt index eee80c62d5..a2019e91f1 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/OrderModel.kt @@ -3,10 +3,12 @@ package com.mogo.och.weaknet.model import android.annotation.SuppressLint import android.content.Context import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.module.status.MogoStatusManager import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS @@ -21,6 +23,9 @@ import com.mogo.och.bridge.autopilot.autopilot.bean.ArrivedStation import com.mogo.och.bridge.autopilot.line.ILineCallback import com.mogo.och.bridge.autopilot.line.LineManager import com.mogo.och.bridge.autopilot.location.OchLocationManager +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.manager.loop.LoopInfo @@ -78,6 +83,8 @@ object OrderModel { OchAutoPilotStatusListenerManager.addListener(TAG, ochAutopilotStatusListener) + BridgeManager.addBridgeListener(TAG,bridgeListener) + LineManager.addListener(TAG,arriveStationBySearch) OchTransform.addListener(TAG,ochTransform) @@ -96,11 +103,23 @@ object OrderModel { TicketModel.release() OchAutoPilotStatusListenerManager.removeListener(TAG) + BridgeManager.removeBridgeListener(LineModel.TAG) LineManager.removeListener(TAG) OchTransform.removeListener(TAG) } + private val bridgeListener = object : BridgeListener{ + override fun onPncInfoListener(pncAction: String) { + when (pncAction) { + OchCommonConst.PNC_ACTION_ENTERSTATION -> { + ShuttleVoiceManager.arrivedStationOut(ResourcesUtils.getString(R.string.m2_voice_out_arriving_station)) + } + else -> {} + } + } + } + private val ochAutopilotStatusListener = object : IOchAutopilotStatusListener{ override fun onAutopilotArriveAtStation(arrivedStation: ArrivedStation?) { e(TAG, "行程日志-onAutopilotArriveAtStation arrive") @@ -189,9 +208,11 @@ object OrderModel { override fun onNext(data: Boolean) { if(data){ + MogoStatusManager.getInstance().setShuttleDriverPerformTask(TAG, true) LineModel.haveRunningTask() updateBusStatus() }else{ + MogoStatusManager.getInstance().setShuttleDriverPerformTask(TAG, false) LineModel.haveNoRunningTask() d(TAG, "queryBusRoutes 获取到小巴路线数据:空 ") LineManager.setLineInfo(null) @@ -517,6 +538,9 @@ object OrderModel { }catch (e:Exception){ OchChainLogManager.writeChainLog("错误","${e.message}") } + MogoStatusManager.getInstance().setShuttleDriverPerformTask(TAG, false) + MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingVerifyMode(TAG, false) + CallerSopSettingManager.invokeRoutingListener(false) MapMakerManager.removeAllMapMarkerByOwner(TAG) BusTrajectoryManager.stopTrajReqLoop() LoginStatusManager.loginOut() diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/SynchDataModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/SynchDataModel.kt new file mode 100644 index 0000000000..2818e52bf7 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/SynchDataModel.kt @@ -0,0 +1,196 @@ +package com.mogo.och.weaknet.model + +import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.storage.SharedPrefsMgr +import com.mogo.eagle.core.network.utils.digest.DigestUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i +import com.mogo.eagle.core.utilcode.util.NetworkUtils +import com.mogo.eagle.core.utilcode.util.ToastUtils +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.network.OchCommonServiceCallback +import com.mogo.och.common.module.utils.DateTimeUtil +import com.mogo.och.common.module.utils.ResourcesUtils +import com.mogo.och.common.module.utils.RxUtils +import com.mogo.och.shuttle.weaknet.R +import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse +import com.mogo.och.weaknet.repository.RepositoryManager +import com.mogo.och.weaknet.repository.db.repository.PointDb +import io.reactivex.Observer +import io.reactivex.disposables.Disposable +import io.reactivex.schedulers.Schedulers +import java.util.concurrent.atomic.AtomicBoolean + +object SynchDataModel { + + private const val TAG = "SynchDataModel" + + private val isRequesting = AtomicBoolean(false) + + // 展示上一次刷新时间 + const val EXECUTABLECHANGETIME = "executablechangetime" + + private var queryCarInfo: Disposable? = null + + // 判断接口是否变化 + private const val EXECUTABLECHANGEMD5 = "EXECUTABLECHANGEMD5" + + /** + * 同步基础信息 + */ + fun queryCarExecutableTaskList(isBackground:Boolean) { + RxUtils.disposeSubscribe(queryCarInfo) + if(isRequesting.get()){ + d(TAG,"正在同步请稍等") + val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0) + LineModel.getBusLinesCallbackMap().forEach { callback -> + callback.value.onRefreshSuccess(lastUpdateTime) + } + return + } + isRequesting.set(true) + d(TAG,"开始同步数据") + RepositoryManager.queryCarExecutableTaskList( + object : OchCommonServiceCallback { + override fun onSuccess(data: CarExecutableTaskResponse) { + isRequesting.set(false) + i(TAG,"查询路线和站点的数据为:${data.data}") + RxUtils.disposeSubscribe(queryCarInfo) + queryCarInfo = RxUtils.createSubscribe(60_000) { + queryCarExecutableTaskList(true) + } + // 第一次过滤 请求返回值的md5 + val currentRequest = DigestUtils.md5Hex(data.data.toString()) + val lastChangeMd5 = SharedPrefsMgr.getInstance().getString(EXECUTABLECHANGEMD5) + val lastUpdateTime = SharedPrefsMgr.getInstance().getLong(EXECUTABLECHANGETIME, 0) + val currentTimeStamp = DateTimeUtil.getCurrentTimeStamp() + + SharedPrefsMgr.getInstance().putLong(EXECUTABLECHANGETIME, currentTimeStamp) + val sameDay = DateTimeUtil.isSameDay(currentTimeStamp, lastUpdateTime) + LineModel.getBusLinesCallbackMap().forEach { callback -> + callback.value.onRefreshSuccess(currentTimeStamp) + } + if (isBackground) { + if (currentRequest == lastChangeMd5 && sameDay) { + return + } + } + SharedPrefsMgr.getInstance().putString(EXECUTABLECHANGEMD5, currentRequest) + OchChainLogManager.writeChainLog( + "数据发生变化", + "接口信息发生变化 $lastChangeMd5 new md5${currentRequest}" + ) + val startTime = System.currentTimeMillis() + CarExecutableTaskResponse.save2Db(data) + d(TAG,"更新数据耗时${System.currentTimeMillis()-startTime}") + RxUtils.createSubscribe(800) { + // 等待写入数据库 + LineModel.getBusLinesCallbackMap().forEach { callback -> + callback.value.onRefreshSuccessWIthData() + } + } + } + + override fun onError() { + isRequesting.set(false) + d(TAG,"同步数据失败 onError") + RxUtils.disposeSubscribe(queryCarInfo) + queryCarInfo = RxUtils.createSubscribe(60_000) { + queryCarExecutableTaskList(true) + } + if (!isBackground) { + if (!NetworkUtils.isConnected(AbsMogoApplication.getApp())) { + ToastUtils.showShort(ResourcesUtils.getString(R.string.network_error_tip)) + } else { + ToastUtils.showShort(ResourcesUtils.getString(R.string.request_error_tip)) + } + } + } + + override fun onFail(code: Int, failMsg: String) { + isRequesting.set(false) + d(TAG,"同步数据失败 onFail") + RxUtils.disposeSubscribe(queryCarInfo) + queryCarInfo = RxUtils.createSubscribe(60_000) { + queryCarExecutableTaskList(true) + } + if (!isBackground) { + if (!NetworkUtils.isConnected(AbsMogoApplication.getApp())) { + ToastUtils.showShort("网络异常,请稍后重试") + } else { + ToastUtils.showShort(failMsg) + } + } + + } + }) + } + + private val waitSysData = mutableSetOf() + private val isRequestingContrainInfo = AtomicBoolean(false) + + + fun synContraiInfo(needUpdatePoint: MutableList) { + waitSysData.addAll(needUpdatePoint) + if(isRequestingContrainInfo.get()){ + // 正在请求 + OchChainLogManager.writeChainLogNet(false,"同步轨迹","正在同步轨迹请稍等 ") + return + } + isRequestingContrainInfo.set(true) + + val lines = mutableListOf() + waitSysData.forEach { + lines.add(it) + } + OchChainLogManager.writeChainLogNet(false,"同步轨迹","轨迹变更需同步禁行点和途径点 线路:${lines}") + RepositoryManager.queryPointFromNet(lines) + ?.subscribeOn(Schedulers.io()) + ?.observeOn(Schedulers.io()) + ?.subscribe(object : Observer> { + override fun onSubscribe(d: Disposable) { + d(TAG, "queryPointsByLinesId onSubscribe") + } + + override fun onError(e: Throwable) { + d(TAG, "同步轨迹 onError${e.printStackTrace()} 同步轨迹失败 5s种后重试 线路:${lines}") + OchChainLogManager.writeChainLogNet(false,"同步轨迹","同步轨迹失败 5s种后重试 线路:${lines}") + RxUtils.createSubscribe(5_000){ + synContraiInfo(needUpdatePoint) + } + isRequestingContrainInfo.set(false) + } + + override fun onComplete() { + d(TAG, "endTask onComplete") + } + + override fun onNext(data: List) { + try { + i(TAG, "途经点和轨迹信息为:${data}") + PointDb.addOrUpdate(data) + for (datum in data) { + waitSysData.remove(datum.lineId) + } + isRequestingContrainInfo.set(false) + if(waitSysData.isNotEmpty()){ + synContraiInfo(needUpdatePoint) + } + OchChainLogManager.writeChainLogNet(false,"同步轨迹","网络请求重构 轨迹信息${data}") + d(TAG, "同步轨迹网络成功") + }catch (e:Exception){ + isRequestingContrainInfo.set(false) + OchChainLogManager.writeChainLogDb("同步轨迹","同步轨迹时报错 轨迹信息${data} 错误信息${e.message}") + synContraiInfo(needUpdatePoint) + } + + } + }) + } + + fun release() { + isRequesting.set(false) + RxUtils.disposeSubscribe(queryCarInfo) + } +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/ThirdDeviceData.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/ThirdDeviceData.kt index c446c75c33..bef73ee15a 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/ThirdDeviceData.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/model/ThirdDeviceData.kt @@ -4,9 +4,14 @@ import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.util.GsonUtils +import com.mogo.eagle.core.utilcode.util.StringUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.common.module.biz.login.LoginStatusManager import com.mogo.och.bridge.autopilot.line.LineManager +import com.mogo.och.bridge.distance.IDistanceListener +import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager +import com.mogo.och.common.module.biz.birdge.BridgeListener +import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.manager.socket.cloud.AbnormalFactorsLoopManager import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager import com.mogo.och.common.module.manager.socket.cloud.action.OperateAction @@ -31,6 +36,34 @@ object ThirdDeviceData { @JvmStatic val busRoutesResult: BusRoutesResult = BusRoutesResult() + private val bridgeListener: BridgeListener = object : BridgeListener { + override fun onCollisionRisk() { + ShuttleVoiceManager.collisionRisk() + } + } + private val trajectoryListener: IDistanceListener = object : IDistanceListener { + override fun distanceCallback(distance: Float) { + // 小于200m 播报站点介绍 + if (distance < 200) { + LineManager.getStations { start, end -> + if (!end.isPlayTts) { + end.isPlayTts = true + if (StringUtils.isEmpty(end.introduction)) { + if(!StringUtils.isEmpty(end.name)){ + val message = "前方到站:${end.name},请下车的乘客做好准备" + ShuttleVoiceManager.leave200Distance(message) + } + }else{ + end.introduction?.let { + ShuttleVoiceManager.leave200Distance(it) + } + } + } + } + } + } + } + fun init() { //监听运营消息 OCHSocketMessageManager.registerSocketMessageListener( @@ -51,6 +84,8 @@ object ThirdDeviceData { DPMsgType.TYPE_TASK_DETAILS.type, taskDetailsMsgListener ) + TrajectoryAndDistanceManager.addDistanceListener(TAG,trajectoryListener) + BridgeManager.addBridgeListener(TAG,bridgeListener) } fun release() { @@ -61,6 +96,10 @@ object ThirdDeviceData { AbnormalFactorsLoopManager.stopLoopAbnormalFactors() + TrajectoryAndDistanceManager.removeListener(TAG) + + BridgeManager.removeBridgeListener(TAG) + //监听乘客屏发来的消息 LanSocketManager.unRegisterSocketMessageListener( DPMsgType.TYPE_TASK_DETAILS.type, @@ -89,8 +128,8 @@ object ThirdDeviceData { LedScreenManager.sendTripInfo2Led( LedScreenManager.LEAVE_STATION, lineInfo.lineName, - start.name, - end.name, + start.name?:"", + end.name?:"", LineModel.isLastStation() == true ) } @@ -109,8 +148,8 @@ object ThirdDeviceData { LedScreenManager.sendTripInfo2Led( LedScreenManager.ARRIVE_STATION, lineInfo.lineName, - start.name, - end.name, + start.name?:"", + end.name?:"", LineModel.isLastStation(end) ) } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt index ad4d3609f1..4076fe4e27 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/RepositoryManager.kt @@ -15,6 +15,7 @@ import com.mogo.och.weaknet.bean.WaitUploadLine import com.mogo.och.weaknet.bean.WriteOffPassenger import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.repository.db.MyDataBase import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean @@ -183,6 +184,13 @@ object RepositoryManager { } } + fun queryPointFromNet(lines: MutableList): Observable>? { + if (lineRepository is WeaknetRepository) { + return lineRepository?.queryPointsByLineIds(lines) + } + return null + } + fun reportCabinEvent( context: Context?, data: ShuttleEventRequest?, diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt index e26a5283e4..10d19d4b94 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/MyDataBase.kt @@ -6,16 +6,17 @@ import androidx.room.Room import androidx.room.RoomDatabase import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase -import androidx.sqlite.db.SupportSQLiteOpenHelper import com.mogo.commons.AbsMogoApplication import com.mogo.commons.env.Project import com.mogo.commons.env.ProjectUtils import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.FileUtils import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean import com.mogo.och.weaknet.repository.db.bean.EventDataBean import com.mogo.och.weaknet.repository.db.bean.LineDataBean +import com.mogo.och.weaknet.repository.db.bean.PointDataBean import com.mogo.och.weaknet.repository.db.bean.SiteDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean @@ -23,17 +24,22 @@ import com.mogo.och.weaknet.repository.db.bean.WriteOffDataBean import com.mogo.och.weaknet.repository.db.dao.EventDataDao import com.mogo.och.weaknet.repository.db.dao.ContrailDataDao import com.mogo.och.weaknet.repository.db.dao.LineDataDao +import com.mogo.och.weaknet.repository.db.dao.PointDataDao import com.mogo.och.weaknet.repository.db.dao.SiteDataDao import com.mogo.och.weaknet.repository.db.dao.TaskDataDao import com.mogo.och.weaknet.repository.db.dao.TaskSiteDataDao import com.mogo.och.weaknet.repository.db.dao.WriteOffDataDao import java.io.File +import java.util.concurrent.Executors //注解Database告诉系统这是Room数据库对象 //entities指定该数据库有哪些表,多张表就逗号分隔 //version指定数据库版本号,升级时需要用到 //数据库继承自RoomDatabase -@Database(entities = [ContrailDataBean::class, LineDataBean::class, SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, EventDataBean::class, WriteOffDataBean::class], version = 6) +@Database(entities = [ContrailDataBean::class, LineDataBean::class, + SiteDataBean::class, TaskDataBean::class, TaskSiteDataBean::class, + EventDataBean::class, WriteOffDataBean::class,PointDataBean::class + ], version = 7) abstract class MyDataBase : RoomDatabase() { private val dbRepositorys = mutableListOf() @@ -53,12 +59,18 @@ abstract class MyDataBase : RoomDatabase() { abstract val contrailDataDao: ContrailDataDao? abstract val eventDataDao: EventDataDao? abstract val lineDataDao: LineDataDao? + abstract val pointDataDao: PointDataDao? abstract val siteDataDao: SiteDataDao? abstract val taskDataDao: TaskDataDao? abstract val taskSiteDataDao: TaskSiteDataDao? abstract val writeOffDataDao: WriteOffDataDao? companion object { + + + private val TAG = "MyDataBase" + + private val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE ${EventDataBean.tableName} ADD COLUMN driver_id INTEGER"); @@ -95,6 +107,15 @@ abstract class MyDataBase : RoomDatabase() { } } + private val MIGRATION_6_7 = object : Migration(6, 7) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("CREATE TABLE IF NOT EXISTS `${PointDataBean.tableName}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `line_id` INTEGER, `contrail_id` INTEGER, `site_id` INTEGER, `md5` TEXT, `seq` INTEGER, `point_type` INTEGER, `longitude` REAL, `latitude` REAL, `sub_seq` INTEGER)") + database.execSQL("ALTER TABLE ${ContrailDataBean.tableName} ADD COLUMN contrail_id INTEGER") + database.execSQL("ALTER TABLE ${ContrailDataBean.tableName} ADD COLUMN source INTEGER") + } + } + + fun getDBName():MyDataBase{ val roomName = when (ProjectUtils.getProjectType()) { @@ -142,7 +163,9 @@ abstract class MyDataBase : RoomDatabase() { .addMigrations(MIGRATION_3_4) .addMigrations(MIGRATION_4_5) .addMigrations(MIGRATION_5_6) + .addMigrations(MIGRATION_6_7) .fallbackToDestructiveMigration() + .setQueryCallback({ sqlQuery, bindArgs -> CallerLogger.d(TAG,"sql:$sqlQuery--->参数:$bindArgs") }, Executors.newSingleThreadExecutor()) .build() } val ROOT_PATH = Environment.getExternalStorageDirectory().absolutePath + File.separator + "Mogo" + File.separator + "APP_cache" + File.separator //程序外部存储跟目录 diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/ContrailDataBean.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/ContrailDataBean.kt index beb1f16381..2dabe3e220 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/ContrailDataBean.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/ContrailDataBean.kt @@ -18,6 +18,12 @@ data class ContrailDataBean( @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER, index = true) var lineId: Long? = null, + /** + * 轨迹id + */ + @ColumnInfo(name = "contrail_id", typeAffinity = ColumnInfo.INTEGER) + var contrailId: Long? = null, + /** * csv格式的轨迹文件 */ @@ -54,9 +60,17 @@ data class ContrailDataBean( @ColumnInfo(name = "md5", typeAffinity = ColumnInfo.TEXT, index = true) var md5: String? = null, + /** + * 轨迹id + */ + @ColumnInfo(name = "source", typeAffinity = ColumnInfo.INTEGER) + var source: Int? = null, + + ) { companion object { const val tableName: String = "contrail_data_table" + const val SOURCETYPEROUTING = 2 } override fun toString(): String { diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/PointDataBean.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/PointDataBean.kt new file mode 100644 index 0000000000..f417cdfe35 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/bean/PointDataBean.kt @@ -0,0 +1,87 @@ +package com.mogo.och.weaknet.repository.db.bean + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.mogo.och.data.bean.BusStationBean + +@Entity(tableName = PointDataBean.tableName) +data class PointDataBean( + + @PrimaryKey(autoGenerate = true) var id: Int = 0, + + /** + * 点所属线路Id + */ + @ColumnInfo(name = "line_id", typeAffinity = ColumnInfo.INTEGER) + var lineId: Long? = null, + + /** + * 轨迹id + */ + @ColumnInfo(name = "contrail_id", typeAffinity = ColumnInfo.INTEGER) + var contrailId: Long? = null, + + /** + * A--B--C--D + * A--B 的途径点 siteId = B.id + * B--C 的途径点 siteId = C.id + * C--D 的途径点 siteId = D.id + */ + @ColumnInfo(name = "site_id", typeAffinity = ColumnInfo.INTEGER) + var siteId: Long? = null, + + /** + * ContrailDataBean 表格中的md5值 + */ + @ColumnInfo(name = "md5", typeAffinity = ColumnInfo.TEXT) + var md5: String? = null, + + + + /** + * 排队组 + */ + @ColumnInfo(name = "seq", typeAffinity = ColumnInfo.INTEGER) + var seq: Int? = null, + + /** + * 点的类型 + */ + @ColumnInfo(name = "point_type", typeAffinity = ColumnInfo.INTEGER) + var pointType: Int? = null, + + /** + * 高精坐标 + */ + @ColumnInfo(name = "longitude", typeAffinity = ColumnInfo.REAL) + var longitude: Double? = null, + + /** + * 高精坐标 + */ + @ColumnInfo(name = "latitude", typeAffinity = ColumnInfo.REAL) + var latitude: Double? = null, + + /** + * 组内排序 + */ + @ColumnInfo(name = "sub_seq", typeAffinity = ColumnInfo.INTEGER) + var subSeq: Int? = null, + +) { + fun toStation(): BusStationBean { + val temp = BusStationBean() + temp.lat = latitude?:0.0 + temp.lon = longitude?:0.0 + temp.pointType = pointType?:pointTypePass + temp.isLeaving = true + return temp + } + + companion object { + const val tableName = "point_data_table" + const val pointTypePass = 1 + const val pointTypeBlack = 2 + } +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/ContrailDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/ContrailDataDao.kt index 28cf1aec38..8ed51cc24e 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/ContrailDataDao.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/ContrailDataDao.kt @@ -38,7 +38,8 @@ interface ContrailDataDao { queryContrailByLineId.first() } } - + @Query("UPDATE ${ContrailDataBean.tableName} SET contrail_id = :contrailId ,source = :source WHERE line_id = :lineId") + fun updateIdAndSource(contrailId: Long, source: Int, lineId: Long) } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/PointDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/PointDataDao.kt new file mode 100644 index 0000000000..64035579b6 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/PointDataDao.kt @@ -0,0 +1,39 @@ +package com.mogo.och.weaknet.repository.db.dao + +import androidx.room.Dao +import androidx.room.Delete +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Transaction +import com.mogo.och.weaknet.repository.db.bean.PointDataBean + +@Dao +interface PointDataDao { + //插入数据 + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg lineDataBean: PointDataBean) + + //插入数据 + @Transaction + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertTra(vararg lineDataBean: PointDataBean) + + + //删除数据 + @Delete + fun delete(vararg lineDataBean: PointDataBean) + + + // 线路删除时同步删除所属轨迹信息 + @Transaction + @Query("DELETE FROM ${PointDataBean.tableName} WHERE line_id in (:lineId)") + fun deleteByLineIdTra(lineId: List) + + @Transaction + @Query("DELETE FROM ${PointDataBean.tableName} WHERE line_id in (:lineId)") + fun deleteByLineId(lineId: List) + + @Query("SELECT * FROM ${PointDataBean.tableName} WHERE line_id = :lineId") + fun queryPointByLineId(lineId: Long) : List? +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt index da9842d37e..fb98991475 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/dao/SiteDataDao.kt @@ -41,7 +41,7 @@ interface SiteDataDao { @Query("SELECT * FROM ${SiteDataBean.tableName} WHERE line_id = :lineId and site_id = :siteId") fun querySitesByLineIdAndSiteId(lineId: Long,siteId:Long):List? - @Query("SELECT * FROM ${SiteDataBean.tableName} WHERE line_id = :lineId") + @Query("SELECT * FROM ${SiteDataBean.tableName} WHERE line_id = :lineId order by seq") fun querySitesByLineId(lineId: Long):List? @Query("SELECT * FROM ${SiteDataBean.tableName} GROUP by md5 HAVING count(1) > 1") diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/ContraiDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/ContraiDb.kt index 73ba7e88a0..41dc442f97 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/ContraiDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/ContraiDb.kt @@ -2,6 +2,8 @@ package com.mogo.och.weaknet.repository.db.repository import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.weaknet.model.SynchDataModel +import com.mogo.och.weaknet.repository.RepositoryManager import com.mogo.och.weaknet.repository.db.IDbRepository import com.mogo.och.weaknet.repository.db.MyDataBase import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean @@ -26,6 +28,7 @@ object ContraiDb : IDbRepository { val runnable = Runnable { // 校验数据个数 contrailDao?.let { contrailDao-> + val needUpdatePoint = mutableListOf() contrailDatalist.forEach { val md5Source = it.toString() val md5Hex = DigestUtils.md5Hex(md5Source) @@ -33,6 +36,7 @@ object ContraiDb : IDbRepository { if(queryContrailByMd5.isNullOrEmpty()){// 没有值或者值有变化 val needUpdate = contrailDao.queryContrailByLineIdOne(it.lineId!!) it.md5 = md5Hex + needUpdatePoint.add(it.lineId!!) if(needUpdate!=null){// 更新 it.id = needUpdate.id contrailDao.update(it.csvFileUrl?:"",it.csvFileMd5?:"",it.txtFileUrl?:"",it.txtFileMd5?:"",System.currentTimeMillis(),md5Hex,needUpdate.id) @@ -41,6 +45,9 @@ object ContraiDb : IDbRepository { } } } + if(needUpdatePoint.isNotEmpty()){ + SynchDataModel.synContraiInfo(needUpdatePoint) + } } } BizLoopManager.runInIoThread(runnable) @@ -75,4 +82,10 @@ object ContraiDb : IDbRepository { addOrUpdate(mutableListOf(runningLine)) } + fun upDateIdAndsource(contrailId: Long?, source: Int?, lineId: Long?) { + if(contrailId!=null&&source!=null&&lineId!=null){ + contrailDao?.updateIdAndSource(contrailId,source,lineId) + } + } + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/PointDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/PointDb.kt new file mode 100644 index 0000000000..8382701e01 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/PointDb.kt @@ -0,0 +1,118 @@ +package com.mogo.och.weaknet.repository.db.repository + +import com.mogo.och.weaknet.bean.response.PointResponse +import com.mogo.och.weaknet.repository.db.IDbRepository +import com.mogo.och.weaknet.repository.db.MyDataBase +import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean +import com.mogo.och.weaknet.repository.db.bean.PointDataBean +import com.mogo.och.weaknet.repository.db.dao.PointDataDao + +object PointDb: IDbRepository { + + private var pointDao: PointDataDao?=null + get() { + if(field==null){ + field = MyDataBase.instance?.pointDataDao + register() + } + return field + } + + + override fun release() { + pointDao = null + } + + fun queryPointByLineId(lineId: Long?): List? { + lineId?.let { + return pointDao?.queryPointByLineId(lineId) + } + return null + } + + fun deletePointByLineIds(lineIds: List) { + pointDao?.deleteByLineId(lineIds) + } + + fun addOrUpdate(serverDataList:List) { + val contaiBeans = mutableListOf() + val needDelete = mutableListOf() + val needUpdateLineInfos = mutableListOf() + + serverDataList.forEach { contrailInfo -> + val lineId = contrailInfo.lineId + // 当前线路已排序的所有站点 + val siteList = SiteDb.querySiteByLineId(lineId) + val contraiBean = ContraiDb.queryAutopilotInfoByLineid(lineId) + + contraiBean?.let { + contraiBean.source = contrailInfo.source + contraiBean.contrailId = contrailInfo.contrailId + needUpdateLineInfos.add(contraiBean) + } + + val segmentPointList = contrailInfo.segmentPointList + needDelete.add(lineId) + segmentPointList.forEachIndexed { index, segmentPoint -> + val siteIndex = segmentPoint.segment + siteList?.let { siteListTemp-> + siteIndex?.let {siteIndexTemp-> + // 途径点和禁行点所有站点 + // TODO:("站点接口和轨迹接口绑定有问题的情况未来要处理") + if (siteIndexTemp < 0 || siteIndexTemp >= siteListTemp.size) return@forEachIndexed + val siteDataBean = siteListTemp[siteIndexTemp] + segmentPoint.pointList?.forEachIndexed { index, point -> + val pointTemp = PointDataBean() + pointTemp.lineId = lineId + pointTemp.contrailId = contrailInfo.contrailId + pointTemp.siteId = siteDataBean.siteId + pointTemp.md5 = contraiBean?.md5?:"" + pointTemp.seq = siteIndex + pointTemp.pointType = PointDataBean.pointTypePass + pointTemp.longitude = point.longitude + pointTemp.latitude = point.latitude + pointTemp.subSeq = index + contaiBeans.add(pointTemp) + } + segmentPoint.blackList?.forEachIndexed { index, black -> + val pointTemp = PointDataBean() + pointTemp.lineId = lineId + pointTemp.contrailId = contrailInfo.contrailId + pointTemp.siteId = siteDataBean.siteId + pointTemp.md5 = contraiBean?.md5?:"" + pointTemp.seq = siteIndex + pointTemp.pointType = PointDataBean.pointTypeBlack + pointTemp.longitude = black.longitude + pointTemp.latitude = black.latitude + pointTemp.subSeq = index + contaiBeans.add(pointTemp) + } + } + } + } + if(needUpdateLineInfos.size<100){ + needUpdateLineInfos.forEach { + ContraiDb.upDateIdAndsource(it.contrailId,it.source,it.lineId) + } + }else{ + MyDataBase.instance?.runInTransaction{ + needUpdateLineInfos.forEach { + ContraiDb.upDateIdAndsource(it.contrailId,it.source,it.lineId) + } + } + } + if(needDelete.size<100) { + pointDao?.deleteByLineId(needDelete) + }else{ + pointDao?.deleteByLineIdTra(needDelete) + } + if(contaiBeans.size<100) { + pointDao?.insert(*contaiBeans.toTypedArray()) + }else{ + pointDao?.insertTra(*contaiBeans.toTypedArray()) + } + } + } + + +} \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt index 14c78a2230..ab3091b5b3 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/db/repository/SiteDb.kt @@ -3,9 +3,9 @@ package com.mogo.och.weaknet.repository.db.repository import androidx.room.Transaction import com.mogo.eagle.core.network.utils.digest.DigestUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.TAG import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.manager.loop.BizLoopManager +import com.mogo.och.weaknet.model.SynchDataModel import com.mogo.och.weaknet.repository.db.IDbRepository import com.mogo.och.weaknet.repository.db.MyDataBase import com.mogo.och.weaknet.repository.db.bean.SiteDataBean @@ -13,6 +13,8 @@ import com.mogo.och.weaknet.repository.db.dao.SiteDataDao object SiteDb: IDbRepository { + private const val TAG = "SiteDb" + private var siteDataDao: SiteDataDao? = null get() { if(field==null){ @@ -37,6 +39,7 @@ object SiteDb: IDbRepository { siteDataDao.insert(*serverDataList.toTypedArray()) return } + val delPointByLineIds = mutableSetOf() // 后台新增数据 val needAddDatas = serverDataList-localAllSites // 后台没有本地数据库有的未分配线路 @@ -48,6 +51,7 @@ object SiteDb: IDbRepository { val md5Source = it.toString() val md5Hex = DigestUtils.md5Hex(md5Source) it.md5 = md5Hex + it.lineId?.let { lineId -> delPointByLineIds.add(lineId) } } // 新增插入新数据 siteDataDao.insert(*needAddDatas.toTypedArray()) @@ -56,6 +60,9 @@ object SiteDb: IDbRepository { if (needMinusDatas.isNotEmpty()) { // 删除线路 siteDataDao.deleteById(*needMinusDatas.toTypedArray()) + needMinusDatas.forEach { + it.lineId?.let { it1 -> delPointByLineIds.add(it1) } + } } // 交集 服务器端 @@ -85,7 +92,7 @@ object SiteDb: IDbRepository { } }else{ needDelete.add(siteDataBean) - + siteDataBean.lineId?.let { it1 -> delPointByLineIds.add(it1) } } } } @@ -94,8 +101,15 @@ object SiteDb: IDbRepository { siteDataDao.updateInfo(updateDateItem.siteId,updateDateItem.lineId,updateDateItem.name,updateDateItem.nameKr, updateDateItem.seq,updateDateItem.gcjLon,updateDateItem.gcjLat,updateDateItem.lon,updateDateItem.lat, updateDateItem.introduction,updateDateItem.isPlayTts,updateDateItem.md5,updateDateItem.videoListDB,updateDateItem.id) + updateDateItem.lineId?.let { delPointByLineIds.add(it) } } siteDataDao.deleteById(*needDelete.toTypedArray()) + // 清除所有变更的站点 + if (delPointByLineIds.isNotEmpty()) { + val delPointList = delPointByLineIds.toMutableList() + PointDb.deletePointByLineIds(delPointList) + SynchDataModel.synContraiInfo(delPointList) + } checkData() } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt index 0a7987c998..97dfd31802 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/ILineRepository.kt @@ -5,6 +5,7 @@ import com.mogo.eagle.core.data.BaseData import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import io.reactivex.Observable @@ -44,4 +45,6 @@ interface ILineRepository { fun release() fun endTaskByOther(taskId: Long) {} + fun queryPointsByLineIds(lines: MutableList): Observable>? + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt index a63f5b8a51..5a5ca1bc50 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/NormalRepository.kt @@ -16,6 +16,7 @@ import com.mogo.och.data.bean.ContraiInfo import com.mogo.och.data.bean.LineInfo import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean @@ -184,6 +185,10 @@ class NormalRepository: ILineRepository { } + override fun queryPointsByLineIds(lines: MutableList): Observable>? { + return Observable.just(ArrayList()) + } + override fun reportCabinEvent( context: Context?, data: ShuttleEventRequest?, diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt index dad5723173..4bfb8e4a2f 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/line/impl/WeaknetRepository.kt @@ -16,12 +16,15 @@ import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.data.bean.ContraiInfo +import com.mogo.och.weaknet.bean.request.QueryPointRequest import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.BusRoutesResponse import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.constant.BusConst import com.mogo.och.weaknet.model.LineModel import com.mogo.och.weaknet.model.LineModel.currentTask +import com.mogo.och.weaknet.repository.db.bean.ContrailDataBean import com.mogo.och.weaknet.repository.db.bean.LineDataBean import com.mogo.och.weaknet.repository.db.bean.TaskDataBean import com.mogo.och.weaknet.repository.db.bean.TaskSiteDataBean @@ -102,7 +105,7 @@ class WeaknetRepository : ILineRepository { TaskSiteDb.deleteErrorData(it) return@flatMap loadServerRuningTask(1) } - val db2Beans = BusRoutesResponse.db2Beans(runnintTaskAndSites) + val db2Beans = BusRoutesResponse.db2Beans(runnintTaskAndSites,currentTask!!.lineId) LineModel.stationList = db2Beans.first LineModel.startStationIndex = db2Beans.second LineModel.stationList?.let { stationlist-> @@ -123,7 +126,7 @@ class WeaknetRepository : ILineRepository { OchChainLogManager.writeChainLogAutopilot("轨迹错误",this.toString()) CallerLogger.d(TAG,"轨迹错误,$this") } - LineManager.setContraiInfo(ContraiInfo(lineId!!,csvFileUrl!!,csvFileMd5!!,txtFileUrl!!,txtFileMd5!!,contrailSaveTime!!)) + LineManager.setContraiInfo(ContraiInfo(lineId!!,csvFileUrl!!,csvFileMd5!!,txtFileUrl!!,txtFileMd5!!,contrailSaveTime!!, source = source?: ContrailDataBean.SOURCETYPEROUTING)) } } return@flatMap Observable.just(true) @@ -479,6 +482,11 @@ class WeaknetRepository : ILineRepository { weakNetInterface?.queryCarExecutableTaskList(context,ochCommonServiceCallback) } + override fun queryPointsByLineIds(lines: MutableList): Observable>? { + val request = QueryPointRequest(LoginStatusManager.getOchBizInfo()?.businessType?:0,lines) + return weakNetInterface?.queryPointsByLinesId(context,request) + } + override fun reportCabinEvent( context: Context?, data: ShuttleEventRequest?, diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java index 3d8ce68708..8229e83ed7 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/NetInterface.java @@ -4,9 +4,11 @@ import android.content.Context; import com.mogo.och.common.module.network.OchCommonServiceCallback; import com.mogo.och.data.bean.BusRoutesResult; +import com.mogo.och.weaknet.bean.request.QueryPointRequest; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.eagle.core.data.BaseData; +import com.mogo.och.weaknet.bean.response.PointResponse; import com.mogo.och.weaknet.repository.db.bean.LineDataBean; import com.mogo.och.weaknet.repository.db.bean.TaskDataBean; import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; @@ -60,4 +62,8 @@ public interface NetInterface { default void queryCarExecutableTaskList(Context context , OchCommonServiceCallback callback){} default void reportCabinEvent(Context context , ShuttleEventRequest data , OchCommonServiceCallback callback){} + + default Observable> queryPointsByLinesId(Context context, QueryPointRequest data){ + return Observable.just(new ArrayList<>()); + } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java index 948e50d30c..775416efa5 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/ISaasBusApiService.java @@ -2,9 +2,11 @@ package com.mogo.och.weaknet.repository.net.project.saas.bus; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; +import com.mogo.och.weaknet.bean.request.QueryPointRequest; import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; +import com.mogo.och.weaknet.bean.response.PointsResponse; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean; @@ -65,5 +67,9 @@ public interface ISaasBusApiService { @POST( "/och-vehicle/cabin/reportCabinEvent" ) Observable reportCabinEvent(@Header ("appId") String appId, @Header("ticket") String ticket, @Body ShuttleEventRequest request); + @Headers( {"Content-Type:application/json;charset=UTF-8"} ) + @POST( "/och-contrail/contrail/queryCabinContrailByLines" ) + Observable queryCabinContrailByLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Body QueryPointRequest request); + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt index 196819f7e6..b83af4989c 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/bus/SaasBusServiceManager.kt @@ -11,8 +11,10 @@ import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.data.bean.BusRoutesResult +import com.mogo.och.weaknet.bean.request.QueryPointRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse import com.mogo.och.weaknet.bean.request.ShuttleEventRequest +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.repository.net.NetInterface import io.reactivex.Observable @@ -20,11 +22,12 @@ import io.reactivex.Observable * @author: wangmingjun * @date: 2021/10/20 */ -object SaasBusServiceManager: NetInterface { +object SaasBusServiceManager : NetInterface { - private val mService: ISaasBusApiService = MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( - ISaasBusApiService::class.java - ) + private val mService: ISaasBusApiService = + MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( + ISaasBusApiService::class.java + ) /** @@ -34,14 +37,14 @@ object SaasBusServiceManager: NetInterface { */ override fun queryBusRoutes(): Observable? { //获取当前高德坐标 - return mService.queryBusRoutes( + return mService.queryBusRoutes( MoGoAiCloudClientConfig.getInstance().serviceAppId, SharedPrefsMgr.getInstance().token, SharedPrefsMgr.getInstance().getSn() - ) .transformIoTry() - .flatMap(OchCommonNet("queryBusRoutes",false)) + ).transformIoTry() + .flatMap(OchCommonNet("queryBusRoutes", false)) .flatMap { - Observable.just(it.data?:BusRoutesResult()) + Observable.just(it.data ?: BusRoutesResult()) } } @@ -77,5 +80,21 @@ object SaasBusServiceManager: NetInterface { .subscribe(OchCommonSubscribeImpl(context, callback, "reportCabinEvent")) } + override fun queryPointsByLinesId( + context: Context?, + data: QueryPointRequest? + ): Observable>? { + return mService.queryCabinContrailByLines( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + data, + ) + .transformIoTry() + .flatMap(OchCommonNet("queryPointsByLinesId", false)) + .flatMap { + Observable.just(it.data ?: mutableListOf()) + } + } + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/ISaasScheduledApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/ISaasScheduledApiService.java index 8b6100aa34..f67f9fd676 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/ISaasScheduledApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/ISaasScheduledApiService.java @@ -2,9 +2,11 @@ package com.mogo.och.weaknet.repository.net.project.saas.scheduled; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; +import com.mogo.och.weaknet.bean.request.QueryPointRequest; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; +import com.mogo.och.weaknet.bean.response.PointsResponse; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean; @@ -65,5 +67,9 @@ public interface ISaasScheduledApiService { @POST( "/och-vehicle/cabin/reportCabinEvent" ) Observable reportCabinEvent(@Header ("appId") String appId, @Header("ticket") String ticket, @Body ShuttleEventRequest request); + @Headers( {"Content-Type:application/json;charset=UTF-8"} ) + @POST( "/och-contrail/contrail/queryCabinContrailByLines" ) + Observable queryCabinContrailByLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Body QueryPointRequest request); + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/SaasScheduledServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/SaasScheduledServiceManager.kt index c696fefd21..684f0c6a53 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/SaasScheduledServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/scheduled/SaasScheduledServiceManager.kt @@ -13,8 +13,10 @@ import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest +import com.mogo.och.weaknet.bean.request.QueryPointRequest import com.mogo.och.weaknet.bean.request.ShuttleEventRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.repository.net.NetInterface import io.reactivex.Observable @@ -77,5 +79,21 @@ object SaasScheduledServiceManager: NetInterface { .subscribe(OchCommonSubscribeImpl(context, callback, "reportCabinEvent")) } + override fun queryPointsByLinesId( + context: Context?, + data: QueryPointRequest? + ): Observable>? { + return mService.queryCabinContrailByLines( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + data, + ) + .transformIoTry() + .flatMap(OchCommonNet("queryPointsByLinesId",false)) + .flatMap { + Observable.just(it.data?: mutableListOf()) + } + } + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java index eb26f0f714..2fc046dd08 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/ISaasShuttleApiService.java @@ -2,9 +2,11 @@ package com.mogo.och.weaknet.repository.net.project.saas.shuttle; import com.mogo.eagle.core.data.BaseData; import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest; +import com.mogo.och.weaknet.bean.request.QueryPointRequest; import com.mogo.och.weaknet.bean.response.BusRoutesResponse; import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse; import com.mogo.och.weaknet.bean.request.ShuttleEventRequest; +import com.mogo.och.weaknet.bean.response.PointsResponse; import com.mogo.och.weaknet.bean.response.WriteOffCountResponse; import com.mogo.och.weaknet.repository.net.bean.request.PassengerWriteOffRequest; import com.mogo.och.weaknet.repository.net.bean.request.WriteOffCountReqBean; @@ -65,5 +67,9 @@ public interface ISaasShuttleApiService { @POST( "/och-vehicle/cabin/reportCabinEvent" ) Observable reportCabinEvent(@Header ("appId") String appId, @Header("ticket") String ticket, @Body ShuttleEventRequest request); + @Headers( {"Content-Type:application/json;charset=UTF-8"} ) + @POST( "/och-contrail/contrail/queryCabinContrailByLines" ) + Observable queryCabinContrailByLines(@Header ("appId") String appId, @Header("ticket") String ticket, @Body QueryPointRequest request); + } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt index 9af031601d..86c18fd5c2 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/repository/net/project/saas/shuttle/SaasShuttleServiceManager.kt @@ -13,8 +13,10 @@ import com.mogo.och.common.module.network.OchCommonSubscribeImpl import com.mogo.och.common.module.network.interceptor.transformIoTry import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.weaknet.bean.request.BusQueryLineStationsRequest +import com.mogo.och.weaknet.bean.request.QueryPointRequest import com.mogo.och.weaknet.bean.response.CarExecutableTaskResponse import com.mogo.och.weaknet.bean.request.ShuttleEventRequest +import com.mogo.och.weaknet.bean.response.PointResponse import com.mogo.och.weaknet.repository.net.NetInterface import io.reactivex.Observable @@ -77,5 +79,21 @@ object SaasShuttleServiceManager: NetInterface { .subscribe(OchCommonSubscribeImpl(context, callback, "reportCabinEvent")) } + override fun queryPointsByLinesId( + context: Context?, + data: QueryPointRequest? + ): Observable>? { + return mService.queryCabinContrailByLines( + MoGoAiCloudClientConfig.getInstance().serviceAppId, + SharedPrefsMgr.getInstance().token, + data, + ) + .transformIoTry() + .flatMap(OchCommonNet("queryPointsByLinesId",false)) + .flatMap { + Observable.just(it.data?: mutableListOf()) + } + } + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/bizswitch/SwitchBizView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/bizswitch/SwitchBizView.kt index b0d32ee51a..4441b498ce 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/bizswitch/SwitchBizView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/bizswitch/SwitchBizView.kt @@ -3,6 +3,7 @@ package com.mogo.och.weaknet.ui.bizswitch import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -20,16 +21,16 @@ import kotlinx.android.synthetic.main.shuttle_weak_switch_biz.view.swtichLine import kotlinx.android.synthetic.main.shuttle_weak_switch_biz.view.swtichTask import kotlinx.android.synthetic.main.shuttle_weak_switch_biz.view.taskRunning -class SwitchBizView: WindowRelativeLayout, SwtichBizModel.SwtichLineViewCallback { +class SwitchBizView: ConstraintLayout, SwtichBizModel.SwtichLineViewCallback { - constructor(context: Context?) : super(context) + constructor(context: Context) : super(context) - constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) + constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) - constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) companion object { diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/SwtichBizeModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/SwtichBizeModel.kt new file mode 100644 index 0000000000..1b650b2961 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/SwtichBizeModel.kt @@ -0,0 +1,54 @@ +package com.mogo.och.weaknet.ui.modeswitch + +import androidx.lifecycle.ViewModel +import com.mogo.commons.module.status.IMogoStatusChangedListener +import com.mogo.commons.module.status.MogoStatusManager +import com.mogo.commons.module.status.StatusDescriptor +import com.mogo.eagle.core.utilcode.util.UiThreadHandler + +/** + * @author XuXinChao + * @description BadCase录包管理页面 + * @since: 2022/12/15 + */ +class SwtichBizeModel : ViewModel() { + + private val TAG = SwtichBizeModel::class.java.simpleName + + private var viewCallback: SwtichLineViewCallback? = null + + + override fun onCleared() { + + } + + fun setDistanceCallback(viewCallback: SwtichLineViewCallback) { + this.viewCallback = viewCallback + this.viewCallback?.showTaskView() + MogoStatusManager.getInstance() + .registerStatusChangedListener( + TAG, StatusDescriptor.TAXI_UNMANED_DRIVER_LINE_ROUTING_VERIFY_MODE, moFanglistener + ) + } + + private var moFanglistener: IMogoStatusChangedListener? = object : IMogoStatusChangedListener { + override fun onStatusChanged(descriptor: StatusDescriptor?, isTrue: Boolean) { + if (StatusDescriptor.TAXI_UNMANED_DRIVER_LINE_ROUTING_VERIFY_MODE == descriptor) { + UiThreadHandler.post { + if (isTrue) {// 展示算路 + viewCallback?.showRoutingView() + } else {// 展示任务 + viewCallback?.showTaskView() + } + } + } + } + + } + + interface SwtichLineViewCallback { + fun showTaskView() + fun showRoutingView() + } +} + diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/TopSwitchBizView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/TopSwitchBizView.kt new file mode 100644 index 0000000000..719dad46f6 --- /dev/null +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/modeswitch/TopSwitchBizView.kt @@ -0,0 +1,78 @@ +package com.mogo.och.weaknet.ui.modeswitch + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.och.common.module.biz.routing.RoutingManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager +import com.mogo.och.common.module.wigets.WindowRelativeLayout +import com.mogo.och.shuttle.weaknet.R +import kotlinx.android.synthetic.main.shuttle_weak_biz.view.routingSwitchView +import kotlinx.android.synthetic.main.shuttle_weak_biz.view.switchOchBiz + +class TopSwitchBizView: WindowRelativeLayout, SwtichBizeModel.SwtichLineViewCallback { + + + constructor(context: Context?) : super(context) + + constructor(context: Context?, attributeSet: AttributeSet) : super(context, attributeSet) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) + + constructor(context: Context?, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) + + + companion object { + const val TAG = "SwitchBizView" + } + + private var viewModel: SwtichBizeModel?=null + + + + init { + LayoutInflater.from(context).inflate(R.layout.shuttle_weak_biz, this, true) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(SwtichBizeModel::class.java) + } + viewModel?.setDistanceCallback(this) + } + + override fun showTaskView() { + switchOchBiz.visibility = VISIBLE + routingSwitchView.visibility = GONE + RoutingManager.getRoutingView()?.let { + routingSwitchView.removeView(it) + } + } + + override fun showRoutingView() { + switchOchBiz.visibility = GONE + routingSwitchView.visibility = VISIBLE + RoutingManager.getRoutingView()?.let { + try { + if (it.parent!=null) { + (it.parent as ViewGroup).removeAllViews() + } + routingSwitchView.addView(it) + }catch (e:Exception){ + OchChainLogManager.writeChainLogError("添加routingview错误:TopSwitchBizView",e.message?:"") + } + } + } + + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + RoutingManager.getRoutingView()?.let { + routingSwitchView.removeView(it) + } + } + +} diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwtichLineModel.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwtichLineModel.kt index a26907646f..c5bd2c115f 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwtichLineModel.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/switchline/SwtichLineModel.kt @@ -8,7 +8,7 @@ import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.weaknet.callback.IBusLinesCallback import com.mogo.och.weaknet.model.LineModel -import com.mogo.och.weaknet.model.LineModel.EXECUTABLECHANGETIME +import com.mogo.och.weaknet.model.SynchDataModel.EXECUTABLECHANGETIME import com.mogo.och.weaknet.repository.RepositoryManager import com.mogo.och.weaknet.repository.db.bean.LineDataBean import io.reactivex.Observer diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt index ad45cff2ef..74e291bfd4 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/ui/taskrunning/TaskRunningView.kt @@ -27,7 +27,9 @@ import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.bus_task_ru import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.loading_arrive_station import kotlinx.android.synthetic.main.shuttle_weak_task_running.view.rl_running_task_station_list - +/** + * OCH业务的任务 + */ class TaskRunningView : ConstraintLayout, TaskRunningModel.SwtichLineViewCallback { @@ -80,6 +82,7 @@ class TaskRunningView : ConstraintLayout, TaskRunningModel.SwtichLineViewCallbac viewModel?.arriveStation() } actv_complete_task.onClick { + CallerLogger.d(TAG,"启动自驾参数:${LineManager.initAutopilotControlParameters()}") val builder = CommonDialogStatus.Builder() val closeLineConfirmDialog = builder .title(ResourcesUtils.getString(R.string.bus_dialog_title)) diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt index b22114fb57..e34733eb2d 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/BusTrajectoryManager.kt @@ -3,6 +3,7 @@ package com.mogo.och.weaknet.util import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.i import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.e import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant.Companion.M_BUS import com.mogo.eagle.core.utilcode.util.GsonUtils @@ -88,7 +89,7 @@ object BusTrajectoryManager : ITrajectoryListListener { "下发轨迹报错:没有轨迹或线路信息 contraiInfo:${LineManager.contraiInfo} lineInfos:${LineManager.lineInfos}" ) } else { - mAutopilotControlParameters = LineManager.initAutopilotControlParameters() + mAutopilotControlParameters = LineManager.initAutopilotControlParametersFromContrai() } } @@ -157,12 +158,12 @@ object BusTrajectoryManager : ITrajectoryListListener { mAutopilotControlParameters?.let { OchChainLogManager.writeChainLogTrajectory( "轨迹监控", - "sendTrajectoryReq() 下发轨迹 轨迹id:${it.autoPilotLine!!.lineId}" + "sendTrajectoryReq() 下发轨迹:${GsonUtils.toJson(mAutopilotControlParameters)}" ) CallerAutoPilotControlManager.sendTrajectoryDownloadReq(it, 0) } - d(TAG, "sendTrajectoryReq(): " + GsonUtils.toJson(mAutopilotControlParameters)) + i(TAG, "sendTrajectoryReq(): " + GsonUtils.toJson(mAutopilotControlParameters)) } } diff --git a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/ShuttleVoiceManager.kt b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/ShuttleVoiceManager.kt index 6c5113d6f4..bfac519aa7 100644 --- a/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/ShuttleVoiceManager.kt +++ b/OCH/shuttle/driver_weaknet/src/main/java/com/mogo/och/weaknet/util/ShuttleVoiceManager.kt @@ -7,7 +7,7 @@ import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.och.common.module.manager.socket.lan.LanSocketManager import com.mogo.och.common.module.manager.socket.lan.bean.AppConnectMsg import com.mogo.och.common.module.utils.ResourcesUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.shuttle.weaknet.R import com.mogo.skin.utils.SkinResources import com.mogo.tts.base.LangTtsEntity @@ -47,20 +47,11 @@ object ShuttleVoiceManager { VoiceNotice.showNotice(list, AIAssist.LEVEL1,null) } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { siteNameCN?.let { - sendArrivedStationToClient(it) + sendPassengerPlay( ResourcesUtils.getString(R.string.bus_arrived_station_tip,it)) } } } - private fun sendArrivedStationToClient(arriveStation: String) { - val arrivedMsg = AppConnectMsg( - isViewShow = false, - isPlay = true, - msg = ResourcesUtils.getString(R.string.bus_arrived_station_tip,arriveStation), - ) - LanSocketManager.sendMsgToClient(arrivedMsg) - } - fun leaveStationBus(siteNameCN: String?, siteNameKR: String?) { val list: MutableList = ArrayList() val context = AbsMogoApplication.getApp() @@ -88,20 +79,11 @@ object ShuttleVoiceManager { VoiceNotice.showNotice(list, AIAssist.LEVEL1,null) } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { siteNameCN?.let { - sendStartStationToClient(it) + sendPassengerPlay(ResourcesUtils.getString(R.string.bus_leave_station_tip,it)) } } } - private fun sendStartStationToClient(nextStation: String) { - val startMsg = AppConnectMsg( - isViewShow = false, - isPlay = true, - msg = ResourcesUtils.getString(R.string.bus_leave_station_tip,nextStation), - ) - LanSocketManager.sendMsgToClient(startMsg) - } - fun endOrderBus() { val context = AbsMogoApplication.getApp() val list: MutableList = ArrayList() @@ -115,40 +97,20 @@ object ShuttleVoiceManager { if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) { VoiceNotice.showNotice(list, AIAssist.LEVEL0,null) } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { - sendEndTaskToClient() + sendPassengerPlay(SkinResources.getInstance().getString(R.string.bus_end_task_tip)) } } - private fun sendEndTaskToClient() { - val endMsg = AppConnectMsg( - isViewShow = false, - isPlay = true, - msg = SkinResources.getInstance().getString(R.string.bus_end_task_tip), - ) - LanSocketManager.sendMsgToClient(endMsg) - } - fun writeOffCount(successNum:Int){ if(successNum<=1){ VoiceNotice.showNotice("核验通过", AIAssist.LEVEL3) - //sendWriteOffNumToClient("核验通过") }else{ VoiceNotice.showNotice("$successNum 人核验通过", AIAssist.LEVEL3) - //sendWriteOffNumToClient("$successNum 人核验通过") } } - private fun sendWriteOffNumToClient(msg: String?) { - val passengerMsg = AppConnectMsg( - isViewShow = false, - isPlay = true, - msg = msg!!, - ) - LanSocketManager.sendMsgToClient(passengerMsg) - } - // 距离发车还有1分钟 fun showLeafTime(tips: String) { @@ -160,4 +122,33 @@ object ShuttleVoiceManager { VoiceNotice.showNotice(reaseon, AIAssist.LEVEL3) } + fun leave200Distance(message:String){ + if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) { + VoiceNotice.showNotice(message, AIAssist.LEVEL0) + } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { + sendPassengerPlay(message) + } + } + + + fun collisionRisk() { + val message = ResourcesUtils.getString(R.string.m2_voice_collision_risk) + if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode)) { + VoiceNotice.showNotice(message, AIAssist.LEVEL0) + } else if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { + sendPassengerPlay(message) + arrivedStationOut("车辆遇到紧急情况,正在安全处理") + } + } + + private fun sendPassengerPlay(msg:String){ + val passengerMsg = AppConnectMsg( + isViewShow = false, + isPlay = true, + msg = msg, + ) + LanSocketManager.sendMsgToClient(passengerMsg) + } + + } \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_base_fragment.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_base_fragment.xml index ca6121f7c8..6cace80b45 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_base_fragment.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_base_fragment.xml @@ -14,7 +14,7 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml index f5b1760fd2..f3b78920e9 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/layout/shuttle_weak_switch_biz.xml @@ -1,37 +1,18 @@ - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml index 86c49dadfc..7b61aa283b 100644 --- a/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml +++ b/OCH/shuttle/driver_weaknet/src/main/res/values/strings.xml @@ -46,8 +46,10 @@ 确认 取消 - 蘑菇小巴正在进站 + 欢迎乘坐蘑菇小巴 + 蘑菇小巴正在进站 蘑菇小巴出发咯 + 尊敬的乘客,车辆遇到紧急情况,正在安全处理,请坐稳扶好,听从指引,感谢配合 diff --git a/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt b/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt index 1872937998..45054e55e3 100644 --- a/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt +++ b/OCH/shuttle/driver_weaknet/src/test/java/com/mogo/och/common/module/ExampleUnitTest.kt @@ -97,44 +97,44 @@ class ExampleUnitTest { @Test fun testData() { - val waitUpdateEvent= mutableListOf() - val waitUpdateWriteOffEvent = mutableListOf() - - waitUpdateEvent.add(EventDataBean(businessTime = 1)) - waitUpdateEvent.add(EventDataBean(businessTime = 3)) - waitUpdateEvent.add(EventDataBean(businessTime = 5)) - waitUpdateEvent.add(EventDataBean(businessTime = 6)) - waitUpdateEvent.add(EventDataBean(businessTime = 7)) - waitUpdateEvent.add(EventDataBean(businessTime = 9)) - waitUpdateEvent.add(EventDataBean(businessTime = 11)) - - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 2)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 4)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 5)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 8)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 10)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 12)) - waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 14)) - - - val eventList4Request = mutableListOf() - var tempEvent: Event?=null - waitUpdateEvent?.forEach { - tempEvent = Event(it.eventType, - EventData(it.taskId,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId) - ) - eventList4Request.add(tempEvent!!) - } - - waitUpdateWriteOffEvent?.forEach { - tempEvent = Event("WriteOff", - WriteOffEventData(it.msgId,it.taskId,it.siteId,it.driverId,it.orderNo,it.businessTime,it.businessTime) - ) - eventList4Request.add(tempEvent!!) - } - eventList4Request.sortBy { it.eventData.businessTime } - val md5Hex = DigestUtils.md5Hex(eventList4Request.toString()) - println(eventList4Request) +// val waitUpdateEvent= mutableListOf() +// val waitUpdateWriteOffEvent = mutableListOf() +// +// waitUpdateEvent.add(EventDataBean(businessTime = 1)) +// waitUpdateEvent.add(EventDataBean(businessTime = 3)) +// waitUpdateEvent.add(EventDataBean(businessTime = 5)) +// waitUpdateEvent.add(EventDataBean(businessTime = 6)) +// waitUpdateEvent.add(EventDataBean(businessTime = 7)) +// waitUpdateEvent.add(EventDataBean(businessTime = 9)) +// waitUpdateEvent.add(EventDataBean(businessTime = 11)) +// +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 2)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 4)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 5)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 8)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 10)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 12)) +// waitUpdateWriteOffEvent.add(WriteOffDataBean(businessTime = 14)) +// +// +// val eventList4Request = mutableListOf() +// var tempEvent: Event?=null +// waitUpdateEvent?.forEach { +// tempEvent = Event(it.eventType, +// EventData(it.taskId,it.businessTime,it.writeVersion,it.siteId,it.seq,it.driverId,it.msgId) +// ) +// eventList4Request.add(tempEvent!!) +// } +// +// waitUpdateWriteOffEvent?.forEach { +// tempEvent = Event("WriteOff", +// WriteOffEventData(it.msgId,it.taskId,it.siteId,it.driverId,it.orderNo,it.businessTime,it.businessTime) +// ) +// eventList4Request.add(tempEvent!!) +// } +// eventList4Request.sortBy { it.eventData.businessTime } +// val md5Hex = DigestUtils.md5Hex(eventList4Request.toString()) +// println(eventList4Request) } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java b/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java index 171ccfc774..0c81a59595 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/BusPassengerRouteFragment.java @@ -204,7 +204,7 @@ public class BusPassengerRouteFragment extends * @param isArrived 是否到站并离开,true 到达当前站 currentStationIndex 未离开, false 正在前往此站 currentStationIndex */ public void updateStationsInfo(List stations, int currentStationIndex, boolean isArrived) { - updateArrivedStation(stations.get(currentStationIndex).getName(),currentStationIndex,isArrived); + updateArrivedStation(stations.get(currentStationIndex).name,currentStationIndex,isArrived); mStationsList.clear(); mStationsList.addAll(stations); mAdapter.notifyDataSetChanged(); @@ -225,7 +225,7 @@ public class BusPassengerRouteFragment extends private void updateWayPointList(List stations,int currentStationIndex) { List mLineStationsList = new ArrayList<>(); for (int i = 0; i< stations.size(); i++) {//站点集合 - LatLng latLng = new LatLng(stations.get(i).getGcjLat(),stations.get(i).getGcjLon());// lat,lon + LatLng latLng = new LatLng(stations.get(i).gcjLat, stations.get(i).gcjLon);// lat,lon mLineStationsList.add(latLng); } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/adapter/BusPassengerLineStationsAdapter.java b/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/adapter/BusPassengerLineStationsAdapter.java index 162ebe88b5..0136edb3ea 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/adapter/BusPassengerLineStationsAdapter.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b1/com/mogo/och/shuttle/weaknet/passenger/ui/adapter/BusPassengerLineStationsAdapter.java @@ -48,14 +48,14 @@ public class BusPassengerLineStationsAdapter extends RecyclerView.Adapter "View初始化" + 1 -> "B2美化模式状态变更" + 2 -> "美化模式状态变更" + 3 -> "订单状态变更" + 4 -> "自动驾驶状态变更" + else -> "错误" + } + val autopilotState = CallerAutoPilotStatusListenerManager.getState() + CallerLogger.i( + TAG, + "数据刷新来源=$sourceStr 自动驾驶状态=${autopilotState} 订单状态=${CommonModel.inOrder} 美化模式状态=${FunctionBuildConfig.isDemoMode} B2美化模式状态=${FunctionBuildConfig.isB2DemoMode} " + ) + if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == autopilotState) { + return R.drawable.m2_status_parallel + } + + // 处理非平行驾驶状态的情况 + return when { + // 无订单的情况 + !CommonModel.inOrder -> { + R.drawable.m2_status_basic + } + // 有订单,且美化状态和b2美化状态任意开着 + CommonModel.inOrder && (FunctionBuildConfig.isDemoMode || FunctionBuildConfig.isB2DemoMode) -> { + R.drawable.m2_status_order_auto + } + // 有订单,且美化状态和b2美化状态都关着 + CommonModel.inOrder && !FunctionBuildConfig.isDemoMode && !FunctionBuildConfig.isB2DemoMode -> { + if (autopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) R.drawable.m2_status_order_auto else R.drawable.m2_status_basic + } + // 覆盖所有可能的情况 + else -> R.drawable.m2_status_basic } } - override fun updateAutoStatus(isAutoPilot: Boolean) { + private fun updateAutoIconState(source: Int) { BizLoopManager.runInMainThread { context?.let { - if (isAutoPilot) { - setTextColor(ContextCompat.getColor(it, R.color.common_FFFFFF)) - background = ContextCompat.getDrawable(it, R.drawable.m2_autopilot_status_in) - } else { - setTextColor(ContextCompat.getColor(it, R.color.common_284F7E)) - background = ContextCompat.getDrawable(it, R.drawable.m2_autopilot_status_out) - } + setTextColor(ContextCompat.getColor(it, R.color.common_FFFFFF)) + background = ContextCompat.getDrawable(it, getStateIcon(source)) } } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt index 55272e3a7b..1bdf51637e 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/LineView.kt @@ -78,7 +78,7 @@ class LineView : ConstraintLayout, LineViewModel.LineViewCallback { } override fun updateLineStations(stations: MutableList?) { - CallerLogger.d(TAG,"展示站点:${stations}") +// CallerLogger.d(TAG,"展示站点:${stations}") mAdapter.submitList(stations) } @@ -88,5 +88,8 @@ class LineView : ConstraintLayout, LineViewModel.LineViewCallback { } } + fun clear(){ + mAdapter.clear() + } } \ No newline at end of file diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt index 50a2d41441..b703ca71ce 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationAdapter.kt @@ -9,15 +9,16 @@ import com.mogo.och.shuttle.weaknet.passenger.R class StationAdapter : ListAdapter(MessageDiffCallback()) { var currentIndex = 0 - var isLeaving = false - var showPassOmit = false - var showFuluterOmit = false + var distanceAndTime = "" override fun submitList(list: MutableList?) { val newDataList = mutableListOf() + var isLeaving = false list?.let { + var showPassOmit = false + var showFuluterOmit = false it.forEachIndexed { index, busStationBean -> if (busStationBean.drivingStatus == 2) { currentIndex = index @@ -166,13 +167,23 @@ class StationAdapter : ListAdapter(MessageDif } } + fun clear() { + super.submitList(null) + currentIndex = 0 + distanceAndTime = "" + } + + + override fun onViewRecycled(holder: StationViewHolder) { super.onViewRecycled(holder) holder.viewRecycled(holder) } fun notifyDistanceAndTime(distance: String, time: String) { - distanceAndTime = "${distance}·${time}" - notifyItemChanged(currentIndex) + if (currentList.isNotEmpty() && currentIndex < itemCount) { + distanceAndTime = "${distance}·${time}" + notifyItemChanged(currentIndex) + } } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationViewHolder.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationViewHolder.kt index 5c987951d6..7efbd756fa 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationViewHolder.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/line/lineinfo/item/StationViewHolder.kt @@ -62,7 +62,7 @@ class CurrentStationViewHolder(binding: View) : StationViewHolder(binding) { private var currentStaionName: OCHGradientTextView = binding.findViewById(R.id.och_current_station_name) private var actv_distance: AppCompatTextView = binding.findViewById(R.id.actv_distance) override fun bind(item: BusStationBean,distanceAndView:String) { - var text = item.name + var text = item.name?:"" if(text.length>12){ text = text.slice(0..10)+"…" } @@ -91,7 +91,7 @@ class CurrentStationEndViewHolder(binding: View) : StationViewHolder(binding) { private var currentStaionEndName: OCHGradientTextView = binding.findViewById(R.id.och_current_station_end_name) private var actv_distance_end: AppCompatTextView = binding.findViewById(R.id.actv_distance_end) override fun bind(item: BusStationBean,distanceAndView:String) { - var text = item.name + var text = item.name?:"" if(text.length>12){ text = text.slice(0..10)+"…" } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindView.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindView.kt index 81a274fec9..975953b1f6 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindView.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindView.kt @@ -97,10 +97,10 @@ class MindView : ConstraintLayout, MindViewModel.AiViewCallback { ViewModelProvider(it)[RoadCrossRoamViewModel::class.java] } roadCrossRoamModel?.init(context) - automaticExplorationModel = findViewTreeViewModelStoreOwner()?.let{ - ViewModelProvider(it)[AutomaticExplorationViewModel::class.java] - } - automaticExplorationModel?.init() +// automaticExplorationModel = findViewTreeViewModelStoreOwner()?.let{ +// ViewModelProvider(it)[AutomaticExplorationViewModel::class.java] +// } +// automaticExplorationModel?.init() ndeViewModel = findViewTreeViewModelStoreOwner()?.let{ ViewModelProvider(it)[NDEViewModel::class.java] } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindViewModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindViewModel.kt index f2b02dbe69..e340b41314 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindViewModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/b2/com/mogo/och/shuttle/weaknet/passenger/ui/mind/MindViewModel.kt @@ -2,7 +2,6 @@ package com.mogo.och.shuttle.weaknet.passenger.ui.mind import android.util.Log import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import com.mogo.eagle.core.data.ai.V2XRepository import com.mogo.eagle.core.data.map.MogoLocation import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener @@ -10,15 +9,12 @@ import com.mogo.och.shuttle.weaknet.passenger.ui.mind.bean.AIMessage import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.common.module.biz.birdge.BridgeListener import com.mogo.och.common.module.biz.birdge.BridgeManager -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.shuttle.weaknet.passenger.callback.ICommonCallback import com.mogo.och.shuttle.weaknet.passenger.model.CommonModel -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharedFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.launch class MindViewModel : ViewModel(), AIMessageManager.AIMessageListener, BridgeListener { diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt index b4ed489ec3..f4cbc1800a 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/ShuttlePassengerProvider.kt @@ -6,13 +6,10 @@ import androidx.fragment.app.Fragment import com.alibaba.android.arouter.facade.annotation.Route import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils -import com.mogo.eagle.core.utilcode.util.ActivityUtils import com.mogo.eagle.core.utilcode.util.DeviceUtils -import com.mogo.eagle.core.utilcode.util.MultiDisplayUtils +import com.mogo.och.common.module.biz.media.MediaManager import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.biz.provider.CommonServiceImpl -import com.mogo.och.common.module.voice.OutOffVoice -import com.mogo.och.common.module.wigets.media.MediaPlayerActivity import com.mogo.och.shuttle.weaknet.passenger.model.TicketModel import com.mogo.och.shuttle.weaknet.passenger.ui.widget.BusPStatusBarView import com.mogo.och.shuttle.weaknet.passenger.ui.BusPassengerRouteFragment @@ -49,7 +46,7 @@ class ShuttlePassengerProvider : CommonServiceImpl() { override fun getFragment(): Fragment { if (AppIdentityModeUtils.isB1(FunctionBuildConfig.appIdentityMode) && DeviceUtils.isEB5Model()) { - MultiDisplayUtils.startActWithSecond(ActivityUtils.getTopActivity(), MediaPlayerActivity::class.java) + MediaManager.Video.startSecondAds() } if(mPM2Fragment==null){ mPM2Fragment = if (AppIdentityModeUtils.isB2(FunctionBuildConfig.appIdentityMode)) { @@ -61,14 +58,14 @@ class ShuttlePassengerProvider : CommonServiceImpl() { } } TicketModel.load() - OutOffVoice.load() + MediaManager.Tts.loadOuttts() return mPM2Fragment!! } override fun resetFragment() { super.resetFragment() TicketModel.release() - OutOffVoice.release() + MediaManager.Tts.releaesOuttts() mPM2Fragment = null } diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java index e0b6371ea9..d67aa4ca25 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/callback/ICommonCallback.java @@ -20,6 +20,8 @@ public interface ICommonCallback { */ default void updateAutoStatus(boolean isOpen){} + default void updateAutoStatus(int state){} + default void updateInOrderStatus(boolean inOrder){} default void updateLineStations(List stations){} default void clearCustomPolyline(){} diff --git a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt index d8f10eab4d..3d2b106e1d 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt +++ b/OCH/shuttle/passenger_weaknet/src/main/java/com/mogo/och/shuttle/weaknet/passenger/model/CommonModel.kt @@ -25,6 +25,7 @@ import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.bridge.distance.IDistanceListener import com.mogo.och.bridge.distance.TrajectoryAndDistanceManager import com.mogo.och.common.module.biz.birdge.BridgeManager +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.och.common.module.constant.OchCommonConst import com.mogo.och.common.module.manager.download.DownloadManager import com.mogo.och.common.module.manager.socket.cloud.OCHSocketMessageManager @@ -37,8 +38,6 @@ import com.mogo.och.common.module.manager.socket.lan.bean.TaskDetailsMsg import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.PinYinUtil -import com.mogo.och.common.module.voice.VoiceNotice.showNotice -import com.mogo.och.common.module.wigets.media.MediaItem import com.mogo.och.data.bean.BusRoutesResult import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.BusTransferData @@ -54,7 +53,7 @@ object CommonModel { private val TAG: String = SceneConstant.M_BUS_P+CommonModel::class.java.simpleName var mContext: Context? = null - + var inOrder = false private var mCommonCallbackList = mutableMapOf() @@ -141,12 +140,12 @@ object CommonModel { override fun onAutopilotStatusResponse(state: Int) { d(TAG, "onAutopilotStatusResponse ===== $state") + mCommonCallbackList.forEach { + it.value.updateAutoStatus(state) + } if (IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING != state){ //美化模式下且行程中 - if (FunctionBuildConfig.isDemoMode && - mNextStationIndex >= 0 && mNextStationIndex <= mStations.size - 1 - && isGoingToNextStation - ){ + if (FunctionBuildConfig.isDemoMode && inOrder()) { mCommonCallbackList.forEach { it.value.updateAutoStatus(true) } @@ -174,16 +173,6 @@ object CommonModel { } } } - // 小于200m 播报站点介绍 - if (distance < 200) { - val stationNext = mStations[mNextStationIndex] - if (!stationNext.isPlayTts) { - if (!StringUtils.isEmpty(stationNext.introduction)) { - showNotice(stationNext.introduction) - stationNext.isPlayTts = true - } - } - } mCommonCallbackList.forEach { it.value.updateRemainMT( distance.toLong(), @@ -243,6 +232,21 @@ object CommonModel { mCommonCallbackList.forEach { it.value.showNoTaskView(true) } + dispatchInOrder() + } + + private fun dispatchInOrder() { + val newValue = inOrder() + if (inOrder != newValue) { + inOrder = newValue + mCommonCallbackList.forEach { + it.value.updateInOrderStatus(newValue) + } + } + } + + private fun inOrder(): Boolean { + return mNextStationIndex >= 0 && mNextStationIndex <= mStations.size - 1 && isGoingToNextStation } @@ -289,6 +293,7 @@ object CommonModel { val endStation = mStations[i + 1] startStationVideo(endStation) setTrajectoryStation(startStation, endStation, result.lineId) + dispatchInOrder() return } else if (!station.isLeaving) { if (i == stations.size - 1) { @@ -299,6 +304,7 @@ object CommonModel { mCommonCallbackList.forEach { it.value.updateStationsInfo(stations, i, true) } + dispatchInOrder() return } } diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_autopilot_status_in.png b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_autopilot_status_in.png deleted file mode 100644 index 15717e08b4..0000000000 Binary files a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_autopilot_status_in.png and /dev/null differ diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_basic.png b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_basic.png new file mode 100644 index 0000000000..15b1644451 Binary files /dev/null and b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_basic.png differ diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_order_auto.png b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_order_auto.png new file mode 100644 index 0000000000..129dbfa442 Binary files /dev/null and b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_order_auto.png differ diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_parallel.png b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_parallel.png new file mode 100644 index 0000000000..45f4ea8ef3 Binary files /dev/null and b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_status_parallel.png differ diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_autopilot_status_out.png b/OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_turn_light_bg.png similarity index 100% rename from OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_autopilot_status_out.png rename to OCH/shuttle/passenger_weaknet/src/main/res/b2/drawable-nodpi/m2_turn_light_bg.png diff --git a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_autopilot.xml b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_autopilot.xml index ac7fa74f8f..9759a732ea 100644 --- a/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_autopilot.xml +++ b/OCH/shuttle/passenger_weaknet/src/main/res/b2/layout/m2_autopilot.xml @@ -24,10 +24,10 @@ ):BaseData() data class StartStationBean(var distance2Current:Float):BusStationBean() { fun toResult(): StartServiceRespBean.Result { - return StartServiceRespBean.Result(siteId.toLong(),name,gcjLat,gcjLon,lon,lat) + return StartServiceRespBean.Result(siteId.toLong(),name?:"",gcjLat,gcjLon,lon,lat) } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt index c694040287..6712e5df0c 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/bean/TaxiDriverTaskWithOrderBean.kt @@ -250,6 +250,32 @@ data class OrderCompletedReqBean( var sn: String, var orderNo: String ) +/** + * 站点信息 + */ +data class RoutingSite( + var siteId: Long,// 站点ID + var siteName: String,// 站点名称 + var gcjLat: Double,// 高德坐标 + var gcjLon: Double,// 高德坐标 + var wgs84Lon: Double,//高精坐标 + var wgs84Lat: Double,//高精坐标 + var pointType: Int // 1:途径点 2:禁行点 3:站点 +) { + fun toBusStationBean(): BusStationBean { + val temp = BusStationBean() + temp.siteId = siteId.toInt() + temp.name = siteName + temp.lat = wgs84Lat + temp.lon = wgs84Lon + temp.gcjLat = gcjLat + temp.gcjLon = gcjLon + temp.pointType = pointType + temp.isLeaving = true + return temp + } +} + /** * 轨迹路线 */ diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt deleted file mode 100644 index 639dc98d64..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/callback/ITaxiRoutingCallback.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.mogo.och.unmanned.taxi.callback - -import com.mogo.och.unmanned.taxi.bean.GrayLineBean -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp - -interface ITaxiRoutingCallback { - /** - * 查询灰度路线列表--成功✅ - */ - fun onQueryRoutingGrayLineListSuccess(data: MutableList) - - /** - * 查询灰度路线列表--失败❌ - * @param errorStr 错误信息 - */ - fun onQueryRoutingGrayLineListFailed(errorStr: String) - - /** - * 灰度任务&查询轨迹详情--成功✅ - */ - fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) - - /** - * 灰度任务&查询轨迹详情--失败❌ - * @param errorStr 错误信息 - */ - fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) - - /** - * 灰度任务过程中,上报问题打点--成功✅ - */ - fun onSubmitGrayLineIssueLocationSuccess() - - /** - * 灰度任务过程中,上报问题打点--失败❌ - * @param errorStr 错误信息 - */ - fun onSubmitGrayLineIssueLocationFailed(errorStr: String) - - /** - * 结束灰度任务--成功✅ - */ - fun onSubmitEndTaskSuccess() - - /** - * 结束灰度任务--成功❌ - * @param errorStr 错误信息 - */ - fun onSubmitEndTaskFailed(errorStr: String) - - /** - * MAP到站通知 - * @param grayId 灰度路线ID - */ - fun onAutoPilotArriveAtEndStation(grayId: Long?) - - /** - * 自车定位围栏 - * @param grayId 灰度路线ID - */ - fun onGDMapArriveAtEndStation(grayId: Long?) -} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt deleted file mode 100644 index d7be74f6e9..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/network/TaxiRoutingServiceManager.kt +++ /dev/null @@ -1,155 +0,0 @@ -package com.mogo.och.unmanned.taxi.network - -import android.content.Context -import com.mogo.commons.storage.SharedPrefsMgr -import com.mogo.eagle.core.data.BaseData -import com.mogo.eagle.core.network.MoGoRetrofitFactory -import com.mogo.och.common.module.constant.OchCommonConst -import com.mogo.och.common.module.network.OchCommonServiceCallback -import com.mogo.och.common.module.network.OchCommonSubscribeImpl -import com.mogo.och.common.module.network.interceptor.transformTry -import com.mogo.och.unmanned.taxi.bean.EndGrayContrailTaskReq -import com.mogo.och.unmanned.taxi.bean.GrayLineBean -import com.mogo.och.unmanned.taxi.bean.QueryGrayContrailListRsp -import com.mogo.och.unmanned.taxi.bean.QueryPointErrorReasonsRsp -import com.mogo.och.unmanned.taxi.bean.QueryRoutingContrailByIdRsp -import com.mogo.och.unmanned.taxi.bean.SaveGrayContrailErrorReasons -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.bean.StartGrayContrailTaskReq -import com.mogo.och.unmanned.taxi.bean.StartGrayContrailTaskRsp -import com.mogo.och.unmanned.taxi.bean.SubmitGrayLineIssueLocationReq -import io.reactivex.Observable - -object TaxiRoutingServiceManager { - - private var mRoutingServiceApi: TaxiRoutingServiceApi = - MoGoRetrofitFactory.getInstance(OchCommonConst.getBaseUrl()).create( - TaxiRoutingServiceApi::class.java - ) - - /** - * 查询灰度路线列表 - */ - fun queryRoutingGrayLineList( - context: Context, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.queryRoutingGrayLineList( - sn = SharedPrefsMgr.getInstance().sn - ) - .transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingGrayLineList")) - } - - /** - * 开始一个灰度任务 - */ - fun startGrayTask( - context: Context, - data: StartGrayContrailTaskReq, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.startGrayTask(data = data).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "startGrayTask")) - } - - /** - * 通过id查询轨迹详情 - */ - fun queryRoutingContrailById( - context: Context, - contrailId: Long, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "queryRoutingContrailById")) - } - - /** - * 上报线路打点 - */ - fun submitGrayLineIssueLocation( - context: Context, - data: SubmitGrayLineIssueLocationReq, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.submitGrayLineIssueLocation(data = data).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "submitGrayLineIssueLocation")) - } - - /** - * 结束一个灰度任务 - */ - fun endGrayTask( - context: Context, - data: EndGrayContrailTaskReq, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.endGrayTask(data = data).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "endGrayTask")) - } - - fun getErrorPointReasons( - context: Context, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.getDotErrorList().transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) - } - fun saveDotDetail( - context: Context, - data: SaveGrayContrailErrorReasons, - callback: OchCommonServiceCallback - ) { - mRoutingServiceApi.saveDotDetail(data = data).transformTry() - .subscribe(OchCommonSubscribeImpl(context, callback, "dot/list")) - } - - /** - * 标记灰度任务被启动验证 - */ - fun startGrayTaskAndQueryRoutingContrail( - context: Context, - sn: String, - contrailId: Long, - grayLineBean: GrayLineBean, - callback: OchCommonServiceCallback - ) { - val data = StartGrayContrailTaskReq(sn = sn, contrailId = contrailId) - var taskId: Long - mRoutingServiceApi.startGrayTask(data = data) - .flatMap { startGrayRsp -> - if (startGrayRsp.data == null) { - taskId = -1L - val result = StartGrayAndQueryContrailRsp( - taskId = taskId, - contrail = null, - grayLineBean = grayLineBean - ) - result.code = startGrayRsp.code - result.msg = startGrayRsp.msg - return@flatMap Observable.just(result) - } - taskId = startGrayRsp.data!! - return@flatMap mRoutingServiceApi.queryRoutingContrailById(contrailId = contrailId) - .map { queryRoutingContrailRsp -> - val result = StartGrayAndQueryContrailRsp( - taskId = taskId, - contrail = queryRoutingContrailRsp.data, - grayLineBean = grayLineBean - ) - result.code = queryRoutingContrailRsp.code - result.msg = queryRoutingContrailRsp.msg - result - } - } - .transformTry() - .subscribe( - OchCommonSubscribeImpl( - context, - callback, - "startGrayTaskAndQueryRoutingContrail" - ) - ) - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt index 104f9bbab6..cfd4d7ed60 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiFragment.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import android.content.Context import android.os.Bundle import android.view.View +import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentTransaction import com.mogo.commons.module.status.MogoStatusManager import com.mogo.commons.mvp.MvpFragment @@ -18,7 +19,6 @@ import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.map.listener.IMogoMapListener import com.mogo.map.uicontroller.VisualAngleMode -import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus import com.mogo.och.data.taxi.TaxiOrderStatusEnum import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.common.module.wigets.StartAutopilotAnimationView @@ -27,7 +27,7 @@ import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.constant.TaxiDriverEventConst import com.mogo.och.unmanned.taxi.constant.TaxiUnmannedConst.Companion.START_AUTOPILOT_ANIMATION_INTERVAL import com.mogo.och.unmanned.taxi.ui.navi.amap.TaxiAmapNaviFragment -import com.mogo.och.unmanned.taxi.ui.navi.auto.TaxiRoutingNaviFragment +import com.mogo.och.common.module.biz.routing.RoutingManager import com.mogo.och.unmanned.taxi.ui.operational.OperationalManager import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel import com.mogo.och.unmanned.taxi.ui.task.itinerarycurrent.ItineraryCurrentView @@ -52,7 +52,7 @@ class TaxiFragment :MvpFragment(), private var ochAmapNaviFragment: TaxiAmapNaviFragment? = null // 高德地图轨迹展示fragment - private var taxiRoutingNaviFragment: TaxiRoutingNaviFragment? = null + private var taxiRoutingNaviFragment: Fragment? = null private val runningTaskGateWay = "RUNNINGTASKGATEWAY" private val lineView = "LINEVIEW" @@ -231,24 +231,24 @@ class TaxiFragment :MvpFragment(), } fun showRoutingToStationFragment(isShow: Boolean) { - val transaction: FragmentTransaction = childFragmentManager.beginTransaction() - closeRoutingViewIfHadAdd() - if (isShow) { - closeAmapViewIFHadeAdd() - taxiRoutingNaviFragment = TaxiRoutingNaviFragment.newInstance() - if (taxiRoutingNaviFragment!!.isAdded) { - return - } - transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRoutingNaviFragment!!) - .show(taxiRoutingNaviFragment!!) - transaction.commitAllowingStateLoss() - taxi_close_navi_icon.visibility = View.VISIBLE - module_mogo_och_navi_panel_container.visibility = View.VISIBLE - } else { - taxi_close_navi_icon.visibility = View.GONE - module_mogo_och_navi_panel_container.visibility = - View.INVISIBLE //2023.9.4高德导航由gone设置成INVISIBLE,保留导航实例,避免导航被挂起 - } +// val transaction: FragmentTransaction = childFragmentManager.beginTransaction() +// closeRoutingViewIfHadAdd() +// if (isShow) { +// closeAmapViewIFHadeAdd() +// taxiRoutingNaviFragment = TaxiRoutingNaviFragment.newInstance() +// if (taxiRoutingNaviFragment!!.isAdded) { +// return +// } +// transaction.add(R.id.module_mogo_och_navi_panel_container, taxiRoutingNaviFragment!!) +// .show(taxiRoutingNaviFragment!!) +// transaction.commitAllowingStateLoss() +// taxi_close_navi_icon.visibility = View.VISIBLE +// module_mogo_och_navi_panel_container.visibility = View.VISIBLE +// } else { +// taxi_close_navi_icon.visibility = View.GONE +// module_mogo_och_navi_panel_container.visibility = +// View.INVISIBLE //2023.9.4高德导航由gone设置成INVISIBLE,保留导航实例,避免导航被挂起 +// } } fun startNaviToEndStation(isShow: Boolean) { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java index af16444d12..b7b391af5f 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/base/TaxiPresenter.java @@ -14,6 +14,8 @@ import com.mogo.och.common.module.biz.login.ILoginCallback; import com.mogo.och.common.module.biz.login.EnumLoginStatus; import com.mogo.och.common.module.biz.login.LoginStatusManager; import com.mogo.och.common.module.biz.login.EnumOpenOrderStatus; +import com.mogo.och.common.module.biz.routing.RoutingCallback; +import com.mogo.och.common.module.biz.routing.RoutingManager; import com.mogo.och.unmanned.taxi.utils.order.OrderListener; import com.mogo.och.unmanned.taxi.utils.order.OrderModel; import com.mogo.och.data.taxi.TaxiOrderStatusEnum; @@ -23,7 +25,6 @@ import com.mogo.och.data.taxi.BaseOrderBean; import com.mogo.och.unmanned.taxi.callback.ITaxiADASStatusCallback; import com.mogo.och.unmanned.taxi.callback.ITaxiControllerStatusCallback; import com.mogo.och.unmanned.taxi.callback.ITaxiOrderStatusCallback; -import com.mogo.och.unmanned.taxi.ui.routing.TaxiRoutingModel; import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel; /** @@ -33,7 +34,7 @@ import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel; * 描述 */ public class TaxiPresenter extends Presenter implements ITaxiADASStatusCallback, - ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback, OrderListener { + ITaxiOrderStatusCallback, ITaxiControllerStatusCallback, ILoginCallback, OrderListener, RoutingCallback { private static final String TAG = TaxiPresenter.class.getSimpleName(); @@ -55,7 +56,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiTaskModel.INSTANCE.setADASStatusCallback(this); TaxiTaskModel.INSTANCE.setControllerStatusCallback(this); TaxiTaskModel.INSTANCE.setOrderStatusCallback(this); - TaxiRoutingModel.INSTANCE.setOrderStatusCallback(this); + RoutingManager.INSTANCE.setRoutingCallback(this); LoginStatusManager.INSTANCE.addListener(TAG,this); OrderModel.INSTANCE.setOrderStatusCallback(TAG,this); OchTransform.INSTANCE.addListener(TAG,ochTransform); @@ -65,6 +66,7 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS TaxiTaskModel.INSTANCE.setADASStatusCallback(null); TaxiTaskModel.INSTANCE.setControllerStatusCallback(null); TaxiTaskModel.INSTANCE.setOrderStatusCallback(null); + RoutingManager.INSTANCE.setRoutingCallback(null); OCHAdasAbilityManager.getInstance().release(); TaxiTaskModel.INSTANCE.setMoGoAutopilotPlanningListener(null); LoginStatusManager.INSTANCE.removeListener(TAG); @@ -226,4 +228,9 @@ public class TaxiPresenter extends Presenter implements ITaxiADASS } } } + + @Override + public void showMap(boolean show) { + mView.showAmapNaviToStationFragment(show); + } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/bizswitch/SwitchBizView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/bizswitch/SwitchBizView.kt index 33d04a3975..0a21109c89 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/bizswitch/SwitchBizView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/bizswitch/SwitchBizView.kt @@ -3,8 +3,11 @@ package com.mogo.och.unmanned.taxi.ui.bizswitch import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.ViewGroup import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner +import com.mogo.och.common.module.biz.routing.RoutingManager +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.wigets.WindowRelativeLayout import com.mogo.och.unmanned.taxi.R import kotlinx.android.synthetic.main.unmanned_switch_biz.view.itinerarySwitchView @@ -45,11 +48,31 @@ class SwitchBizView: WindowRelativeLayout, SwtichBizeModel.SwtichLineViewCallbac override fun showTaskView() { itinerarySwitchView.visibility = VISIBLE routingSwitchView.visibility = GONE + RoutingManager.getRoutingView()?.let { + routingSwitchView.removeView(it) + } } override fun showRoutingView() { itinerarySwitchView.visibility = GONE routingSwitchView.visibility = VISIBLE + RoutingManager.getRoutingView()?.let { + try { + if (it.parent!=null) { + (it.parent as ViewGroup).removeAllViews() + } + routingSwitchView.addView(it) + }catch (e:Exception){ + OchChainLogManager.writeChainLogError("添加routingview错误:SwitchBizView",e.message?:"") + } + } + } + + override fun onDetachedFromWindow() { + RoutingManager.getRoutingView()?.let { + routingSwitchView.removeView(it) + } + super.onDetachedFromWindow() } } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt deleted file mode 100644 index f5c3afe577..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/TaxiRoutingModel.kt +++ /dev/null @@ -1,24 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing - -import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant - -import com.mogo.och.unmanned.taxi.callback.ITaxiOrderStatusCallback - -object TaxiRoutingModel { - private val TAG = SceneConstant.M_TAXI + TaxiRoutingModel::class.java.simpleName - - private var mOrderStatusCallback: ITaxiOrderStatusCallback? = null - - fun setOrderStatusCallback(callback: ITaxiOrderStatusCallback?) { - mOrderStatusCallback = callback - } - - /** - * 显示/隐藏 前往任务目的地的导航 - * - * @param isShow - */ - fun startNaviToEndStationByAMap(isShow: Boolean) { - mOrderStatusCallback?.onNaviToEnd(true, isShow) - } -} \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt deleted file mode 100644 index 51218eac35..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/routing/routingselect/RoutingSelectView.kt +++ /dev/null @@ -1,142 +0,0 @@ -package com.mogo.och.unmanned.taxi.ui.routing.routingselect - -import android.content.Context -import android.util.AttributeSet -import android.view.LayoutInflater -import android.view.View -import androidx.constraintlayout.widget.ConstraintLayout -import androidx.lifecycle.ViewModelProvider -import androidx.lifecycle.findViewTreeViewModelStoreOwner -import com.mogo.eagle.core.utilcode.mogo.view.SpacesItemDecoration -import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager -import com.mogo.och.unmanned.taxi.R -import com.mogo.och.unmanned.taxi.bean.GrayLineBean -import com.mogo.och.unmanned.taxi.bean.StartGrayAndQueryContrailRsp -import com.mogo.och.unmanned.taxi.ui.debug.DebugView -import com.mogo.och.unmanned.taxi.ui.routing.RoutingSwitchModel -import com.mogo.och.unmanned.taxi.ui.routing.routingselect.RoutingSelectModel.SwtichRoutingViewCallback -import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_empty -import kotlinx.android.synthetic.main.unmanned_routing_select.view.include_error -import kotlinx.android.synthetic.main.unmanned_routing_select.view.switch_routing_rv -import me.jessyan.autosize.utils.AutoSizeUtils - -class RoutingSelectView: ConstraintLayout, SwtichRoutingViewCallback { - - - constructor(context: Context) : super(context) - - constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) - - constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr) - - constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes) - - - companion object { - const val TAG = "SwitchBizView" - } - - private var viewModel: RoutingSelectModel?=null - private var swtichViewModel: RoutingSwitchModel?=null - - private lateinit var mChooseLineListAdapter: RoutingItemAdapter - private lateinit var mLinearLayoutManager: WrapContentLinearLayoutManager - private val mRoutingLineList: MutableList = ArrayList() - private var mCurrentChosenPosition: Int = -1 - - - - init { - LayoutInflater.from(context).inflate(R.layout.unmanned_routing_select, this, true) - initView() - } - - private fun initView(){ - - - mLinearLayoutManager = WrapContentLinearLayoutManager(context) - switch_routing_rv.layoutManager = mLinearLayoutManager - mChooseLineListAdapter = RoutingItemAdapter(context, mRoutingLineList) - switch_routing_rv.addItemDecoration(SpacesItemDecoration(AutoSizeUtils.dp2px(context,20f))) - switch_routing_rv.adapter = mChooseLineListAdapter - //设置item 点击事件 - mChooseLineListAdapter.setOnLineItemClickListener(object : RoutingItemAdapter.LineItemClickListener { - override fun onItemClick(data: GrayLineBean) { - if(data.contrailId==null||data.contrailId!!<=0L){ - ToastUtils.showShort("请设置轨迹信息") - } - DebugView.printInfoMsg("[选择灰度任务] 当前选择 mCurrentChosenPosition=$mCurrentChosenPosition, ") - swtichViewModel?.showLoading() - viewModel?.startGrayTaskAndQueryRoutingContrail(data.contrailId!!,data) - } - }) - } - - private fun showEmptyView() { - switch_routing_rv.visibility = GONE - include_empty.visibility = View.VISIBLE - include_error.visibility = View.GONE - } - - private fun showErrorView() { - switch_routing_rv.visibility = GONE - include_empty.visibility = View.GONE - include_error.visibility = View.VISIBLE - } - - private fun showRecyclerView() { - switch_routing_rv.visibility = VISIBLE - include_empty.visibility = View.GONE - include_error.visibility = View.GONE - } - - - private fun onRoutingGrayLineListChanged(data: MutableList) { - if (data.isNotEmpty()) { - showRecyclerView() - mRoutingLineList.clear() - mRoutingLineList.addAll(data) - mChooseLineListAdapter.notifyDataSetChanged() - } else { - showEmptyView() - } - } - - - override fun onAttachedToWindow() { - super.onAttachedToWindow() - viewModel = findViewTreeViewModelStoreOwner()?.let { - ViewModelProvider(it).get(RoutingSelectModel::class.java) - } - viewModel?.setDistanceCallback(this) - - swtichViewModel = findViewTreeViewModelStoreOwner()?.let { - ViewModelProvider(it).get(RoutingSwitchModel::class.java) - } - } - - override fun onVisibilityAggregated(isVisible: Boolean) { - super.onVisibilityAggregated(isVisible) - if(isVisible){ - viewModel?.queryRoutingGrayLineList() - } - } - - override fun onQueryRoutingGrayLineListSuccess(data: MutableList) { - onRoutingGrayLineListChanged(data) - } - - override fun onQueryRoutingGrayLineListFailed(errorStr: String) { - showErrorView() - } - - override fun onStartGrayTaskAndQueryContrailSuccess(data: StartGrayAndQueryContrailRsp) { - swtichViewModel?.showRoutingRunning(data) - } - - override fun onStartGrayTaskAndQueryContrailFailed(errorStr: String) { - swtichViewModel?.showRoutingSelectView() - } - -} diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt index 689769189c..d3ab0ebc36 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/TaxiTaskModel.kt @@ -1,12 +1,9 @@ package com.mogo.och.unmanned.taxi.ui.task import android.content.Context -import android.net.ConnectivityManager import android.text.TextUtils import com.amap.api.maps.model.LatLng import com.mogo.commons.AbsMogoApplication -import com.mogo.commons.module.intent.IMogoIntentListener -import com.mogo.commons.module.intent.IntentManager import com.mogo.commons.module.status.MogoStatusManager import com.mogo.eagle.core.data.BaseData import com.mogo.eagle.core.data.autopilot.AutopilotControlParameters @@ -21,6 +18,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager.updateAutopilotControlParameters import com.mogo.eagle.core.function.call.autopilot.CallerPlanningRottingListenerManager import com.mogo.eagle.core.function.call.och.CallerEagleBaseFunctionCall4OchManager +import com.mogo.eagle.core.function.call.setting.CallerSopSettingManager import com.mogo.eagle.core.function.call.unmanned.CallerUnmannedListenerManager import com.mogo.eagle.core.network.utils.GsonUtil import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -61,7 +59,7 @@ import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.OCHThreadPoolManager import com.mogo.och.common.module.utils.ResourcesUtils import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.data.bean.BusStationBean import com.mogo.och.data.bean.LineInfo import com.mogo.och.data.taxi.QueryCarOrderByNoRespBean @@ -1408,6 +1406,7 @@ object TaxiTaskModel { MogoStatusManager.getInstance().setTaxiUnmanedDriverTakingOrders(TAG, false) MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingPerformTask(TAG, false) MogoStatusManager.getInstance().setTaxiUnmanedDriverLineRoutingVerifyMode(TAG, false) + CallerSopSettingManager.invokeRoutingListener(false) } //导航去订单终点目的地 diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt index 30f504c17f..a294201bd6 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentModel.kt @@ -22,7 +22,7 @@ import com.mogo.och.common.module.biz.birdge.BridgeManager import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.common.module.network.OchCommonServiceCallback import com.mogo.och.common.module.utils.ToastUtilsOch -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.unmanned.taxi.R import com.mogo.och.unmanned.taxi.base.BaseViewModel import com.mogo.och.unmanned.taxi.base.IUiIntent @@ -69,6 +69,7 @@ class ItineraryCurrentModel : BaseViewModel(), override fun onCleared() { TaxiTaskModel.removeTaskWithOrderListener(TAG) TaxiTaskModel.removeCarServiceCallback() + startOrStopCurrentTaskWithOrderLoop(false) super.onCleared() } diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt index c6d6bde595..5272cfaea4 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/ui/task/itinerarycurrent/ItineraryCurrentView.kt @@ -31,7 +31,7 @@ import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.common.module.utils.FlowBus import com.mogo.och.common.module.utils.OchPhoneUtil import com.mogo.och.common.module.utils.ResourcesUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.common.module.wigets.CommonSlideView import com.mogo.och.common.module.wigets.dialog.CommonDialogStatus import com.mogo.och.unmanned.taxi.R @@ -52,6 +52,7 @@ import com.mogo.och.unmanned.taxi.ui.task.TaxiTaskModel import com.mogo.och.unmanned.taxi.ui.task.cancleorder.CancleOrderView import com.mogo.och.unmanned.taxi.ui.task.itinerayswitch.ItinerarySwitchModel import com.mogo.och.unmanned.taxi.utils.TaskUtils +import com.mogo.och.unmanned.taxi.utils.TaxiTrajectoryManager //演练单标识 import kotlinx.android.synthetic.main.unmanned_itinerary_current.view.aciv_task_type_exercise // 距离目的地距离和剩余时间 @@ -131,7 +132,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi private var mPrepareTasCountDownTimer: CountDownTimer? = null - private var dialog: ItinerarySummaryDialog? = null +// private var dialog: ItinerarySummaryDialog? = null private var viewModel: ItineraryCurrentModel?=null private var viewModelSwitch: ItinerarySwitchModel?=null @@ -149,6 +150,9 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi } private fun initViewModelObserver() { + include_empty.onClick { + TaxiTrajectoryManager.syncTrajectoryInfo() + } viewModel?.sendUiIntent(TaskUiIntent.StartTaskWithOrderLooper) //监听返回的数据状态 @@ -180,7 +184,7 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi // 全程距离和时间 is TaskWithOrderUIState.UpdateOrderTripInfo -> { - dialog?.setOrderMileage(taskAndOrderUiState.mileage*1000) +// dialog?.setOrderMileage(taskAndOrderUiState.mileage*1000) actv_distance_end.text = TaskUtils.getCurrentTaskDistance(taskAndOrderUiState.mileage.toLong()) + " "+ TaskUtils.getCurrentTaskTime(taskAndOrderUiState.duration.toLong()) } // 根据轨迹计算剩余距离和时间 @@ -895,30 +899,30 @@ class ItineraryCurrentView: ConstraintLayout, ItineraryCurrentModel.SwtichLineVi private fun showDialog(){ d(TAG,"showDialog") - if(dialog==null&&context!=null){ - - } - context?.let { - if(dialog==null) { - dialog = ItinerarySummaryDialog(it, true, R.style.summary_dialog) - } - dialog?.let { dialogInner -> - if(!dialogInner.isShowing){ - dialogInner.show() - } - } - } +// if(dialog==null&&context!=null){ +// +// } +// context?.let { +// if(dialog==null) { +// dialog = ItinerarySummaryDialog(it, true, R.style.summary_dialog) +// } +// dialog?.let { dialogInner -> +// if(!dialogInner.isShowing){ +// dialogInner.show() +// } +// } +// } } private fun dismissDialog(){ d(TAG,"dismissDialog") - dialog?.let { - if(it.isShowing){ - it.dismiss() - } - } - dialog = null +// dialog?.let { +// if(it.isShowing){ +// it.dismiss() +// } +// } +// dialog = null } private fun hideNaviBtns() { diff --git a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt index 72025d94ff..ec118f54b2 100644 --- a/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt +++ b/OCH/taxi/unmanned-driver/src/main/java/com/mogo/och/unmanned/taxi/utils/TaxiTrajectoryManager.kt @@ -61,12 +61,12 @@ object TaxiTrajectoryManager : ITrajectoryListListener { * 同步订单信息 */ fun syncTrajectoryInfo() { + val taskAndOrder = TaxiTaskModel.getCurrentTaskWithOrder() OchChainLogManager.writeChainLogTrajectory( "轨迹监控", - "开始或者结束下发轨迹 轨迹id:${mAutopilotControlParameters?.autoPilotLine?.lineId}" + "开始或者结束下发轨迹 轨迹id:${taskAndOrder?.lineId}_${taskAndOrder?.startSite}_${taskAndOrder?.endSite}" ) - val taskAndOrder = TaxiTaskModel.getCurrentTaskWithOrder() - if (taskAndOrder == null || taskAndOrder.currentStatus >= TaskStatusEnum.StartTask.code) { + if (taskAndOrder?.endSite == null || taskAndOrder.currentStatus >= TaskStatusEnum.StartTask.code) { d(TAG, "syncTrajectoryInfo() stop.") stopTrajReqLoop() } else { @@ -97,6 +97,7 @@ object TaxiTrajectoryManager : ITrajectoryListListener { if (taskAndOrder?.endSite == null) { e(TAG, "订单或站点为空:${taskAndOrder}") + OchChainLogManager.writeChainLogTrajectory("轨迹监控","订单或站点为空:${taskAndOrder}") } else { /** * 主要加载和预加载轨迹方案 diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_fragment.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_fragment.xml deleted file mode 100644 index 5e26268678..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_fragment.xml +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select.xml deleted file mode 100644 index b41c1767a4..0000000000 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_routing_select.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_biz.xml b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_biz.xml index 15b1f5a5ab..d59b4bb9f4 100644 --- a/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_biz.xml +++ b/OCH/taxi/unmanned-driver/src/main/res/layout/unmanned_switch_biz.xml @@ -1,14 +1,21 @@ + + - - - - - + if (result.queryId.startsWith("AUTO")) { + return@collect + } + if (result.aiMsg.eventType != "workflow_finished") { + return@collect + } Log.d(TAG, "llm result: $result") + val msg = msgList.findLast { it.id == result.queryId } if (msg == null || msg !is AIMessage.QA) { @@ -127,22 +142,100 @@ class AIViewModel : ViewModel(), AIMessageManager.AIMessageListener, IWakeUpList return@collect } - AIMessageManager.post( - AIMessage.QA( - id = result.queryId, - title = result.answer, - tts = result.answer, - answer = result.answer, - question = msg.question, - state = AIMessage.QA.QuestionState.FINISH, - pictureUrl = result.imgUrls.getOrNull(0) ?: "", - pictureUrlList = result.imgUrls - ) - ) + postAIEvent(result, question = msg.question) + } } } + fun postAIEvent( + result: MGLlmQueryRespBean, + question: String = "", + isAuto: Boolean = false, isShowAll: Boolean = true + ) { + val title = result.aiMsg?.title ?: "" + val msgType = result.aiMsg?.type ?: 0 + val fromValue = AIMessageReplyType.fromValue(msgType) + val state = result.aiMsg.getMessageState() + val stateDes = result.aiMsg?.nodeStatus ?: "" + val flowType = result.aiMsg?.flowType ?: 0 + when (fromValue) { + //千里眼 + AIMessageReplyType.EagleEye -> { + val data: MGEagleEyeBean? = result.aiMsg?.parseData() + val content = data?.title ?: "" + AIMessage.QA( + id = result.queryId, + title = title, + tts = "$title,$content", + answer = content, + question = question, + state = state, + pictureUrl = data?.liveInfo?.imgUrl?:"", + ) + } + + //景点PK + AIMessageReplyType.SpotPK -> { + val data: MGSpotPKBean? = result.aiMsg?.parseData() + val content = data?.title ?: "" + AIMessage.QA( + id = result.queryId, + title = title, + tts = "$title,$content", + answer = content, + question = question, + state = state, + ) + } + + // 默认QA + else -> { + if (result.aiMsg?.responseMode == MGEventExtInfoBean.RESPONSE_MODE_STREAM) { + val data: MGDefaultQABean? = result.aiMsg?.parseData() + val titleName = data?.title ?: "" + val suggestion = data?.suggestion ?: result.answer ?: "" + var imagesUrl = data?.getImagesUrl()?: mutableListOf() + if (result.imgUrls.isNotEmpty()) { + imagesUrl = result.imgUrls + } + AIMessage.QA( + id = result.queryId, + title = titleName, + tts = titleName, + answer = suggestion, + question = question, + state = state, + pictureUrl = imagesUrl.getOrNull(0) ?: "", + pictureUrlList = imagesUrl + ) + } else { + val suggestion = result.aiMsg?.suggestion ?: result.answer ?: "" + val new = MGDefaultQABean().apply { + this.title = result.aiMsg?.title ?: "" + this.suggestion = suggestion + this.status = result.aiMsg.status + this.description = result.aiMsg.description + this.images = result.aiMsg.images + } + AIMessage.QA( + id = result.queryId, + title = new.title, + tts = "$title,$suggestion", + answer = suggestion, + question = question, + state = state, + pictureUrl = result.imgUrls.getOrNull(0) ?: "", + pictureUrlList = result.imgUrls, + ) + } + } + }.let { + AIMessageManager.post(it) + } + } + + override fun onCleared() { AIMessageManager.unregisterListener(this) @@ -381,5 +474,51 @@ sealed class AsrUIState { data class Recognized(val finalText: String) : AsrUIState() } +inline fun MGEventExtInfoBean.parseData(): T? { + val TAG = "MGEventExtInfoBean" + return try { + JsonUtil.fromJson(this.data, T::class.java) + } catch (e: Exception) { + Log.e(TAG, "Failed parse data: ${e.message}") + null + } +} + +enum class AIMessageReplyType(val code: Int) { + Default(0), + RoutePlan(20), + Guardian(21), + SpotPK(22), + EagleEye(23), + Cross(25); + + + companion object { + fun fromValue(value: Int): AIMessageReplyType? { + return values().find { it.code == value } + } + } +} + +fun MGEventExtInfoBean?.getMessageState(): AIMessage.QA.QuestionState { + if (this == null) { + return AIMessage.QA.QuestionState.FINISH + } + + if (this.eventType.isNullOrEmpty()) { + return AIMessage.QA.QuestionState.FINISH + } + +// if (this.eventType == "workflow_started") { +// return AIMessage.QuestionState.PROCESSING +// } + + if (this.eventType == "workflow_finished") { + return AIMessage.QA.QuestionState.FINISH + } + return AIMessage.QA.QuestionState.FINISH +} + + 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 5b1e8c33da..db538d2185 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 @@ -239,10 +239,10 @@ class AiView @JvmOverloads constructor( ViewModelProvider(it)[RoadCrossRoamViewModel::class.java] } roadCrossRoamModel?.init(context) - automaticExplorationModel = findViewTreeViewModelStoreOwner()?.let{ - ViewModelProvider(it)[AutomaticExplorationViewModel::class.java] - } - automaticExplorationModel?.init() +// automaticExplorationModel = findViewTreeViewModelStoreOwner()?.let{ +// ViewModelProvider(it)[AutomaticExplorationViewModel::class.java] +// } +// automaticExplorationModel?.init() ndeViewModel = findViewTreeViewModelStoreOwner()?.let{ ViewModelProvider(it)[NDEViewModel::class.java] } 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 6b3f0b21bd..38ac6ccca2 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 @@ -14,6 +14,7 @@ import android.widget.ImageView import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.widget.AppCompatImageView +import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import androidx.core.graphics.toColorInt import androidx.recyclerview.widget.LinearLayoutManager @@ -31,9 +32,10 @@ import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.glide.GlideImageLoader import com.mogo.eagle.core.utilcode.mogo.glide.transform.GlideRoundedCornersTransform import com.mogo.eagle.core.utilcode.mogo.imageloader.MogoImageView +import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.DateTimeUtils import com.mogo.och.common.module.utils.FrameAnimatorContainer -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.unmanned.passenger.ui.aiview.bean.AIMessage import com.mogo.och.unmanned.taxi.passenger.R import com.youth.banner.Banner @@ -111,26 +113,45 @@ abstract class MessageViewHolder(view: View) : RecyclerView.ViewHolder(view) { class QAViewHolder(val binding: View) : MessageViewHolder(binding) { private var tvQuestion: TextView = binding.findViewById(R.id.tvQuestion) - private var tvAnswer: TextView = binding.findViewById(R.id.tvAnswer) + private var tvTitle: TextView = binding.findViewById(R.id.tvTitle) + private var tvTitleImage: TextView = binding.findViewById(R.id.tvTitleImage) + private var clContain: ConstraintLayout = binding.findViewById(R.id.clContain) private var tvTimestamp: TextView = binding.findViewById(R.id.tvTimestamp) private var tvStateContent: TextView = binding.findViewById(R.id.tvStateContent) + private var tvAnswer: TextView = binding.findViewById(R.id.tvPncActionDesc) // private var ivPicture: OchRoundImageView = binding.findViewById(R.id.ivPicture) private var llState: LinearLayout = binding.findViewById(R.id.llState) - private var tvStateUnderstand: TextView = binding.findViewById(R.id.tvStateUnderstand) - private var tvStateAnalyze: TextView = binding.findViewById(R.id.tvStateAnalyze) - private var tvStateAnswer: TextView = binding.findViewById(R.id.tvStateAnswer) private var picBanner = binding.findViewById>(R.id.picBanner) override fun bind(item: AIMessage, onItemClickListener: OnItemClickListener?) { if (item is AIMessage.QA) { + CallerLogger.d(TAG,"bind:${item}") binding.apply { handleState(item.state) tvQuestion.text = item.question Log.d(TAG, "bind: ${item}") - - tvAnswer.setTextAndVisibility(item.answer) -// ivPicture.showOrHideWithUrl(item.pictureUrl) + if(item.title==item.answer){ + tvTitle.text = item.title + tvAnswer.text = item.answer + tvTitle.visibility = View.VISIBLE + tvAnswer.visibility = View.GONE + tvTitleImage.visibility = View.VISIBLE + }else{ + if(item.title.isNullOrEmpty()){ + tvTitle.text = item.answer + tvAnswer.text = item.answer + tvTitle.visibility = View.GONE + tvAnswer.visibility = View.VISIBLE + tvTitleImage.visibility = View.GONE + }else { + tvTitle.text = item.title + tvAnswer.text = item.answer + tvTitle.visibility = View.VISIBLE + tvAnswer.visibility = View.VISIBLE + tvTitleImage.visibility = View.VISIBLE + } + } handleTimestamp(item, tvTimestamp) @@ -140,7 +161,6 @@ class QAViewHolder(val binding: View) : MessageViewHolder(binding) { } else { picBanner.visibility = View.VISIBLE picBanner.setAdapter(BannerImageAdapter(pictureUrlList)) -// .addBannerLifecycleObserver(picBanner.context) //添加生命周期观察者 .setIndicator(CircleIndicator(picBanner.context)) .setIndicatorSelectedColor("#40B4FF".toColorInt()) .setIndicatorNormalColor("#FFFFFF".toColorInt()) @@ -154,43 +174,32 @@ class QAViewHolder(val binding: View) : MessageViewHolder(binding) { when (state) { AIMessage.QA.QuestionState.UNDERSTAND -> { llState.visibility = View.VISIBLE + clContain.visibility = View.GONE tvStateContent.text = "正在理解问题…" - tvStateUnderstand.visibility = View.GONE - tvStateAnalyze.visibility = View.GONE - tvStateAnswer.visibility = View.GONE } AIMessage.QA.QuestionState.ANALYZE -> { - tvStateUnderstand.visibility = View.VISIBLE llState.visibility = View.VISIBLE + clContain.visibility = View.GONE tvStateContent.text = "正在分析处理…" - tvStateAnalyze.visibility = View.GONE - tvStateAnswer.visibility = View.GONE + } AIMessage.QA.QuestionState.ANSWER -> { - tvStateUnderstand.visibility = View.VISIBLE - tvStateAnalyze.visibility = View.VISIBLE llState.visibility = View.VISIBLE + clContain.visibility = View.GONE tvStateContent.text = "正在总结回答…" - tvStateAnswer.visibility = View.GONE } AIMessage.QA.QuestionState.FINISH -> { - tvStateUnderstand.visibility = View.VISIBLE - tvStateAnalyze.visibility = View.VISIBLE - tvStateAnswer.visibility = View.VISIBLE - llState.visibility = View.GONE + clContain.visibility = View.VISIBLE tvStateContent.text = "" } AIMessage.QA.QuestionState.ERROR -> { - tvStateUnderstand.visibility = View.VISIBLE - tvStateAnalyze.visibility = View.VISIBLE - tvStateAnswer.visibility = View.VISIBLE - + clContain.visibility = View.VISIBLE llState.visibility = View.GONE tvStateContent.text = "" } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AICrossBean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AICrossBean.kt new file mode 100644 index 0000000000..58c3131e54 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/AICrossBean.kt @@ -0,0 +1,59 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean + +data class AICrossBean( + val cameraLiveUrl: String?, + val cameraPicUrl: String?, + val currentLaneFlow: RoadFlowInfo?, + val flowStatistics: FlowStatistics?, + val title: String, + var otherQuestion: List? = null, +) + +data class RoadFlowInfo( + val totalPcuCount: Double, + val avgSpeed: Double, + val level: Int, + val infos: List +) + +data class LaneInfo( +// val crossId: String, + val roadId: String, + val laneNo: String, +// val vehicleCount: Int, +// val avgSpeed: Double, + val pcuCount: Double, + val bearing: Int, + val arrowType: Int +) + +data class FlowStatistics( + val v2nInfoList: List?, + val flowTimeInfo: FlowInfo?, +) + + +data class FlowInfo( + val defaultCount: Int, + val totalPcuCount: Double?, + val flowTimeInfoList: List +) + + +data class FlowTimeInfo( + val flowTime: Long, + val flowTimeStr: String, + val count: Int, + val avgSpeed: Double, + val pcuCount: Double, + val level: String, + val flag: String +) + +data class V2nEventInfo( + val id: Int, + //10006 道路施工; 10007 道路拥堵 + val poiType: String, + val updateTimeLong: Long, + val createTimeLong: Long, +) diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGCommonTitleBean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGCommonTitleBean.kt new file mode 100644 index 0000000000..aab20bad23 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGCommonTitleBean.kt @@ -0,0 +1,4 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean +data class MGCommonTitleBean( + val title: String = "", +) \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGDefaultQABean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGDefaultQABean.kt new file mode 100644 index 0000000000..da81153b32 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGDefaultQABean.kt @@ -0,0 +1,26 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean + +import com.mogo.service.v2n.bean.MGEventExtInfoBean + +class MGDefaultQABean +/** + * 默认构造函数 + * 初始化基本字段为默认值 + */ +{ + fun getImagesUrl(): MutableList { + val rusult = mutableListOf() + images?.forEach { + rusult.add(it.url) + } + return rusult + } + + // Getters and setters + var title: String = "" // 事件标题 + var status: Int = 0 // 事件状态 1 显示 0 不显示 + var suggestion: String = "" // 建议操作 + var description: List? = null // 事件描述列表 + var images: List? = null // 事件相关图片信息 + var congestion: List? = null +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGEagleEyeBean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGEagleEyeBean.kt new file mode 100644 index 0000000000..e3cce431f0 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGEagleEyeBean.kt @@ -0,0 +1,53 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean + +data class MGEagleEyeBean( + val title: String = "", + val liveInfo: LiveInfo? = null, + val parkingLots: List? = null, + val trafficInfo: TrafficInfo? = null, + val touristDensity: String? = null, + var personCount:Int = 0, + val weatherInfo: WeatherInfo? = null, + val noise: String? = null, + var otherQuestion: List? = null, +) { + data class LiveInfo( + val imgUrl: String = "", + val liveUrl: String = "" + ) + + data class ParkingLot( + val name: String = "", + val address: String = "", + val businessHours: String = "", + val fee: String = "", + val total: String = "", + val free: String = "", + val freeRate: String = "", + val lat: Double = 0.0, + val lng: Double = 0.0, + val imgUrl: String = "", + val liveUrl: String = "" + ) + // driveDuration":165.48,"driveDistance":154.58,"busDistance":14.45,"busDuration":48.48,"level":2 + data class TrafficInfo( + val driveDistance: String = "", + val busDistance: String = "", + val driveDuration: String = "", + val busDuration: String = "", + val level: Int = 0, + val lon: Double = 0.0, + val lat: Double = 0.0, + val address:String = "", + val status: String = "" + ) + + data class WeatherInfo( + val temperature: String = "", + val windDirection: String = "", + val windPower: String = "", + val weather: String = "", + val sunlightIntensity: String = "", + val dressingAdv: String? = null, + ) +} \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGSpotPKBean.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGSpotPKBean.kt new file mode 100644 index 0000000000..efb14ed5d3 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/aiview/bean/MGSpotPKBean.kt @@ -0,0 +1,27 @@ +package com.mogo.och.unmanned.passenger.ui.aiview.bean +data class MGSpotPKBean( + val title: String = "", + val spots: List = emptyList(), + var otherQuestion: List? = null, +) { + data class Spot( + val name: String = "", + val isRecommend: Int = 0, + val roadStatus: String = "", + val distance: String = "", + val weather: String = "", + val crowded: String = "", + val feature: String = "", + val fee: String = "", + val lat: Double = 0.0, + val lng: Double = 0.0, + val imgUrl: String = "", + val liveUrl: String = "", + val parkingAddress:String? = null, + var parkingName:String? = null, + val parkingType:String? = null, + val parkingLon: Double? = null, + val parkingLat: Double? = null, + val parkingUrl: String? = null + ) +} diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt index 2a4d350b36..a54dc8e106 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/arrived/ArrivedView.kt @@ -49,7 +49,7 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { private lateinit var viewModel: ArrivedViewModel - var dialog:ItinerarySummaryDialog? = null +// var dialog:ItinerarySummaryDialog? = null private var mileage:Float = 0f private var duration:Float = 0f @@ -77,11 +77,11 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { aniSpeedSettingRow() viewModel.setEndInfo() ZhiViewmanager.showListeningAni(ZhiViewmanager.loveAni) - if(dialog==null) { - dialog = ItinerarySummaryDialog(context, false, R.style.summary_dialog_p) - dialog?.setOrderMileage(mileage) - } - dialog?.show() +// if(dialog==null) { +// dialog = ItinerarySummaryDialog(context, false, R.style.summary_dialog_p) +// dialog?.setOrderMileage(mileage) +// } +// dialog?.show() } else { v_video_right_rear_view.resetView() taxiPxiaozhiLove?.stop() @@ -89,8 +89,8 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { taxiPxiaozhiLove = null RxUtils.disposeSubscribe(subscribe) ZhiViewmanager.showListeningAni(ZhiViewmanager.normalAni) - dialog?.dismiss() - dialog = null +// dialog?.dismiss() +// dialog = null mileage = 0f } arrivedVisilityChangeListenr?.isShow(isVisible) @@ -188,7 +188,7 @@ class ArrivedView : WindowRelativeLayout, ArrivedViewModel.ArrivedViewCallback { fun setMileageAndDuration(mileage: Float, duration: Float) { this.mileage = mileage this.duration = duration - dialog?.setOrderMileage(mileage) +// dialog?.setOrderMileage(mileage) } interface ArrivedVisilityChangeListenr{ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt index 10aece16a5..5e7fc926c6 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/bar/RightBarView.kt @@ -15,12 +15,12 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.bumptech.glide.request.target.SimpleTarget import com.bumptech.glide.request.transition.Transition -import com.elegant.utils.UiThreadHandler import com.mogo.commons.AbsMogoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.ui.music.playing.MusicPlayingViewModel import com.mogo.och.unmanned.taxi.passenger.R @@ -34,7 +34,7 @@ import kotlinx.android.synthetic.main.taxi_p_rightbar.view.con_third_group import me.jessyan.autosize.utils.AutoSizeUtils -class RightBarView : ConstraintLayout, AuditionManager.MusicDataChangeListener { +class RightBarView : ConstraintLayout, MusicDataChangeListener { private val TAG = "RightBarView" @@ -88,8 +88,8 @@ class RightBarView : ConstraintLayout, AuditionManager.MusicDataChangeListener { ck_music.setBackgroundResource(R.drawable.taxi_p_music_selector) endAnimal() } else { - if(AuditionManager.isPlaying()){ - AuditionManager.musicDataPlaying?.let { + if(MediaManager.Audition.isPlaying()==true){ + MediaManager.Audition.getPlaying()?.let { Glide.with(context) .load(it.coverHeadImageUrl) .apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_head)) @@ -151,7 +151,7 @@ class RightBarView : ConstraintLayout, AuditionManager.MusicDataChangeListener { override fun onAttachedToWindow() { super.onAttachedToWindow() CallerLogger.d(TAG, "onAttachedToWindow") - AuditionManager.addDataChangeListener(TAG,this) + MediaManager.Audition.addListener(TAG,this) // RightBarView启动的时候必须把MusicPlayingViewModel初始化了,否则和AuditionManager的回掉及逻辑会有问题 try { val musicPlayingViewModel = findViewTreeViewModelStoreOwner()?.let { @@ -165,7 +165,7 @@ class RightBarView : ConstraintLayout, AuditionManager.MusicDataChangeListener { } override fun onDetachedFromWindow() { - AuditionManager.removeDataChangeListener(TAG) + MediaManager.Audition.removeListener(TAG) super.onDetachedFromWindow() } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt index 6f3231e9ed..2e0ccbcf99 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/checkstartautopilot/startautopilot/StartAutopilotViewModel.kt @@ -15,7 +15,7 @@ import com.mogo.och.bridge.device.data.DoorPosition import com.mogo.och.bridge.device.data.DoorState import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.RxUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.unmanned.passenger.model.AutopilotManager import com.mogo.och.unmanned.passenger.model.TaxiPassengerModel import com.mogo.och.unmanned.taxi.passenger.R 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 87a1292d32..b3353191e1 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 @@ -14,7 +14,7 @@ import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.xiaozhi.ZhiViewmanager 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.common.module.biz.media.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_great import kotlinx.android.synthetic.main.taxi_p_evaluate.view.iv_evaluate_low diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt index 4060c0e58e..044d796dd1 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeView.kt @@ -7,13 +7,18 @@ import android.content.Context import android.os.Bundle import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.constraintlayout.widget.Guideline import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.data.map.MogoLatLng +import com.mogo.eagle.core.data.multidisplay.TelematicConstant +import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener +import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger +import com.mogo.eagle.core.utilcode.util.UiThreadHandler import com.mogo.och.bridge.autopilot.location.OchLocationManager import com.mogo.och.unmanned.passenger.ui.bar.LeftBarView import com.mogo.och.unmanned.taxi.passenger.R @@ -22,14 +27,14 @@ import kotlinx.android.synthetic.main.taxi_p_home.view.acbtn_show_hdmap import kotlinx.android.synthetic.main.taxi_p_home.view.hdMapView import kotlinx.android.synthetic.main.taxi_p_home.view.lbv_go2_center import kotlinx.android.synthetic.main.taxi_p_home.view.leftEndGuideline -import kotlinx.android.synthetic.main.taxi_p_home.view.midContainer -import kotlinx.android.synthetic.main.taxi_p_home.view.midStartGuideline +import kotlinx.android.synthetic.main.taxi_p_home.view.rightContainer class HomeView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 -) : ConstraintLayout(context, attrs, defStyleAttr), HomeViewModel.HomeCallback { +) : ConstraintLayout(context, attrs, defStyleAttr), HomeViewModel.HomeCallback, + IReceivedMsgListener { private var isAMapShow = true @@ -39,8 +44,7 @@ class HomeView @JvmOverloads constructor( private var TAG = "HomeView" - private var viewModel: HomeViewModel?=null - + private var viewModel: HomeViewModel? = null private fun initView() { @@ -50,7 +54,7 @@ class HomeView @JvmOverloads constructor( } private fun initlistener() { - lbv_go2_center.setOrderIdCallback(object : LeftBarView.LeftBarCallback{ + lbv_go2_center.setOrderIdCallback(object : LeftBarView.LeftBarCallback { override fun setGo2CenterClick() { //切换到地图中间 hdMapView.getUI()?.let { @@ -63,10 +67,10 @@ class HomeView @JvmOverloads constructor( }) acbtn_show_hdmap.onClick { - showHdMap() + updateViewState(false) } acbtn_show_all.onClick { - showAmapAndHdMap() + updateViewState(true) } } @@ -74,15 +78,15 @@ class HomeView @JvmOverloads constructor( /** * 展示两屏幕 */ - fun showHdMap(){ - updateViewState(true,false,false) + fun showHdMap() { +// updateViewState(true,false,false) } /** * 展示3屏 */ - fun showAmapAndHdMap(){ - updateViewState(true,true,false) + fun showAmapAndHdMap() { +// updateViewState(true,true,false) } fun onCreate(savedInstanceState: Bundle?) { @@ -127,70 +131,30 @@ class HomeView @JvmOverloads constructor( ViewModelProvider(it).get(HomeViewModel::class.java) } viewModel?.setViewCallback(this) + CallerTelematicListenerManager.addListener(TAG, this) } + override fun onDetachedFromWindow() { + super.onDetachedFromWindow() + CallerTelematicListenerManager.removeListener(TAG) + } private fun updateViewState( - showHDMapView: Boolean, - showAMapView: Boolean, - animate: Boolean = true + showMogoMind: Boolean, + animate: Boolean = false ) { - // 展示预测地图和高精地图 - if (showHDMapView && showAMapView) { - CallerLogger.d(TAG,"展示高德地图和高精地图${showHDMapView}_$showAMapView") - midStartGuideline.setGuidelinePercent(0.333f) - if (animate) { - animateGuidelinePercent( - leftEndGuideline, - 0.333f, - 1000 - ) { - lbv_go2_center.visibility = GONE - midContainer.visibility = VISIBLE - } - } else { - leftEndGuideline.setGuidelinePercent(0.333f) - lbv_go2_center.visibility = GONE - midContainer.visibility = VISIBLE - } - } - // 不展示预测 展示高精 - if (showHDMapView && !showAMapView) { - CallerLogger.d(TAG,"展示高德 不展示高精${showHDMapView}_$showAMapView") - if (animate) { - animateGuidelinePercent( - leftEndGuideline, - 0.666f, - 1000, - end = { - lbv_go2_center.visibility = VISIBLE - midContainer.visibility = GONE - } - ) - } else { - leftEndGuideline.setGuidelinePercent(0.666f) - lbv_go2_center.visibility = VISIBLE - midContainer.visibility = GONE - } - } - // 不展示高精 展示高德 - if (!showHDMapView && showAMapView) { - CallerLogger.d(TAG,"展示高精 不展示高德${showHDMapView}_$showAMapView") - if (animate) { - midStartGuideline.setGuidelinePercent(0.0f) - animateGuidelinePercent( - leftEndGuideline, - 0.0f, - 1000 - ) { - lbv_go2_center.visibility = GONE - } - } - else { - leftEndGuideline.setGuidelinePercent(0.0f) - midStartGuideline.setGuidelinePercent(0.0f) - lbv_go2_center.visibility = GONE + CallerLogger.d(TAG, "展示MogoMind${showMogoMind}") + if (animate) { + animateGuidelinePercent( + leftEndGuideline, + if (showMogoMind) 0.666f else 1f, + 1000 + ) { + rightContainer.visibility = if (showMogoMind) View.VISIBLE else View.GONE } + } else { + leftEndGuideline.setGuidelinePercent(if (showMogoMind) 0.666f else 1f) + rightContainer.visibility = if (showMogoMind) View.VISIBLE else View.GONE } } @@ -255,4 +219,14 @@ class HomeView @JvmOverloads constructor( showAmapAndHdMap() } + override fun onReceivedMsg(type: Int, byteArray: ByteArray) { + if (type == TelematicConstant.CONTROL_PASSENGER_AI_SWITCH) { + UiThreadHandler.post { + when (String(byteArray)) { + "0" -> updateViewState(false) + else -> updateViewState(true) + } + } + } + } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt index ecadbb6a40..6a12f62a33 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/homepage/HomeViewModel.kt @@ -55,21 +55,19 @@ class HomeViewModel : ViewModel(), BridgeListener, OrderListener { } private fun checkScreenChange(){ -// CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") -// if(havePredictionInfos&&havePredictionInfos){//order!=null&& -// FunctionBuildConfig.isDrawDecIdentifyData = true -// FunctionBuildConfig.isDrawPreIdentifyData = true -// // 展示三联屏 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showThreeScreen() -// } -// }else{ -// FunctionBuildConfig.isDrawDecIdentifyData = false -// FunctionBuildConfig.isDrawPreIdentifyData = false -// // 展示二联屏幕 -// BizLoopManager.runInMainThread{ -// this.viewCallback?.showTwoScreen() -// } -// } + CallerLogger.d(TAG,"havePredictionInfos:${havePredictionInfos}--haveTrajectoryInfos:${haveTrajectoryInfos}--order:${order}") + if(order!=null&&havePredictionInfos&&havePredictionInfos){ + // 展示三联屏 + BizLoopManager.runInMainThread{ + this.viewCallback?.showThreeScreen() + FunctionBuildConfig.isDrawPreIdentifyData = true + } + }else{ + FunctionBuildConfig.isDrawPreIdentifyData = false + // 展示二联屏幕 + BizLoopManager.runInMainThread{ + this.viewCallback?.showTwoScreen() + } + } } } \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt index 653f695aca..4932cc82bc 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicModel.kt @@ -3,10 +3,11 @@ package com.mogo.och.unmanned.passenger.ui.music import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.bridge.autopilot.autopilot.IOchAutopilotStatusListener import com.mogo.och.bridge.autopilot.autopilot.OchAutoPilotStatusListenerManager -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.MusicDataChangeListener +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.utils.CallerBase import com.mogo.och.common.module.utils.RxUtils @@ -16,7 +17,8 @@ import io.reactivex.disposables.Disposable import com.mogo.och.unmanned.taxi.utils.order.OrderListener import com.mogo.och.unmanned.taxi.utils.order.OrderModel -object MusicModel : CallerBase(), OrderListener, IOchAutopilotStatusListener, AuditionManager.MusicDataChangeListener { +object MusicModel : CallerBase(), OrderListener, IOchAutopilotStatusListener, + MusicDataChangeListener { private const val TAG = "MusicModel" @@ -24,12 +26,19 @@ object MusicModel : CallerBase(), OrderListener, I OrderModel.setOrderStatusCallback(TAG,this) //自动驾驶状态监听 OchAutoPilotStatusListenerManager.addListener(TAG, this) - AuditionManager.addDataChangeListener(TAG,this) + MediaManager.Audition.addListener(TAG,this) } private var stopMusicDisposable: Disposable? = null private var orderInfo: BaseOrderBean? = null + override fun addOneData(musicData: MusicData) { + M_LISTENERS.forEach{ + it.value.addOneData(musicData) + } + } + + private const val startMusicWithOrderKey = "STARTMUSICWITHORDER" override fun onCurrentOrderStatusChanged(order: BaseOrderBean?) { @@ -51,13 +60,13 @@ object MusicModel : CallerBase(), OrderListener, I TaxiOrderStatusEnum.JourneyCompleted -> { cancelStopMusicDisposable() stopMusicDisposable = RxUtils.createSubscribe(60_000) { - AuditionManager.stop() + MediaManager.Audition.stop() } } TaxiOrderStatusEnum.Cancel -> { cancelStopMusicDisposable() stopMusicDisposable = RxUtils.createSubscribe(60_000) { - AuditionManager.stop() + MediaManager.Audition.stop() } } } @@ -71,7 +80,12 @@ object MusicModel : CallerBase(), OrderListener, I cancelStopMusicDisposable() SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) BizLoopManager.runInMainThread{ - checkMusic(AuditionManager.musicList.first(),true) + MediaManager.Audition.getAuditionDataList()?.let {list-> + if(list.isNotEmpty()) { + checkMusic(list.first(), true) + } + } + } } } else { @@ -80,7 +94,11 @@ object MusicModel : CallerBase(), OrderListener, I cancelStopMusicDisposable() SharedPrefsMgr.getInstance().putString(startMusicWithOrderKey, it.orderNo) BizLoopManager.runInMainThread { - checkMusic(AuditionManager.musicList.first(), true) + MediaManager.Audition.getAuditionDataList()?.let { list -> + if(list.isNotEmpty()) { + checkMusic(list.first(), true) + } + } } } } @@ -90,7 +108,7 @@ object MusicModel : CallerBase(), OrderListener, I private fun cancelStopMusicDisposable() { if (stopMusicDisposable != null) { - AuditionManager.stop() + MediaManager.Audition.stop() } RxUtils.disposeSubscribe(stopMusicDisposable) stopMusicDisposable = null @@ -102,7 +120,7 @@ object MusicModel : CallerBase(), OrderListener, I fun getCheckMusic(): MusicData? { - AuditionManager.musicList.forEach { + MediaManager.Audition.getAuditionDataList()?.forEach { if (it.select==true) { return it } @@ -111,13 +129,7 @@ object MusicModel : CallerBase(), OrderListener, I } fun seekTo(progress: Int) { - AuditionManager.seekTo(progress) - } - - override fun addOneData(musicData: MusicData) { - M_LISTENERS.forEach{ - it.value.addOneData(musicData) - } + MediaManager.Audition.seekTo(progress) } /** @@ -125,7 +137,7 @@ object MusicModel : CallerBase(), OrderListener, I * 2、如果正在播放 需要开始播放选中音乐 */ fun checkMusic(musicData: MusicData,startPlay:Boolean = true){ - AuditionManager.musicList.forEach { + MediaManager.Audition.getAuditionDataList()?.forEach { // 上一个选中歌曲 if (it.select==true) { if(it!=musicData){ @@ -142,7 +154,7 @@ object MusicModel : CallerBase(), OrderListener, I } notifySelectChange(musicData) if(startPlay) { - AuditionManager.play(musicData) + MediaManager.Audition.play(musicData) } } @@ -155,23 +167,25 @@ object MusicModel : CallerBase(), OrderListener, I fun clickPreMusic(){ val checkMusic = getCheckMusic() checkMusic?.let { - val preMusicData = AuditionManager.getPreMusicData(it) - checkMusic(preMusicData) + MediaManager.Audition.getPreAuditionData(it)?.let { preData-> + checkMusic(preData) + } } } fun clickNextMusic(){ val checkMusic = getCheckMusic() checkMusic?.let { - val nextMusicData = AuditionManager.getNextMusicData(it) - checkMusic(nextMusicData) + MediaManager.Audition.getNextAuditionData(it)?.let { nextData-> + checkMusic(nextData) + } } } fun toggleMusic(){ val checkMusic = getCheckMusic() checkMusic?.let { - AuditionManager.toggle(it) + MediaManager.Audition.toggle(it) } } @@ -205,7 +219,7 @@ object MusicModel : CallerBase(), OrderListener, I // return false // } // return true - return AuditionManager.isPlaying() + return MediaManager.Audition.isPlaying()==true } interface MusicDataListener{ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt index a2338a6660..60667f7173 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/MusicView.kt @@ -3,15 +3,10 @@ package com.mogo.och.unmanned.passenger.ui.music import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater -import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.unmanned.passenger.ui.music.list.MusicListView import com.mogo.och.unmanned.taxi.passenger.R -import kotlinx.android.synthetic.main.taxi_p_music.view.mlv_list -import kotlinx.android.synthetic.main.taxi_p_music.view.mpv_playing class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback { diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt index a2ec92ff80..e882c0898b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt @@ -13,8 +13,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_next_bar import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_toggle_bar diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt index 8fee84cb9a..b609c8c489 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt @@ -1,7 +1,7 @@ package com.mogo.och.unmanned.passenger.ui.music.bar import androidx.lifecycle.ViewModel -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.ui.music.MusicModel diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt index 899c28293a..eb6eccbbac 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListItemAdapter.kt @@ -10,8 +10,8 @@ import android.widget.ImageView import android.widget.TextView import androidx.core.content.ContextCompat import androidx.recyclerview.widget.RecyclerView -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.mogo.och.unmanned.taxi.passenger.R /** @@ -74,7 +74,7 @@ class MusicListItemAdapter( holder.itemView.background = null } - if (musicData.state==PlayState.Playing) { + if (musicData.state== PlayState.Playing) { holder.musicPlayState.visibility = View.VISIBLE }else{ holder.musicPlayState.visibility = View.GONE diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt index 9db7ad9b86..9ebfdf24c5 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListView.kt @@ -8,7 +8,7 @@ import androidx.constraintlayout.widget.ConstraintLayout import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.recyclerview.widget.LinearLayoutManager -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.unmanned.passenger.ui.music.MusicModel import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_music_list.view.rv_music_list diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt index 4368af86d0..e760170a3b 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/list/MusicListViewModel.kt @@ -2,9 +2,8 @@ package com.mogo.och.unmanned.passenger.ui.music.list import androidx.lifecycle.ViewModel import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.UiThreadHandler -import com.mogo.och.common.module.manager.audition.AuditionManager -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.ui.music.MusicModel @@ -14,11 +13,13 @@ class MusicListViewModel : ViewModel(), MusicModel.MusicDataListener { private var viewCallback: IMusicListViewCaLillback? = null - fun setDistanceCallback(viewCallback: IMusicListViewCaLillback) { this.viewCallback = viewCallback - viewCallback.addAllData(AuditionManager.musicList) - CallerLogger.d(TAG, "初始化音乐${AuditionManager.musicList.size}") + MediaManager.Audition.getAuditionDataList()?.let { + viewCallback.addAllData(it) + CallerLogger.d(TAG, "初始化音乐${it.size}") + } + MusicModel.addListener(TAG, this) } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt index 1a74a621e3..b56208d015 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingView.kt @@ -13,9 +13,8 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.findViewTreeViewModelStoreOwner import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.TimeTransformUtils -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager -import com.mogo.och.common.module.manager.audition.MusicData -import com.mogo.och.common.module.manager.audition.PlayState +import com.mogo.och.common.module.biz.media.data.MusicData +import com.mogo.och.common.module.biz.media.data.PlayState import com.mogo.och.common.module.utils.DateTimeUtil import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxi_p_music_playing.view.iv_music_cover @@ -112,7 +111,7 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi tv_tag.text = musicData.tag.first() tv_playing_time.text = DateTimeUtil.second2Time(0) tv_playing_during.text = TimeTransformUtils.stringForTime(musicData.duration.toInt()) - if(musicData.state==PlayState.Playing){ + if(musicData.state== PlayState.Playing){ iv_toggle.setImageResource(R.drawable.taxi_p_music_pause) startAnimal() }else{ @@ -181,7 +180,7 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi } override fun setPlayOrpause(it: MusicData) { - if(it.state==PlayState.Playing){ + if(it.state== PlayState.Playing){ iv_toggle.setImageResource(R.drawable.taxi_p_music_pause) startAnimal() }else{ diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt index fb242a7d00..fc4c3f964e 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/playing/MusicPlayingViewModel.kt @@ -2,7 +2,7 @@ package com.mogo.och.unmanned.passenger.ui.music.playing import androidx.lifecycle.ViewModel import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.biz.media.data.MusicData import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.unmanned.passenger.ui.music.MusicModel diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt index c30791465c..f7acfb0c86 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/InfoVideoView.kt @@ -12,18 +12,15 @@ import com.bumptech.glide.Glide import com.bumptech.glide.load.resource.bitmap.CenterCrop import com.bumptech.glide.load.resource.bitmap.RoundedCorners import com.bumptech.glide.request.RequestOptions -import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.eagle.core.utilcode.util.GsonUtils import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager +import com.mogo.och.common.module.biz.media.MediaManager import com.mogo.och.common.module.manager.loop.BizLoopManager import com.mogo.och.common.module.wigets.WrapContentLinearLayoutManager -import com.mogo.och.common.module.wigets.media.IMediaDataSourceListener -import com.mogo.och.common.module.wigets.media.MediaDataSourceManager -import com.mogo.och.common.module.wigets.media.MediaFileCacheManager -import com.mogo.och.common.module.wigets.media.MediaItem -import com.mogo.och.common.module.wigets.media.MediaPlayLogger +import com.mogo.och.common.module.biz.media.IVideoListener +import com.mogo.och.common.module.biz.media.data.MediaItem +import com.mogo.och.common.module.manager.logchainanalytic.OchChainLogManager import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay import com.mogo.och.unmanned.passenger.ui.video.RecyclerVideoAdapterNew.OnThumbImageClilckListener import com.mogo.och.unmanned.passenger.widget.ConsultVideoPlayer @@ -95,17 +92,16 @@ internal class InfoVideoView @JvmOverloads constructor( override fun onAttachedToWindow() { super.onAttachedToWindow() - MediaFileCacheManager.createFileCacheDir(MainMoGoApplication.getApp().applicationContext) - MediaDataSourceManager.init(TAG, object : IMediaDataSourceListener { + MediaManager.Video.createCacheFileDir() + MediaManager.addListener(TAG,object :IVideoListener{ override fun onMediaDataSourceChanged(list: List) { val isNewData = mediaList.isNotEmpty() - MediaPlayLogger.printInfoLog( + OchChainLogManager.writeChainLogMedia("info", "onMediaDataSourceChanged:isNewData=$isNewData, dataSize=${list.size}, list=${ - GsonUtils.toJson( - list - ) - }" - ) + GsonUtils.toJson( + list + ) + }") val localMediaList = mutableListOf() list.forEach { val taxiPassengerVideoPlay = TaxiPassengerVideoPlay( @@ -119,17 +115,18 @@ internal class InfoVideoView @JvmOverloads constructor( if (isNewData) { if (!isVisible) { updateMediaListDataAndView(localMediaList) - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新") + OchChainLogManager.writeChainLogMedia("info","onMediaDataSourceChanged, 宣传视频数据已更新") } else { mNewMediaList.clear() mNewMediaList.addAll(localMediaList) } } else { updateMediaListDataAndView(localMediaList) - MediaPlayLogger.printInfoLog("onMediaDataSourceChanged, 宣传视频数据已更新") + OchChainLogManager.writeChainLogMedia("info","onMediaDataSourceChanged, 宣传视频数据已更新") } } }) + MediaManager.Video.init() } private fun updateMediaListDataAndView(newList: MutableList) { @@ -165,12 +162,12 @@ internal class InfoVideoView @JvmOverloads constructor( GSYVideoView.CURRENT_STATE_PLAYING ->{ currentMedia?.isPlayiing = true infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) - AudioFocusManager.setVideoFocusChange(true) + MediaManager.setVideoFocusChange(true) } else ->{ currentMedia?.isPlayiing = false infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) } } } @@ -224,7 +221,8 @@ internal class InfoVideoView @JvmOverloads constructor( } override fun onDetachedFromWindow() { - MediaDataSourceManager.unInit(TAG) + MediaManager.removeListener(TAG) + MediaManager.Video.unInit() GSYVideoManager.releaseAllVideos() super.onDetachedFromWindow() } diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java index 6bc8df9efb..4bb65c4564 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapter.java @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import com.mogo.eagle.core.utilcode.util.ToastUtils; -import com.mogo.och.common.module.wigets.media.MediaItem; +import com.mogo.och.common.module.biz.media.data.MediaItem; import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay; import com.mogo.och.unmanned.taxi.passenger.R; import com.mogo.skin.utils.SkinResources; diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapterNew.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapterNew.kt index 68fdf2a1e7..60b2f39cce 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapterNew.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/video/RecyclerVideoAdapterNew.kt @@ -9,7 +9,7 @@ import androidx.appcompat.widget.AppCompatTextView import androidx.recyclerview.widget.RecyclerView import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions -import com.mogo.och.common.module.wigets.media.MediaItem +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay import com.mogo.och.unmanned.taxi.passenger.R import com.mogo.skin.utils.SkinResources diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt index 2d6af4d7fe..d444b94c2e 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/ConsultVideoPlayer.kt @@ -22,12 +22,11 @@ import androidx.core.app.ActivityCompat import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger -import com.mogo.eagle.core.utilcode.util.TAG import com.mogo.eagle.core.utilcode.util.TimeTransformUtils import com.mogo.eagle.core.utilcode.util.ToastUtils import com.mogo.eagle.core.widget.media.video.TextureVideoViewOutlineProvider -import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager -import com.mogo.och.common.module.wigets.media.MediaItem +import com.mogo.och.common.module.biz.media.MediaManager +import com.mogo.och.common.module.biz.media.data.MediaItem import com.mogo.och.unmanned.passenger.bean.TaxiPassengerVideoPlay import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView import com.mogo.och.unmanned.passenger.ui.video.FullVideoUtils @@ -52,6 +51,8 @@ import java.lang.reflect.Constructor */ class ConsultVideoPlayer : StandardGSYVideoPlayer { + private val TAG = "ConsultVideoPlayer" + private lateinit var start: ImageView lateinit var coverImage: ImageView private lateinit var currentTimeTextView: TextView @@ -154,12 +155,12 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { GSYVideoView.CURRENT_STATE_PLAYING ->{ start.setImageResource(R.drawable.notice_video_pause) showOrHideStartPlayButton(false) - AudioFocusManager.setVideoFocusChange(true) + MediaManager.setVideoFocusChange(true) } else -> { start.setImageResource(R.drawable.notice_video_after_pause) showOrHideStartPlayButton(true) - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) } } } @@ -314,7 +315,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun onCompletion() { start.setImageResource(R.drawable.notice_video_after_pause) - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) } override fun onSurfaceUpdated(surface: Surface) { @@ -335,7 +336,7 @@ class ConsultVideoPlayer : StandardGSYVideoPlayer { override fun onError(what: Int, extra: Int) { super.onError(what, extra) - AudioFocusManager.setVideoFocusChange(false) + MediaManager.setVideoFocusChange(false) mThumbImageViewLayout?.visibility = View.VISIBLE ToastUtils.showLong("哎呀,出错了,看看其他视频吧") currentTime = -1 diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/NumberCheckView.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/NumberCheckView.kt index 49373bab12..b2e44cbdbc 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/NumberCheckView.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/widget/NumberCheckView.kt @@ -6,13 +6,12 @@ import android.view.LayoutInflater import android.view.View import android.widget.FrameLayout import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.content.ContextCompat import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger.d import com.mogo.eagle.core.utilcode.mogo.logger.scene.SceneConstant import com.mogo.eagle.core.utilcode.util.ToastUtils -import com.mogo.och.common.module.voice.VoiceNotice +import com.mogo.och.common.module.biz.media.VoiceNotice import com.mogo.och.unmanned.taxi.passenger.R import kotlinx.android.synthetic.main.taxt_u_p_check_number.view.tv_taxi_passenger_number_back import kotlinx.android.synthetic.main.taxt_u_p_check_number.view.tv_taxi_passenger_number_eight diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml index 44171a642c..134930defa 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/item_ai_msg_qa.xml @@ -42,21 +42,6 @@ android:orientation="vertical" android:padding="31dp"> - - - - - - - + + + + + + + + + + app:layout_constraintGuide_percent="1" /> - + + + + + + + + + + + @@ -52,7 +52,7 @@ - + + app:layout_constraintStart_toEndOf="@id/leftEndGuideline" + > , IMoGoTrafficLightListe } private fun requestVip() { - vipNetWorkModel.requestVip({ - if (handler.hasMessages(MSG_WHAT_VIP_SEARCH)) { - handler.removeMessages(MSG_WHAT_VIP_SEARCH) - } - if (it.vipStatus) { - setVip(it.cancelDelayTime) - } else { - cancelVip() - } - }, { - handler.sendEmptyMessageDelayed(MSG_WHAT_VIP_SEARCH, 5_000L) - }) +// vipNetWorkModel.requestVip({ +// if (handler.hasMessages(MSG_WHAT_VIP_SEARCH)) { +// handler.removeMessages(MSG_WHAT_VIP_SEARCH) +// } +// if (it.vipStatus) { +// setVip(it.cancelDelayTime) +// } else { +// cancelVip() +// } +// }, { +// handler.sendEmptyMessageDelayed(MSG_WHAT_VIP_SEARCH, 5_000L) +// }) } override fun onEnterCrossRoad(enter: Boolean) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt index 3d07c2ff3b..5ae64d85ee 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/MoGoAutopilotControlProvider.kt @@ -1556,6 +1556,14 @@ class MoGoAutopilotControlProvider : return AdasManager.getInstance().sendSsmFuncOtaStatusQuery(token)>-1 } + /** + * OTA2.0查询 + * @param queryStr {"cmd":"PAD_QUERY_UPGRADE_STATUS","token":"123"} JSON + */ + override fun sendOtaPadMsgQuery(queryStr: String): Boolean { + return AdasManager.getInstance().sendOtaPadMsgQuery(queryStr) > -1 + } + /** * 人工接管时获取前方和后方摄像头数据 * 一次请求域控回调次两次摄像头数据 根据{@link MessagePad.CaptureImgOnTakeOver#getUuid()}进行区分是否是哪次请求 diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt index 0b0315c04a..51ff1b22e0 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasListenerImpl.kt @@ -622,6 +622,9 @@ class MoGoAdasListenerImpl : OnAdasListener { timestamp: Long, status: SsmInfo.PureStr? ) { + if(status != null){ + CallerOTAManager.invokeOtaPureStr(token,timestamp,status) + } } /** diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt index 5e9ddb8186..9a1481b6b1 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/adapter/MoGoAdasMsgConnectStatusListenerImpl.kt @@ -96,13 +96,14 @@ class MoGoAdasMsgConnectStatusListenerImpl : /** * 与工控机链接状态变化 * - * @param status {@link AdasConstants.IpcConnectionStatus} - * @param reason 连接信息(需要判null),目前只有以下参数存在值,其他全部为null - * {@link AdasConstants.IpcConnectionStatus#HEARTBEAT_TIMEOUT} 表示超时时间 - * {@link AdasConstants.IpcConnectionStatus#CONNECT_EXCEPTION} 表示连接异常原因 - * {@link AdasConstants.IpcConnectionStatus#SERVER_DISCONNECTED} 服务端断开(如果服务端关闭时发送了原因将存在,如果服务端关闭时未发送将为null) + * @param callbackTime 回调时间 + * @param status {@link AdasConstants.IpcConnectionStatus} + * @param reason 连接信息(需要判null),目前只有以下参数存在值,其他全部为null + * {@link AdasConstants.IpcConnectionStatus#HEARTBEAT_TIMEOUT} 表示超时时间 + * {@link AdasConstants.IpcConnectionStatus#CONNECT_EXCEPTION} 表示连接异常原因 + * {@link AdasConstants.IpcConnectionStatus#SERVER_DISCONNECTED} 服务端断开(如果服务端关闭时发送了原因将存在,如果服务端关闭时未发送将为null) */ - override fun onConnectionIPCStatus(status: AdasConstants.IpcConnectionStatus, reason: String?) { + override fun onConnectionIPCStatus(callbackTime: Long, status: AdasConstants.IpcConnectionStatus, reason: String?) { val isConnected = status == AdasConstants.IpcConnectionStatus.CONNECTED CallerAutopilotActionsListenerManager.setConnected(isConnected) CallerParallelDrivingActionsListenerManager.setConnected(isConnected) @@ -235,8 +236,10 @@ class MoGoAdasMsgConnectStatusListenerImpl : } AdasConstants.IpcConnectionStatus.HEARTBEAT_TIMEOUT -> { - connectStatusDescribe = - "心跳超时(连接域控成功后在一段时间内未收到域控任何数据),超时时间:${reason}秒" + connectStatusDescribe = "心跳超时" + reason?.let { + connectStatusDescribe = it + } CallerLogger.d( "$M_D_C$TAG", connectStatusDescribe @@ -270,7 +273,7 @@ class MoGoAdasMsgConnectStatusListenerImpl : CallerAutoPilotStatusListenerManager.getAutoPilotStatusInfo().connectStatusReason = reason CallerAutoPilotStatusListenerManager.invokeAutoPilotStatus() CallerAutoPilotStatusListenerManager.invokeAutoPilotIPCStatusChanged(status, reason) - saveIntoMsgBox(status, connectStatusDescribe) + saveIntoMsgBox(callbackTime, status, connectStatusDescribe) } /** @@ -326,9 +329,10 @@ class MoGoAdasMsgConnectStatusListenerImpl : linkChainLog = CHAIN_TYPE_SOCKET_AUTOPILOT, linkCode = CHAIN_SOURCE_ADAS, nodeAliasCode = CHAIN_CODE_ADAS_CONNECT_STATUS, - paramIndexes = [0,1] + paramIndexes = [0,1,2] ) private fun saveIntoMsgBox( + callbackTime: Long, status: AdasConstants.IpcConnectionStatus, reason: String ) { diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt index ec78bd91ac..a8700ec064 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/autopilot/telematic/TeleMsgHandler.kt @@ -380,6 +380,21 @@ class TeleMsgHandler : IMsgHandler { ) } + TelematicConstant.CONTROL_PASSENGER_AI_SWITCH -> { + CallerTelematicListenerManager.invokeReceivedMsg( + TelematicConstant.CONTROL_PASSENGER_AI_SWITCH, + it.body + ) + } + + TelematicConstant.CONTROL_B2_PRETTIFY_SWITCH -> { + val value = when (String(it.body)) { + "1" -> true + else -> false + } + CallerTelematicListenerManager.dispatchB2DemoMode(value) + } + TelematicConstant.SHOW_TRAFFIC_LIGHT -> { val trafficLightJson = String(it.body) CallerTrafficLightListenerManager.invokeTrafficLightStatus( diff --git a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt index fef9c96c91..7bcb4554da 100644 --- a/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt +++ b/core/function-impl/mogo-core-function-datacenter/src/main/java/com/mogo/eagle/core/function/datacenter/iot/IotManager.kt @@ -1,6 +1,7 @@ package com.mogo.eagle.core.function.datacenter.iot import com.mogo.commons.AbsMogoApplication +import com.mogo.commons.debug.DebugConfig import com.mogo.commons.env.ProjectUtils import com.mogo.commons.storage.SharedPrefsMgr import com.mogo.commons.utils.MogoAnalyticUtils @@ -67,17 +68,18 @@ object IotManager : IMoGoCloudListener, IWriteChainLogListener { paramIndexes = [0, 1, 2] ) override fun onWriteChainLog(tag: String, title: String, info: String) { - try { - i("${tag}_${EVENT_KEY_HARDWARE_DEVICES}", "${title}_${info}") - val params = HashMap() - params["time"] = sdf.format(Date()) - params["tag"] = tag - params["title"] = title - params["info"] = info - MogoAnalyticUtils.track(EVENT_KEY_HARDWARE_DEVICES, params) - - } catch (e: Exception) { - e.printStackTrace() + if(DebugConfig.isDebug()) { + try { + i("${tag}_${EVENT_KEY_HARDWARE_DEVICES}", "${title}_${info}") + val params = HashMap() + params["time"] = sdf.format(Date()) + params["tag"] = tag + params["title"] = title + params["info"] = info + MogoAnalyticUtils.track(EVENT_KEY_HARDWARE_DEVICES, params) + } catch (e: Exception) { + e.printStackTrace() + } } } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt index e3b480519d..17f0bb6d1a 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeConfig.kt @@ -28,4 +28,26 @@ object OTAUpgradeConfig { //已经提示过升级成功的列表 @JvmField var upgradeFinish: ArrayList = ArrayList() + + //OTA2.0 Token + @JvmField + var token: String = "" + + //已经提示过升级的列表 + var promptedUpgradeTwo: ArrayList = ArrayList() + + + + + + + + + + + + + + + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt index 9176eb045e..d283ff19bd 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/ota/OTAUpgradeManager.kt @@ -46,28 +46,55 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, private var responseTimeoutNum: Int = 0 //响应超时次数 private var shouldShowColdStartWindow: Boolean = false //是否需要展示冷启动页面 + private var versionTwoTimeoutNum: Int = 0 //OTA2.0版本响应超时次数 + + private var shouldToast: Boolean = false //OTA1.0升级是否需要提示没有升级任务 + private var secondVersionShouldToast: Boolean = true //OTA2.0升级是否需要提示没有任务升级 + private val handler =object : Handler(Looper.getMainLooper()){ override fun handleMessage(msg: Message) { super.handleMessage(msg) if(msg.what == 1){ - if(responseTimeoutNum<40){ + if(responseTimeoutNum<60){ responseTimeoutNum++ //30秒没有收到OTA升级推送主动进行查询 Log.i(TAG,"30秒没有收到OTA升级推送主动进行查询") CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) this.sendEmptyMessageDelayed(1,30000) }else{ - Log.i(TAG,"20分钟没有收到OTA升级推送置为失败") + Log.i(TAG,"30分钟没有收到OTA升级推送置为失败") CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) - CallerHmiManager.showOTAResultDialog(isShow = true, result = false) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false,true) } }else if(msg.what == 2){ Log.i(TAG,"司机屏弹窗提示用车人执行车辆下电操作") //如果OTA升级弹窗没有点击关闭,则自动关闭 - CallerHmiManager.showOTAResultDialog(isShow = false, result = true) + CallerHmiManager.showOTAResultDialog(isShow = false, result = true,false) //司机屏弹窗提示用车人执行车辆下电操作 CallerHmiManager.showOTAPowerOffFinishDialog() shouldShowColdStartWindow = true + }else if(msg.what == 3){ + //OTA2.0超时查询 + if(versionTwoTimeoutNum<60){ + versionTwoTimeoutNum++ + //30秒没有收到OTA升级推送主动进行查询 + Log.i(TAG,"30秒没有收到OTA升级推送主动进行查询") + //查询OTA升级 + val query = JSONObject() + query.put("cmd","PAD_QUERY_UPGRADE_STATUS") + query.put("token",OTAUpgradeConfig.token) + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + this.sendEmptyMessageDelayed(3,30000) + }else{ + Log.i(TAG,"30分钟没有收到OTA升级推送置为失败") + CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false,true) + } + }else if(msg.what == 4){ + if(shouldToast && secondVersionShouldToast){ + ToastUtils.showLong("暂无待升级任务!") + } } } } @@ -139,103 +166,106 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, OTAUpgradeConfig.otaToken = request.otaToken } } - //解析JSON - var upgradeComplete = true - val otaUpgradeList = ArrayList() - val productArray = JSONArray(request.productName) - if(productArray.length() > 0){ - for(index in 0 until productArray.length()){ - val productInfo = productArray[index] as JSONObject - val token = productInfo.optString("token") - val productStatus = productInfo.optInt("status") - val failReason = productInfo.optString("fail_reason") - val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 - val taskId = productInfo.optInt("task_id") - val taskItemId = productInfo.optInt("task_item_id") - val otaType = productInfo.optInt("ota_type") - var productName = productInfo.optString("product_name") - val needRestart = productInfo.optBoolean("need_restart") - val isDelay = productInfo.optBoolean("is_delay") - val curSize = productInfo.optDouble("cur_size") - val totalSize = productInfo.optDouble("total_size") - val taskNumber = productInfo.optInt("task_number") - val leftTime = productInfo.optInt("left_time") //剩余时间,单位秒 + try{ + //解析JSON + var upgradeComplete = true + val otaUpgradeList = ArrayList() + val productArray = JSONArray(request.productName) + if(productArray.length() > 0){ + for(index in 0 until productArray.length()){ + val productInfo = productArray[index] as JSONObject + val token = productInfo.optString("token") + val productStatus = productInfo.optInt("status") + val failReason = productInfo.optString("fail_reason") + val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 + val taskId = productInfo.optInt("task_id") + val taskItemId = productInfo.optInt("task_item_id") + val otaType = productInfo.optInt("ota_type") + var productName = productInfo.optString("product_name") + val needRestart = productInfo.optBoolean("need_restart") + val isDelay = productInfo.optBoolean("is_delay") + val curSize = productInfo.optDouble("cur_size") + val totalSize = productInfo.optDouble("total_size") + val taskNumber = productInfo.optInt("task_number") + val leftTime = productInfo.optInt("left_time") //剩余时间,单位秒 - Log.i(TAG, "index=$index") - Log.i(TAG, "token=$token") - Log.i(TAG, "status=$productStatus") - Log.i(TAG, "fail_reason=$failReason") - Log.i(TAG, "upgrade_reason=$upgradeReason") - Log.i(TAG, "task_id=$taskId") - Log.i(TAG, "task_item_id=$taskItemId") - Log.i(TAG, "ota_type=$otaType") - Log.i(TAG, "product_name=$productName") - Log.i(TAG, "need_restart=$needRestart") - Log.i(TAG, "is_delay=$isDelay") - Log.i(TAG, "cur_size=$curSize") - Log.i(TAG, "total_size=$totalSize") - Log.i(TAG,"task_number=$taskNumber") - Log.i(TAG,"left_time=$leftTime") + Log.i(TAG, "index=$index") + Log.i(TAG, "token=$token") + Log.i(TAG, "status=$productStatus") + Log.i(TAG, "fail_reason=$failReason") + Log.i(TAG, "upgrade_reason=$upgradeReason") + Log.i(TAG, "task_id=$taskId") + Log.i(TAG, "task_item_id=$taskItemId") + Log.i(TAG, "ota_type=$otaType") + Log.i(TAG, "product_name=$productName") + Log.i(TAG, "need_restart=$needRestart") + Log.i(TAG, "is_delay=$isDelay") + Log.i(TAG, "cur_size=$curSize") + Log.i(TAG, "total_size=$totalSize") + Log.i(TAG,"task_number=$taskNumber") + Log.i(TAG,"left_time=$leftTime") - val upgradeTime = if(leftTime > 60){ - "预计部署过程用时${leftTime/60}分钟${leftTime%60}秒" - }else{ - "预计部署过程用时${leftTime%60}秒" - } - - if(index == 0){ - //是否需要触发提示升级只判断第一个任务 - if(productStatus == 0){ - if(!OTAUpgradeConfig.promptedUpgrade.contains(request.otaToken)){ - //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 - if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus - && !OTAUpgradeConfig.inOrder){ - //触发强提示升级 - CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason+upgradeTime) - }else{ - //触发弱提示升级 - //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, - // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” - CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) - ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") - } - OTAUpgradeConfig.promptedUpgrade.add(request.otaToken) - } - return + val upgradeTime = if(leftTime > 60){ + "预计部署过程用时${leftTime/60}分钟${leftTime%60}秒" + }else{ + "预计部署过程用时${leftTime%60}秒" } - } - // 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败 - if(productStatus == 0 || productStatus == 1 || productStatus == 2){ - upgradeComplete = false + if(index == 0){ + //是否需要触发提示升级只判断第一个任务 + if(productStatus == 0){ + if(!OTAUpgradeConfig.promptedUpgrade.contains(request.otaToken)){ + //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 + if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus + && !OTAUpgradeConfig.inOrder){ + //触发强提示升级 + CallerHmiManager.showOTAUpgradeDialog(1,true,upgradeReason+upgradeTime) + }else{ + //触发弱提示升级 + //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, + // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” + CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") + } + OTAUpgradeConfig.promptedUpgrade.add(request.otaToken) + } + return + } + } + + // 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败 + if(productStatus == 0 || productStatus == 1 || productStatus == 2){ + upgradeComplete = false + } + if(productArray.length() != taskNumber){ + upgradeComplete = false + } + if(productName.contains(":")){ + productName = productName.trim().substringAfterLast(":") + } + val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason, + taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize,leftTime) + otaUpgradeList.add(otaUpgradeInfo) } - if(productArray.length() != taskNumber){ - upgradeComplete = false + CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + if(!upgradeComplete){ + responseTimeoutNum = 0 + handler.removeMessages(1) + handler.sendEmptyMessageDelayed(1,30000) + }else{ + responseTimeoutNum = 0 + handler.removeMessages(1) } - if(productName.contains(":")){ - productName = productName.trim().substringAfterLast(":") + if(upgradeComplete){ + OTAUpgradeConfig.otaToken = "" + CallerOTAManager.invokeOtaDownloadStatus(false) + }else{ + CallerOTAManager.invokeOtaDownloadStatus(true) } - val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason, - taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize,leftTime) - otaUpgradeList.add(otaUpgradeInfo) - } - CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) - if(!upgradeComplete){ - responseTimeoutNum = 0 - handler.removeMessages(1) - handler.sendEmptyMessageDelayed(1,30000) - }else{ - responseTimeoutNum = 0 - handler.removeMessages(1) - } - if(upgradeComplete){ - OTAUpgradeConfig.otaToken = "" - CallerOTAManager.invokeOtaDownloadStatus(false) - }else{ - CallerOTAManager.invokeOtaDownloadStatus(true) } + }catch (e: Exception){ + Log.e(TAG,"onOtaDownloadRequest e:${e}") } - } @@ -255,145 +285,288 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, OTAUpgradeConfig.otaToken = status.otaInfo.otaToken } } - - //解析JSON - if(status.otaInfo.productName.isEmpty()){ - if(OTAUpgradeConfig.isQuery){ - ToastUtils.showLong("暂无待升级任务!") - OTAUpgradeConfig.isQuery = false - }else{ - //没有升级任务,取消查询,关掉弹窗 - responseTimeoutNum = 0 - handler.removeMessages(1) - CallerHmiManager.showOTAUpgradeDialog(false,"") - CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) - CallerOTAManager.invokeOtaDownloadStatus(false) - } - return - } - - val otaUpgradeList = ArrayList() - val productArray = JSONArray(status.otaInfo.productName) - var upgradeComplete = true - var upgradeResult = true //升级结果 true代表成功 false代表失败 默认为升级成功 - if(productArray.length() > 0){ - for(index in 0 until productArray.length()){ - val productInfo = productArray[index] as JSONObject - val token = productInfo.optString("token") - val productStatus = productInfo.optInt("status") - val failReason = productInfo.optString("fail_reason") - val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 - val taskId = productInfo.optInt("task_id") - val taskItemId = productInfo.optInt("task_item_id") - val otaType = productInfo.optInt("ota_type") - var productName = productInfo.optString("product_name") - val needRestart = productInfo.optBoolean("need_restart") - val isDelay = productInfo.optBoolean("is_delay") - val curSize = productInfo.optDouble("cur_size") - val totalSize = productInfo.optDouble("total_size") - val taskNumber = productInfo.optInt("task_number") - val leftTime = productInfo.optInt("left_time")//剩余时间,单位秒 - - Log.i(TAG, "index=$index") - Log.i(TAG, "token=$token") - Log.i(TAG, "status=$productStatus") - Log.i(TAG, "fail_reason=$failReason") - Log.i(TAG, "upgrade_reason=$upgradeReason") - Log.i(TAG, "task_id=$taskId") - Log.i(TAG, "task_item_id=$taskItemId") - Log.i(TAG, "ota_type=$otaType") - Log.i(TAG, "product_name=$productName") - Log.i(TAG, "need_restart=$needRestart") - Log.i(TAG, "is_delay=$isDelay") - Log.i(TAG, "cur_size=$curSize") - Log.i(TAG, "total_size=$totalSize") - Log.i(TAG,"task_number=$taskNumber") - Log.i(TAG,"left_time=$leftTime") - - val upgradeTime = if(leftTime > 60){ - "预计部署过程用时${leftTime/60}分钟${leftTime%60}秒" - }else{ - "预计部署过程用时${leftTime%60}秒" - } - - if(index == 0){ - //是否需要触发提示升级只判断第一个任务 - if(productStatus == 0){ - if(!OTAUpgradeConfig.promptedUpgrade.contains(status.otaInfo.otaToken)){ - //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 - if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus - && !OTAUpgradeConfig.inOrder){ - //触发强提示升级 - CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason+upgradeTime) - }else{ - //触发弱提示升级 - //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, - // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” - CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) - ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") - } - OTAUpgradeConfig.promptedUpgrade.add(status.otaInfo.otaToken) - } - OTAUpgradeConfig.isQuery = false - return - } - } - - - // 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败 - if(productStatus == 0 || productStatus == 1 || productStatus == 2){ - upgradeComplete = false - } - if(productArray.length() != taskNumber){ - upgradeComplete = false - } - if(productStatus == 4){ - upgradeResult = false - upgradeComplete = true - } - if(productName.contains(":")){ - productName = productName.trim().substringAfterLast(":") - } - val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason, - taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize,leftTime) - otaUpgradeList.add(otaUpgradeInfo) - } - if(!upgradeComplete){ - responseTimeoutNum = 0 - handler.removeMessages(1) - handler.sendEmptyMessageDelayed(1,30000) - }else{ - responseTimeoutNum = 0 - handler.removeMessages(1) - } - if(upgradeComplete){ - OTAUpgradeConfig.otaToken = "" + try { + //解析JSON + if(status.otaInfo.productName.isEmpty()){ if(OTAUpgradeConfig.isQuery){ - ToastUtils.showLong("暂无待升级任务!") +// ToastUtils.showLong("暂无待升级任务!") + shouldToast = true OTAUpgradeConfig.isQuery = false }else{ - CallerHmiManager.showOTADownloadStatusDialog(false,otaUpgradeList) - CallerHmiManager.showOTAResultDialog(true,upgradeResult) - //升级成功,自动执行优雅停服 - if(upgradeResult){ - CallerAutoPilotControlManager.sendIpcPowerOff() - //当优雅停服完成、需要车辆下电的时候(比如当前是停服触发60s后),车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 - handler.sendEmptyMessageDelayed(2,60000) - } + //没有升级任务,取消查询,关掉弹窗 + responseTimeoutNum = 0 + handler.removeMessages(1) + CallerHmiManager.showOTAUpgradeDialog(1,false,"") + CallerHmiManager.showOTADownloadStatusDialog(false, emptyList()) + CallerOTAManager.invokeOtaDownloadStatus(false) } - CallerOTAManager.invokeOtaDownloadStatus(false) - }else{ - //通知关闭提示升级窗口(存在域控也在进行5min倒计时,与app存在时间差,域控会更早完成倒计时触发升级, - // 此时通知app开始升级,app收到后即使未完成倒计时,也关闭提示弹窗,开始展示下载进展) - OTAUpgradeConfig.isQuery = false - CallerHmiManager.showOTAUpgradeDialog(false,"") - CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) - CallerOTAManager.invokeOtaDownloadStatus(true) + return } - } + val otaUpgradeList = ArrayList() + val productArray = JSONArray(status.otaInfo.productName) + var upgradeComplete = true + var upgradeResult = true //升级结果 true代表成功 false代表失败 默认为升级成功 + if(productArray.length() > 0){ + for(index in 0 until productArray.length()){ + val productInfo = productArray[index] as JSONObject + val token = productInfo.optString("token") + val productStatus = productInfo.optInt("status") + val failReason = productInfo.optString("fail_reason") + val upgradeReason = productInfo.optString("upgrade_reason")//升级原因 + val taskId = productInfo.optInt("task_id") + val taskItemId = productInfo.optInt("task_item_id") + val otaType = productInfo.optInt("ota_type") + var productName = productInfo.optString("product_name") + val needRestart = productInfo.optBoolean("need_restart") + val isDelay = productInfo.optBoolean("is_delay") + val curSize = productInfo.optDouble("cur_size") + val totalSize = productInfo.optDouble("total_size") + val taskNumber = productInfo.optInt("task_number") + val leftTime = productInfo.optInt("left_time")//剩余时间,单位秒 + + Log.i(TAG, "index=$index") + Log.i(TAG, "token=$token") + Log.i(TAG, "status=$productStatus") + Log.i(TAG, "fail_reason=$failReason") + Log.i(TAG, "upgrade_reason=$upgradeReason") + Log.i(TAG, "task_id=$taskId") + Log.i(TAG, "task_item_id=$taskItemId") + Log.i(TAG, "ota_type=$otaType") + Log.i(TAG, "product_name=$productName") + Log.i(TAG, "need_restart=$needRestart") + Log.i(TAG, "is_delay=$isDelay") + Log.i(TAG, "cur_size=$curSize") + Log.i(TAG, "total_size=$totalSize") + Log.i(TAG,"task_number=$taskNumber") + Log.i(TAG,"left_time=$leftTime") + + val upgradeTime = if(leftTime > 60){ + "预计部署过程用时${leftTime/60}分钟${leftTime%60}秒" + }else{ + "预计部署过程用时${leftTime%60}秒" + } + + if(index == 0){ + //是否需要触发提示升级只判断第一个任务 + if(productStatus == 0){ + if(!OTAUpgradeConfig.promptedUpgrade.contains(status.otaInfo.otaToken)){ + //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 + if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus + && !OTAUpgradeConfig.inOrder){ + //触发强提示升级 + CallerHmiManager.showOTAUpgradeDialog(1,true,upgradeReason+upgradeTime) + }else{ + //触发弱提示升级 + //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, + // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” + CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") + } + OTAUpgradeConfig.promptedUpgrade.add(status.otaInfo.otaToken) + } + OTAUpgradeConfig.isQuery = false + return + } + } + + + // 状态 0:默认(未开始), 1:下载中, 2:下载完成, 3:升级完成, 4:升级失败 + if(productStatus == 0 || productStatus == 1 || productStatus == 2){ + upgradeComplete = false + } + if(productArray.length() != taskNumber){ + upgradeComplete = false + } + if(productStatus == 4){ + upgradeResult = false + upgradeComplete = true + } + if(productName.contains(":")){ + productName = productName.trim().substringAfterLast(":") + } + val otaUpgradeInfo = OtaUpgradeInfo(token, productStatus,failReason,upgradeReason, + taskId,taskItemId,otaType,productName,needRestart,isDelay,curSize,totalSize,leftTime) + otaUpgradeList.add(otaUpgradeInfo) + } + if(!upgradeComplete){ + responseTimeoutNum = 0 + handler.removeMessages(1) + handler.sendEmptyMessageDelayed(1,30000) + }else{ + responseTimeoutNum = 0 + handler.removeMessages(1) + } + if(upgradeComplete){ + OTAUpgradeConfig.otaToken = "" + if(OTAUpgradeConfig.isQuery){ +// ToastUtils.showLong("暂无待升级任务!") + shouldToast = true + OTAUpgradeConfig.isQuery = false + }else{ + CallerHmiManager.showOTADownloadStatusDialog(false,otaUpgradeList) + CallerHmiManager.showOTAResultDialog(true,upgradeResult,false) + //升级成功,自动执行优雅停服 + if(upgradeResult){ + CallerAutoPilotControlManager.sendIpcPowerOff() + //当优雅停服完成、需要车辆下电的时候(比如当前是停服触发60s后),车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + handler.sendEmptyMessageDelayed(2,60000) + } + } + CallerOTAManager.invokeOtaDownloadStatus(false) + }else{ + //通知关闭提示升级窗口(存在域控也在进行5min倒计时,与app存在时间差,域控会更早完成倒计时触发升级, + // 此时通知app开始升级,app收到后即使未完成倒计时,也关闭提示弹窗,开始展示下载进展) + OTAUpgradeConfig.isQuery = false + CallerHmiManager.showOTAUpgradeDialog(1,false,"") + CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + CallerOTAManager.invokeOtaDownloadStatus(true) + } + } + }catch (e: Exception){ + Log.e(TAG,"onOtaStatus e:${e}") + } } + /** + * OTA 2.0 新接口 + * @param token PadSsmMsg唯一消息ID + * @param timestamp 消息发送时间 单位:毫秒 + * @param status OTA 2.0 数据 + */ + override fun onOtaPureStr(token: Long, timestamp: Long, status: SsmInfo.PureStr) { + super.onOtaPureStr(token, timestamp, status) + Log.i(TAG, "onOtaPureStr token=$token") + Log.i(TAG, "onOtaPureStr timestamp=$timestamp") + Log.i(TAG, "onOtaPureStr status=$status") + Log.i(TAG, "onOtaPureStr status.data=${status.data}") + try { + val jsonObject = JSONObject(status.data) + val cmd = jsonObject.optString("cmd") + //无升级任务 + if("ASK_PAD_NO_UPGRADE" == cmd){ + ToastUtils.showShort("暂无OTA升级任务") + return + } + + val otaToken = jsonObject.optString("token") + val otaStatus = jsonObject.optString("status") + val upgradeReason = jsonObject.optString("upgrade_reason") + val isDelay = jsonObject.optBoolean("is_delay") + val isCancel = jsonObject.optBoolean("is_cancel") + + Log.i(TAG, "cmd=$cmd") + Log.i(TAG, "otaToken=$otaToken") + Log.i(TAG, "otaStatus=$otaStatus") + Log.i(TAG, "upgradeReason=$upgradeReason") + Log.i(TAG, "isDelay=$isDelay") + Log.i(TAG, "isCancel=$isCancel") + + OTAUpgradeConfig.token = otaToken + + val products = jsonObject.optString("products") + val productsArray = JSONArray(products) + val otaUpgradeList = ArrayList() + if(productsArray.length() > 0){ + for(index in 0 until productsArray.length()){ + val productInfo = productsArray[index] as JSONObject + val productStatus = productInfo.optString("status") + val failReason = productInfo.optString("fail_reason") + val speed = productInfo.optDouble("speed") + val leftTime = productInfo.optInt("left_time") + val name = productInfo.optString("name") + val curSize = productInfo.optDouble("cur_size") + val totalSize = productInfo.optDouble("total_size") + + Log.i(TAG, "productStatus=$productStatus") + Log.i(TAG, "failReason=$failReason") + Log.i(TAG, "speed=$speed") + Log.i(TAG, "leftTime=$leftTime") + Log.i(TAG, "name=$name") + Log.i(TAG, "curSize=$curSize") + Log.i(TAG, "totalSize=$totalSize") + + val otaUpgradeInfo = OtaUpgradeInfo(otaToken, getProjectStatus(productStatus),failReason,upgradeReason, + 0,0,1,name,true,isDelay,curSize,totalSize,leftTime) + otaUpgradeList.add(otaUpgradeInfo) + + } + } + + //请求升级 + if(cmd == "ASK_PAD_UPGRADE" &&( otaStatus == "init" || otaStatus == "delay")){ + secondVersionShouldToast = false //收到请求升级,故不需要进行提示 + //冷启动已完成(包括成功/失败),且驾驶状态为非自驾状态,且当前无订单进行强提示,否则为弱提示 + if(OTAUpgradeConfig.coldStartCompleted && !OTAUpgradeConfig.autopilotStatus + && !OTAUpgradeConfig.inOrder){ + //触发强提示升级 + CallerHmiManager.showOTAUpgradeDialog(2,true,upgradeReason) + }else{ + //触发弱提示升级 + //冷启动未完成(进行中),或驾驶状态为自驾状态,或当前有订单,直接默认选择稍后升级, + // 并toast提示“收到车辆部署任务,请在车辆空闲时发起升级” + + val reason = if(OTAUpgradeConfig.autopilotStatus){ + "处于自驾中" + }else if(OTAUpgradeConfig.inOrder){ + "处于订单中" + }else{ + "冷启动未完成" + } + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",false) + query.put("reason",reason) + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + + ToastUtils.showLong("收到车辆部署任务,请在车辆空闲时发起升级") + } + return + } + + //升级中 + if(cmd == "PAD_UPGRADE_REPORT"){ + CallerHmiManager.showOTADownloadStatusDialog(true,otaUpgradeList) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) + handler.sendEmptyMessageDelayed(3,30000) + } + //升级完成 + if(otaStatus == "fail"){ + CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = false,false) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) + CallerOTAManager.invokeOtaDownloadStatus(false) + OTAUpgradeConfig.token = "" + } + if(otaStatus == "success"){ + //升级成功,自动执行优雅停服 + CallerAutoPilotControlManager.sendIpcPowerOff() + //当优雅停服完成、需要车辆下电的时候(比如当前是停服触发60s后),车端告知鹰眼,司机屏弹窗提示用车人执行车辆下电操作 + handler.sendEmptyMessageDelayed(2,60000) + CallerOTAManager.invokeOtaDownloadStatus(false) + CallerHmiManager.showOTADownloadStatusDialog(false,emptyList()) + CallerHmiManager.showOTAResultDialog(isShow = true, result = true,false) + versionTwoTimeoutNum = 0 + handler.removeMessages(3) + OTAUpgradeConfig.token = "" + } + }catch (e: Exception){ + Log.e(TAG,"onOtaPureStr e;${e}") + } + } + + override fun sendOtaPadMsgQuery() { + super.sendOtaPadMsgQuery() + shouldToast = false + secondVersionShouldToast = true + handler.sendEmptyMessageDelayed(4,3000) + } + + private val pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+") /** @@ -438,5 +611,32 @@ object OTAUpgradeManager: IMoGoAutopilotStatusListener, IDataCenterBizListener, return version } + private fun getProjectStatus(status: String): Int{ + return when(status){ + "init"->{ + 0 + } + "downloading"->{ + 1 + } + "sync_slave"->{ + 2 + } + "upgrading"->{ + 2 + } + "success"->{ + 3 + } + "fail"->{ + 4 + } + else->{ + 0 + } + + } + } + } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt index 787daf3446..96c439e93d 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/report/IPCReportManager.kt @@ -7,6 +7,7 @@ import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager +import com.mogo.eagle.core.function.call.devatools.CallerCollisionRiskManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxManager import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.UiThreadHandler @@ -84,6 +85,11 @@ class IPCReportManager : IMoGoAutopilotStatusListener { */ override fun onAutopilotGuardian(guardianInfo: MogoReportMsg.MogoReportMessage?) { guardianInfo?.let{ + //8.1.4版本异常声光电提醒 + if(it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND){ + CallerCollisionRiskManager.invokeCollisionRisk() + } + if(it.resultList.contains(RESULT_AUTOPILOT_DISABLE) || it.resultList.contains(RESULT_AUTOPILOT_SYSTEM_UNSTARTED) || it.resultList.contains(RESULT_REMOTEPILOT_DISABLE) @@ -96,7 +102,7 @@ class IPCReportManager : IMoGoAutopilotStatusListener { || it.code == MogoReport.Code.Info.IMAP.EXIT_AUTOPILOT || it.code == MogoReport.Code.Info.IMAP.ENTRY_REMOTEPILOT || it.code == MogoReport.Code.Info.IMAP.EXIT_REMOTEPILOT - || it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND +// || it.code == MogoReport.Code.Info.IMAP.CONTROLLER_START_FM_COMMAND || it.code == MogoReport.Code.Info.IMAP.CONTROLLER_FINISH_FM_COMMAND || it.code == MogoReport.Code.Info.IMAP.CONTROLLER_ABORT_FM_COMMAND || it.code == MogoReport.Code.Info.IMAP.PLANNING_START_FM_COMMAND diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt index 757fcef971..f126fe9b9e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/bone/tab/CarInfoTabView.kt @@ -22,6 +22,7 @@ import com.mogo.eagle.core.function.call.autopilot.CallerChassisLocationWGS84Lis import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsListenerManager import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.devatools.CallerOTAManager import com.mogo.eagle.core.function.call.hmi.CallerHmiListenerManager import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.map.CallerMapUIServiceManager @@ -159,9 +160,17 @@ class CarInfoTabView @JvmOverloads constructor( OTAUpgradeConfig.isQuery = true OTAUpgradeConfig.promptedUpgrade.remove(OTAUpgradeConfig.otaToken) CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) + + //查询OTA2.0升级 + val query = JSONObject() + query.put("cmd","PAD_QUERY_UPGRADE_STATUS") + query.put("token",OTAUpgradeConfig.token) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + CallerOTAManager.invokeOtaPadMsgQuery() }else{ ToastUtils.showLong("当前SSM节点未成功启动或当前版本不支持OTA升级") } + } tvHDMapVersion.text = tvHDMapVersion.text.toString() + DebugConfig.getMapVersion() //高精地图 检查更新 @@ -265,8 +274,10 @@ class CarInfoTabView @JvmOverloads constructor( if(AppConfigInfo.mapShowName.isNotEmpty()){ tvADVersionName.text = AppConfigInfo.mapShowName }else{ - CallerAutoPilotStatusListenerManager.getDockerVersion()?.let { - tvADVersionName.text = it + if(CallerAutoPilotStatusListenerManager.getDockerVersion().isNullOrEmpty()){ + tvADVersionName.text = "" + }else{ + tvADVersionName.text = CallerAutoPilotStatusListenerManager.getDockerVersion() } } } @@ -378,7 +389,7 @@ class CarInfoTabView @JvmOverloads constructor( }else{ "预计部署过程用时${leftTime%60}秒" } - CallerHmiManager.showOTAUpgradeDialog(true,upgradeReason+upgradeTime) + CallerHmiManager.showOTAUpgradeDialog(1,true,upgradeReason+upgradeTime) }else{ ToastUtils.showLong("请结束订单后触发升级") } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt index e53a07eb0f..42c0e5c60e 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/MoGoHmiProvider.kt @@ -37,7 +37,6 @@ import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.event.Event import com.mogo.eagle.core.function.api.hmi.xiaozhi.listener.OnXiaoZhiStateChangeListener import com.mogo.eagle.core.function.api.hmi.xiaozhi.state.State -import com.mogo.eagle.core.function.api.map.angle.Scene import com.mogo.eagle.core.function.api.och.toolkit.IToolKitItemClickListener import com.mogo.eagle.core.function.api.och.toolkit.ToolKitCustomItemAddParam import com.mogo.eagle.core.function.api.och.toolkit.ToolKitDefaultItemAddParam @@ -430,6 +429,10 @@ class MoGoHmiProvider : IMoGoHmiProvider { CallerTurnLightListenerManager.invokeHideTurnLightView() } + override fun isShuttleDriverPerformTask(): Boolean { + return MogoStatusManager.getInstance().isShuttleDriverPerformTask + } + override fun isTaxiUnmanedDriverPerformTask(): Boolean { return MogoStatusManager.getInstance().isTaxiUnmanedDriverPerformTask } @@ -491,11 +494,13 @@ class MoGoHmiProvider : IMoGoHmiProvider { if (target != null && target.visibility != View.VISIBLE) { TransitionManager.beginDelayedTransition(target.parent as ViewGroup, Slide(Gravity.START).also { it.duration = 150; it.addTarget(target) }) target.visibility = View.VISIBLE + CallerHmiViewControlListenerManager.invokeOperatePanelDisplayStatus(true) } } else { if (target != null && target.visibility == View.VISIBLE) { TransitionManager.beginDelayedTransition(target.parent as ViewGroup, Slide(Gravity.START).also { it.duration = 150; it.addTarget(target) }) target.visibility = View.GONE + CallerHmiViewControlListenerManager.invokeOperatePanelDisplayStatus(false) } } } @@ -672,10 +677,11 @@ class MoGoHmiProvider : IMoGoHmiProvider { /** * 展示OTA升级弹窗 + * @param version OTA升级版本 * @param isShow 设置是否展示 * @param content 升级内容 */ - override fun showOTAUpgradeDialog(isShow: Boolean,content: String) { + override fun showOTAUpgradeDialog(version: Int,isShow: Boolean,content: String) { ThreadUtils.runOnUiThread{ context?.let { if(isShow){ @@ -685,6 +691,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { if(otaUpgradeDialog?.isShowing == false){ otaUpgradeDialog?.show() } + otaUpgradeDialog?.setOTAVersion(version) otaUpgradeDialog?.showUpgradeContent(content) }else{ if(otaUpgradeDialog?.isShowing == true){ @@ -727,7 +734,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { * @param isShow 是否展示 * @param result true升级成功 false升级失败 */ - override fun showOTAResultDialog(isShow: Boolean,result: Boolean) { + override fun showOTAResultDialog(isShow: Boolean,result: Boolean,isTimeout: Boolean) { ThreadUtils.runOnUiThread{ if(isShow){ context?.let{ @@ -737,7 +744,7 @@ class MoGoHmiProvider : IMoGoHmiProvider { if(otaUpgradeResultDialog?.isShowing == false){ otaUpgradeResultDialog?.show() } - otaUpgradeResultDialog?.showResult(result) + otaUpgradeResultDialog?.showResult(result,isTimeout) } }else{ if(otaUpgradeResultDialog?.isShowing == true){ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt index 19db18b10e..3ac8d78be8 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/DriverMsgBoxBubbleView.kt @@ -8,25 +8,31 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.autopilot.IMoGoNodeStateListener import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotControlManager import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerNodeStateListenerManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.DriverMsgBoxBubbleAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -149,41 +155,98 @@ class DriverMsgBoxBubbleView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 + +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 8.2.0需求:定义三种不同提示强度的异常提示交互 + * 不判断驾驶状态,发生相应故障时立即有相应的提醒 + * 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒 + * 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断 + * 除此以外不做其他提示频率限制 + * + * 一级:安全停车 + * FM_DP_EMERGENCY_STOP(就地紧急停车)、FM_DP_COMFORTABLE_STOP(立刻舒适停车)、FM_DP_PNC_CHOOSE_STOP(择机靠边停车) + * 交互:图像、TTS、消息盒子 + * + * 二级:降速行驶 + * FM_DP_SPEED_LIMIT3(三级降速)、FM_DP_SPEED_LIMIT2(二级降速)、FM_DP_SPEED_LIMIT1(一级降速) + * 交互:TTS、消息盒子 + * + * 三级:无操作 + * FM_DP_ONLY_WARNING(警示)、FM_DP_NO_ACTION(报告) + * ps:以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示 + */ val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){ + //一级 + MsgFmData.LEVEL_ONE->{ + //接管图像提示、语音提示 + CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType, + EventTypeEnumNew.TAKE_OVER_EVENT.content, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + showData(msgBoxBean) + } + //三级 + MsgFmData.LEVEL_THREE->{ + //在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息 } } + + } } else { if (msgBoxBean.sourceType == DataSourceType.SUMMARY) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt index 733f4e46fc..e57ec8c058 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/MsgBoxToastView.kt @@ -8,23 +8,29 @@ import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.commons.env.ProjectUtils +import com.mogo.commons.voice.AIAssist import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.deva.report.ReportEntity import com.mogo.eagle.core.data.enums.DataSourceType +import com.mogo.eagle.core.data.enums.EventTypeEnumNew import com.mogo.eagle.core.data.msgbox.FMInfoMsg import com.mogo.eagle.core.data.msgbox.MsgBoxBean import com.mogo.eagle.core.data.msgbox.MsgBoxCountDownBean import com.mogo.eagle.core.data.msgbox.MsgBoxType import com.mogo.eagle.core.data.msgbox.MsgCategory import com.mogo.eagle.core.data.msgbox.MsgFmData +import com.mogo.eagle.core.data.takeover.TAKE_OVER_REQUEST import com.mogo.eagle.core.function.api.datacenter.IDataCenterBizListener import com.mogo.eagle.core.function.api.datacenter.msgbox.IMsgBoxListener +import com.mogo.eagle.core.function.api.hmi.warning.IMoGoWarningStatusListener import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager import com.mogo.eagle.core.function.call.autopilot.CallerIpcConnectStateToastManager import com.mogo.eagle.core.function.call.datacenter.CallerDataCenterBizListener import com.mogo.eagle.core.function.call.devatools.CallerDevaToolsManager +import com.mogo.eagle.core.function.call.hmi.CallerHmiManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxEventListenerManager import com.mogo.eagle.core.function.call.msgbox.CallerMsgBoxListenerManager +import com.mogo.eagle.core.function.call.setting.CallerTakeOverManager import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.function.hmi.ui.msgbox.adapter.MsgBoxToastAdapter import com.mogo.eagle.core.function.msgbox.MsgBoxConfig @@ -141,41 +147,96 @@ class MsgBoxToastView @JvmOverloads constructor( } else if (category == MsgCategory.FM_INFO) { CallerMsgBoxEventListenerManager.invokeUpdateTipListener(true) if (FunctionBuildConfig.isTakeoverRemind) { - //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// //属于停车警示(包括择机靠边停车、立即舒适停车、就地紧急停车)时,需要弹出消息气泡并伴有提示音 +// var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) +// fmInfoMsg.fmInfoList?.forEach { faultInfo -> +// if (faultInfo.faultActionCount > 0) { +// faultInfo.faultActionList.forEach { actionCode -> +// //获取建议操作级别,得到建议操作级别最高的操作 +// if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { +// curFaultLevel = +// MsgFmData.FaultAction.getFaultLevel(actionCode) +// } +// } +// } +// } +// //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 +// if (curFaultLevel == 0) { +// //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 +// if (CallerAutoPilotStatusListenerManager.getState() == 2 +// || CallerAutoPilotStatusListenerManager.getState() == 7 +// ) { +// // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 +// // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 +// // if (hasNoneFSMNode()) { +// //语音提示 +// try { +// SoundPoolUtils.getSoundPool() +// .playSoundWithRedId(context, R.raw.weak_net_tips) +// } catch (e: Exception) { +// e.printStackTrace() +// } +// //展示消息 +// showData(msgBoxBean) +// //} +// } +// } + + /** + * 8.2.0需求:定义三种不同提示强度的异常提示交互 + * 不判断驾驶状态,发生相应故障时立即有相应的提醒 + * 若同一时间触发多个多种级别异常,则按照最高级别的异常交互元素做提醒,低级别的异常不做特殊提醒 + * 若同一时间触发多个同一级别异常,则同一时刻只提醒一次,不互相打断 + * 除此以外不做其他提示频率限制 + * + * 一级:安全停车 + * FM_DP_EMERGENCY_STOP(就地紧急停车)、FM_DP_COMFORTABLE_STOP(立刻舒适停车)、FM_DP_PNC_CHOOSE_STOP(择机靠边停车) + * 交互:图像、TTS、消息盒子 + * + * 二级:降速行驶 + * FM_DP_SPEED_LIMIT3(三级降速)、FM_DP_SPEED_LIMIT2(二级降速)、FM_DP_SPEED_LIMIT1(一级降速) + * 交互:TTS、消息盒子 + * + * 三级:无操作 + * FM_DP_ONLY_WARNING(警示)、FM_DP_NO_ACTION(报告) + * ps:以上异常提醒受司机屏工具箱-运营面板-美化模式-接管提醒开关控制,默认开启有全量提示,关闭后无语音/图像提示,只有消息盒子红点展示 + */ val fmInfoMsg = msgBoxBean.bean as FMInfoMsg - var curFaultLevel = 5 //默认级别,遍历数组找出级别最高的(level数越小,级别越高) - fmInfoMsg.fmInfoList?.forEach { faultInfo -> - if (faultInfo.faultActionCount > 0) { - faultInfo.faultActionList.forEach { actionCode -> - //获取建议操作级别,得到建议操作级别最高的操作 - if (MsgFmData.FaultAction.getFaultLevel(actionCode) < curFaultLevel) { - curFaultLevel = - MsgFmData.FaultAction.getFaultLevel(actionCode) - } - } - } - } - //P0级消息弹出时需要判断驾驶状态,非自动驾驶、非平行驾驶状态不弹出,其余状态弹出 - if (curFaultLevel == 0) { - //自动驾驶状态 0是不可用 1是ready 2是自动驾驶中 7:平行驾驶中 - if (CallerAutoPilotStatusListenerManager.getState() == 2 - || CallerAutoPilotStatusListenerManager.getState() == 7 - ) { - // 6.6.0 ,因为 FSM 模块也会弹修改为只有没有 FSM 模块才弹 - // 6.6.0 ,20240823 考虑到 FSM 初期消息不一定全,先不加限制,产品先观察功能后再考虑是否过滤 - // if (hasNoneFSMNode()) { - //语音提示 - try { - SoundPoolUtils.getSoundPool() - .playSoundWithRedId(context, R.raw.weak_net_tips) - } catch (e: Exception) { - e.printStackTrace() - } - //展示消息 + when(MsgFmData.getFmPolicyLevel(fmInfoMsg.policyCode)){ + //一级 + MsgFmData.LEVEL_ONE->{ + //接管图像提示、语音提示 + CallerDevaToolsManager.takeOver(TAKE_OVER_REQUEST) + CallerHmiManager.warningV2X( + EventTypeEnumNew.TAKE_OVER_EVENT.poiType, + EventTypeEnumNew.TAKE_OVER_EVENT.content, + "识别车辆故障,建议立即接管安全停车,查看操作建议", + object : IMoGoWarningStatusListener { + override fun onShow() { + CallerTakeOverManager.invokeTakeOverEvent(true) + } + + override fun onDismiss() { + CallerTakeOverManager.invokeTakeOverEvent(false) + } + },expireTime =3000L, isFromObu = false + ) + //展示消息盒子消息 showData(msgBoxBean) - //} + } + //二级 + MsgFmData.LEVEL_TWO->{ + //语音提示 + AIAssist.getInstance(context).speakTTSVoice("识别车辆异常,建议尽快安全停车,查看操作建议") + //展示消息盒子消息 + showData(msgBoxBean) + } + //三级 + MsgFmData.LEVEL_THREE->{ + //在消息盒子图标上,可查看到红点标记,无其他元素特殊提醒;点进消息盒子可查看到详细信息 } } + } } else { if (msgBoxBean.sourceType == DataSourceType.SUMMARY) { diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt index 4d3933cac9..8c29a90da5 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/operate/OperatePanelLayout.kt @@ -2,13 +2,18 @@ package com.mogo.eagle.core.function.hmi.ui.operate import android.content.Context import android.os.Bundle +import android.os.Handler +import android.os.Looper +import android.os.Message import android.os.SystemClock import android.util.AttributeSet import android.util.Log +import android.view.Gravity import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout +import android.widget.Toast import androidx.annotation.CallSuper import androidx.core.content.ContextCompat import androidx.lifecycle.lifecycleScope @@ -26,6 +31,7 @@ import com.mogo.eagle.core.data.config.FunctionBuildConfig import com.mogo.eagle.core.data.config.HmiBuildConfig import com.mogo.eagle.core.data.multidisplay.TelematicConstant import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotCarConfigListener +import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener import com.mogo.eagle.core.function.api.autopilot.IMoGoGetParamResponseListener import com.mogo.eagle.core.function.api.devatools.IV2XListener import com.mogo.eagle.core.function.api.devatools.mofang.IMoGoMoFangProvider @@ -56,6 +62,7 @@ import com.mogo.eagle.core.function.hmi.ui.operate.preferences.PreferenceWithWel import com.mogo.eagle.core.function.hmi.ui.tools.SweeperModeChangedConfirmDialog import com.mogo.eagle.core.function.hmi.ui.utils.HmiActionLog.Companion.hmiAction import com.mogo.eagle.core.function.hmi.ui.utils.SOPAnalyticsManager.clickEventAnalytics +import com.mogo.eagle.core.function.main.MainMoGoApplication import com.mogo.eagle.core.utilcode.kotlin.onClick import com.mogo.eagle.core.utilcode.mogo.AppIdentityModeUtils import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger @@ -75,6 +82,7 @@ import kotlinx.android.synthetic.main.layout_operate_panel.view.iv_operate_panel import kotlinx.coroutines.launch import me.jessyan.autosize.utils.AutoSizeUtils import mogo.telematics.pad.MessagePad +import java.lang.Exception import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.TimeUnit import kotlin.math.min @@ -322,8 +330,12 @@ class OperatePanelLayout : LinearLayout { } } - class V2XPreferenceFragmentCompat : OperatePanelDetailBase(), IV2XListener { - + class V2XPreferenceFragmentCompat : OperatePanelDetailBase(), IV2XListener, + IMoGoAutopilotStatusListener,IViewControlListener { + private var v2xIsShow: Boolean = false + private var operatePaneIsShow = true + private var prevIpcConnectStatus = false + private var customToast: Toast? = null companion object { private const val TAG = "V2XPreferenceFragmentCompat" private const val NDE_UPWARD_SWITCH = "nde_upward_switch" //NDE(数据上车)上行 @@ -338,6 +350,8 @@ class OperatePanelLayout : LinearLayout { private const val V2I_WEAK_TRAFFIC_PARTICIPANT = "v2i_weak_traffic_participant" //弱势交通参与者 private const val V2I_PERCEPTION_DATA_TO_PNC = "v2i_perception_data_to_pnc" //感知数据进PNC应用 private const val V2V_DOWNWARD_SWITCH = "v2v_downward_switch" //V2V下行 + + private const val WHAT_UPDATE_ENABLE = 0x00//更新按钮状态 } override fun onCreateView(inflater: LayoutInflater, @@ -352,12 +366,32 @@ class OperatePanelLayout : LinearLayout { //车辆图像上传行云大模型状态查询 CallerAutoPilotControlManager.sendImgUploadCloudStatusQuery() } + prevIpcConnectStatus = AppConfigInfo.isConnectAutopilot + CallerAutoPilotStatusListenerManager.addListener(TAG, this) + CallerHmiViewControlListenerManager.addListener(TAG,this) return super.onCreateView(inflater, container, savedInstanceState) } override fun onDestroyView() { - CallerV2XManager.removeListener(TAG) super.onDestroyView() + CallerV2XManager.removeListener(TAG) + CallerAutoPilotStatusListenerManager.removeListener(TAG) + CallerHmiViewControlListenerManager.removeListener(TAG) + handler.removeCallbacksAndMessages(null) + } + + override fun operatePanelDisplayStatus(isShow: Boolean) { + super.operatePanelDisplayStatus(isShow) + operatePaneIsShow = isShow + if (isShow) { + if (v2xIsShow) { + handler.sendEmptyMessage(WHAT_UPDATE_ENABLE) + } + } else { + handler.removeMessages(WHAT_UPDATE_ENABLE) + customToast?.cancel() + customToast = null + } } override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -418,6 +452,106 @@ class OperatePanelLayout : LinearLayout { return super.getDefaultVal(pref) } + override fun onResume() { + super.onResume() + prevIpcConnectStatus = AppConfigInfo.isConnectAutopilot + v2xIsShow = true + if (operatePaneIsShow) { + handler.sendEmptyMessage(WHAT_UPDATE_ENABLE) + } + } + + + override fun onPause() { + super.onPause() + v2xIsShow = false + handler.removeMessages(WHAT_UPDATE_ENABLE) + customToast?.cancel() + customToast = null + } + + private val handler = object : Handler(Looper.getMainLooper()) { + override fun handleMessage(msg: Message) { + super.handleMessage(msg) + if (msg.what == WHAT_UPDATE_ENABLE) { + if (this.hasMessages(WHAT_UPDATE_ENABLE)) { + this.removeMessages(WHAT_UPDATE_ENABLE) + } + setEnableStatus(AppConfigInfo.isConnectAutopilot) + if (AppConfigInfo.isConnectAutopilot) { + customToast?.cancel() + customToast = null + } else { + showConnectToast() + this.sendEmptyMessageDelayed(WHAT_UPDATE_ENABLE, 5000) + } + } + } + } + + + private fun showConnectToast() { + try { + AppStateManager.currentActivity()?.let { + val customToastView = + it.layoutInflater.inflate(R.layout.view_ipc_connect_status_toast, null) + customToast = Toast(MainMoGoApplication.getApp().applicationContext) + customToast!!.duration = Toast.LENGTH_SHORT + customToast!!.view = customToastView + customToast!!.setGravity( + Gravity.START, + AutoSizeUtils.dp2px(MainMoGoApplication.getApp().applicationContext, 280f), + 0 + ) + customToast!!.show() + } + } catch (_: Exception) { + } + } + + override fun onAutopilotIpcConnectStatusChanged( + status: AdasConstants.IpcConnectionStatus, + reason: String? + ) { + if (prevIpcConnectStatus != AppConfigInfo.isConnectAutopilot) { + if (operatePaneIsShow && v2xIsShow) { + handler.sendEmptyMessage(WHAT_UPDATE_ENABLE) + } + } + prevIpcConnectStatus = AppConfigInfo.isConnectAutopilot + } + + private fun setEnableStatus(isEnable: Boolean){ + if(preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.isEnabled == isEnable){ + return + } + //NDE(数据上车)上行 + preferenceScreen.findPreferenceReal(NDE_UPWARD_SWITCH)?.isEnabled = isEnable + //车辆图像上传行云大模型 + preferenceScreen.findPreferenceReal(IMAGE_UPLOAD_SWITCH)?.isEnabled = isEnable + //NDE(数据上车)下行 + preferenceScreen.findPreferenceReal(NDE_DOWNWARD_SWITCH)?.isEnabled = isEnable + //事件数据进PNC应用 + preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.isEnabled = isEnable + //感知数据进PNC应用 + preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.isEnabled = isEnable + //云控基础平台上行 + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_UPWARD)?.isEnabled = isEnable + //云控基础平台下行 + preferenceScreen.findPreferenceReal(CLOUD_CONTROL_DOWNWARD)?.isEnabled = isEnable + //OBU上报(V2I、V2V上行) + preferenceScreen.findPreferenceReal(OBU_UPWARD_SWITCH)?.isEnabled = isEnable + //V2I下行 + preferenceScreen.findPreferenceReal(V2I_DOWNWARD_SWITCH)?.isEnabled = isEnable + //弱势交通参与者 + preferenceScreen.findPreferenceReal(V2I_WEAK_TRAFFIC_PARTICIPANT)?.isEnabled = isEnable + //感知数据进PNC应用 + preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.isEnabled = isEnable + //V2V下行 + preferenceScreen.findPreferenceReal(V2V_DOWNWARD_SWITCH)?.isEnabled = isEnable + } + + override fun onPreferenceChange(preference: Preference, newValue: Any?): Boolean { Log.d(TAG, "-- onPreferenceChange:($preference, $newValue)") when (preference.key) { @@ -480,15 +614,15 @@ class OperatePanelLayout : LinearLayout { //关闭事件数据进PNC应用 CallerAutoPilotControlManager.sendNdeDownEventToPnc(0) //查询事件数据进PNC应用 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) + }, 500) //关闭感知数据进PNC应用 CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(0) //查询感知数据进PNC应用 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) + }, 500) } return true } @@ -502,9 +636,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendNdeDownEventToPnc(0) } //查询事件数据进PNC应用 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2N_TO_PNC) + }, 500) hmiAction("事件数据进PNC应用, ", isChecked) clickEventAnalytics("事件数据进PNC应用", isChecked) return true @@ -519,9 +653,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendNdeDownPerceptionToPnc(0) } //查询感知数据进PNC应用 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.PERCEPTION_TO_PNC) + }, 500) hmiAction("感知数据进PNC应用, ", isChecked) clickEventAnalytics("感知数据进PNC应用", isChecked) return true @@ -583,9 +717,9 @@ class OperatePanelLayout : LinearLayout { FunctionBuildConfig.v2iPerceptionDataToPnc = false CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(0) //查询V2I下行感知进PNC开关状态 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) + }, 500) } hmiAction("V2I下行, ", isChecked) clickEventAnalytics("V2I下行", isChecked) @@ -610,9 +744,9 @@ class OperatePanelLayout : LinearLayout { CallerAutoPilotControlManager.sendV2iDownPerceptionToPnc(0) } //查询V2I下行感知进PNC开关状态 -// UiThreadHandler.postDelayed({ -// CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) -// }, 500) + UiThreadHandler.postDelayed({ + CallerAutoPilotControlManager.sendGetParamReq(AdasConstants.MapSystemParamType.V2I_TO_PNC) + }, 500) hmiAction("感知数据进PNC应用, ", isChecked) clickEventAnalytics("感知数据进PNC应用", isChecked) return true @@ -706,14 +840,23 @@ class OperatePanelLayout : LinearLayout { * @param adasParam 解析后的配置参数 */ override fun onGetParamResp(getParamResp: MessagePad.SetParamReq, adasParam: AdasParam) { -// ThreadUtils.runOnUiThread { -// //融合v2n开关 NDE下行事件数据进pnc -// preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } -// //融合v2i开关 V2I下行感知数据进pnc -// preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } -// //NDE下行感知数据进pnc -// preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } -// } + ThreadUtils.runOnUiThread { + Log.i("onGetParamResp","adasParam.v2nToPnc="+adasParam.v2nToPnc) + Log.i("onGetParamResp","adasParam.v2iToPnc="+adasParam.v2iToPnc) + Log.i("onGetParamResp","adasParam.perceptionToPnc="+adasParam.perceptionToPnc) + //融合v2n开关 NDE下行事件数据进pnc + if(adasParam.v2nToPnc != -1){ + preferenceScreen.findPreferenceReal(NDE_EVENT_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2nToPnc==1) } + } + //融合v2i开关 V2I下行感知数据进pnc + if(adasParam.v2iToPnc != -1){ + preferenceScreen.findPreferenceReal(V2I_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.v2iToPnc==1) } + } + //NDE下行感知数据进pnc + if(adasParam.perceptionToPnc != -1){ + preferenceScreen.findPreferenceReal(NDE_PERCEPTION_DATA_TO_PNC)?.also { changeValue(it,adasParam.perceptionToPnc==1) } + } + } } /** @@ -735,6 +878,7 @@ class OperatePanelLayout : LinearLayout { private const val KEY_DEMO_SWITCH = "demo_switch" private const val KEY_RECORD_BAG_DIALOG = "record_bag_dialog" private const val KEY_TAKE_OVER_WAKE = "take_over_wake" + private const val KEY_MOGO_PRETTIFY_SWITCH = "mogo_prettify_switch" } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -772,6 +916,9 @@ class OperatePanelLayout : LinearLayout { KEY_TAKE_OVER_WAKE -> { return FunctionBuildConfig.isTakeoverRemind } + KEY_MOGO_PRETTIFY_SWITCH -> { + return false + } } return super.getDefaultVal(pref) } @@ -809,6 +956,21 @@ class OperatePanelLayout : LinearLayout { clickEventAnalytics("接管提醒", isChecked) return true } + KEY_MOGO_PRETTIFY_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + if (isChecked) { + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.CONTROL_B2_PRETTIFY_SWITCH, + "1".toByteArray() + ) + } else { + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.CONTROL_B2_PRETTIFY_SWITCH, + "0".toByteArray() + ) + } + return true + } } return super.onPreferenceChange(preference, newValue) } @@ -912,7 +1074,7 @@ class OperatePanelLayout : LinearLayout { } } - class BusinessPreferenceFragmentCompat : OperatePanelDetailBase(), IReceivedMsgListener { + class BusinessPreferenceFragmentCompat : OperatePanelDetailBase(), IReceivedMsgListener,ISopSettingListener { companion object { private const val TAG = "BusinessPreferenceFragmentCompat" @@ -925,6 +1087,7 @@ class OperatePanelLayout : LinearLayout { private const val KEY_SWEEPER_CLOUD_CONTROL = "sweeper_cloud_control" private const val KEY_LOOK_AROUND_360 = "look_around_360" private const val KEY_DRIVE_SEAT_VIDEO_STREAM = "drive_seat_video_stream" + private const val KEY_MOGO_MIND_SWITCH = "mogo_mind_switch" } private var lastTimeOnSendDriveVideo = 0L @@ -932,6 +1095,7 @@ class OperatePanelLayout : LinearLayout { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) CallerTelematicListenerManager.addListener(TAG, this) + CallerSopSettingManager.addListener(TAG,this) lifecycleScope.launchWhenResumed { val p = preferenceScreen.findPreferenceReal(KEY_DRIVE_SEAT_VIDEO_STREAM)?.also { CallerDevaToolsManager.driveSeatVideoProvider()?.requestVideoInfo({ data -> @@ -955,6 +1119,11 @@ class OperatePanelLayout : LinearLayout { CallerTelematicListenerManager.removeListener(TAG) } + override fun onRoutingClickEvent(status: Boolean) { + super.onRoutingClickEvent(status) + preferenceScreen.findPreferenceReal(KEY_SELF_ROUTING_VERIFY_MODE)?.also { changeValue(it, status) } + } + override fun getDefaultVal(pref: Preference): Any? { when (pref.key) { KEY_FAULT_REPORT_TIP -> { @@ -988,6 +1157,9 @@ class OperatePanelLayout : LinearLayout { SweeperVehicleConfigUtils.isDefaultSweeperCloudMode(FunctionBuildConfig.sweeperDefaultMode) } } + KEY_MOGO_MIND_SWITCH -> { + return false + } } return super.getDefaultVal(pref) } @@ -996,6 +1168,9 @@ class OperatePanelLayout : LinearLayout { return when (pref.key) { KEY_SELF_ROUTING_VERIFY_MODE -> { AppIdentityModeUtils.isTaxiDriver(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isBusDriver(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isShuttleDriver(FunctionBuildConfig.appIdentityMode) + ||AppIdentityModeUtils.isScheduled(FunctionBuildConfig.appIdentityMode) } KEY_LOOK_AROUND_360 -> { AppIdentityModeUtils.isM1(FunctionBuildConfig.appIdentityMode) @@ -1108,7 +1283,9 @@ class OperatePanelLayout : LinearLayout { KEY_SELF_ROUTING_VERIFY_MODE -> { val isChecked = newValue as? Boolean ?: false if (isChecked) { - if (CallerHmiManager.isTaxiUnmanedDriverPerformTask()) { + if (CallerHmiManager.isTaxiUnmanedDriverPerformTask()|| + CallerHmiManager.isShuttleDriverPerformTask() + ) { ToastUtils.showLong("请先结束当前任务") return false } @@ -1206,6 +1383,21 @@ class OperatePanelLayout : LinearLayout { CallerTelematicManager.sendMsgToAllClients(TelematicConstant.DRIVE_SEAT_VIDEO_STREAM_REQ, toJson(map).toByteArray()) return false } + KEY_MOGO_MIND_SWITCH -> { + val isChecked = newValue as? Boolean ?: false + if (isChecked) { + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.CONTROL_PASSENGER_AI_SWITCH, + "1".toByteArray() + ) + } else { + CallerTelematicManager.sendMsgToAllClients( + TelematicConstant.CONTROL_PASSENGER_AI_SWITCH, + "0".toByteArray() + ) + } + return true + } } return super.onPreferenceChange(preference, newValue) } @@ -1798,4 +1990,5 @@ class OperatePanelLayout : LinearLayout { } isClickable = true } + } \ 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/setting/DebugSettingView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt index e762f22ca2..3e6ec15dfa 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/setting/DebugSettingView.kt @@ -152,6 +152,7 @@ import kotlinx.android.synthetic.main.view_debug_setting.view.btChangeEnv import kotlinx.android.synthetic.main.view_debug_setting.view.btnAppReboot import kotlinx.android.synthetic.main.view_debug_setting.view.btnAutoCheck import kotlinx.android.synthetic.main.view_debug_setting.view.btnBrakeThreshold +import kotlinx.android.synthetic.main.view_debug_setting.view.btnClearMap import kotlinx.android.synthetic.main.view_debug_setting.view.btnConnectServerIp import kotlinx.android.synthetic.main.view_debug_setting.view.btnDeleteDB import kotlinx.android.synthetic.main.view_debug_setting.view.btnDisconnectIpc @@ -610,8 +611,6 @@ internal class DebugSettingView @JvmOverloads constructor( } } //动态配置鹰眼显示MAP版本 - etMapShowName.setText(AppConfigInfo.mapShowName) - etMapShowName.text?.let { etMapShowName.setSelection(it.length) } btnEnsureMap.setOnClickListener { AppConfigInfo.mapShowName = etMapShowName.text.toString() SPUtils.getInstance().put("mapShowName", AppConfigInfo.mapShowName) @@ -620,6 +619,16 @@ internal class DebugSettingView @JvmOverloads constructor( CallerMapShowNameManager.invokeMapShowName(AppConfigInfo.mapShowName) } + //清空动态配置鹰眼显示MAP版本 + btnClearMap.setOnClickListener { + etMapShowName.setText("") + AppConfigInfo.mapShowName = "" + SPUtils.getInstance().put("mapShowName", AppConfigInfo.mapShowName) + tvIpcVersionInfo.text = "MAP:${AppConfigInfo.mapShowName}" + tvIpcVersionInfoKey.text = "MAP:${AppConfigInfo.mapShowName}" + CallerMapShowNameManager.invokeMapShowName(AppConfigInfo.mapShowName) + } + /** * 状态中心 */ @@ -1306,6 +1315,11 @@ internal class DebugSettingView @JvmOverloads constructor( } else -> { + + val defaultIp = SharedPrefsMgr.getInstance() + .getString(SharedPrefsConstants.inputDriverIpDomainController, "") + etConnectServerIp.setText(defaultIp) + brakeThresholdDivider.visibility = View.VISIBLE btnConnectServerIp.visibility = View.VISIBLE etConnectServerIp.visibility = View.VISIBLE @@ -1474,6 +1488,7 @@ internal class DebugSettingView @JvmOverloads constructor( btnConnectServerIp.setOnClickListener { val ip = etConnectServerIp.text.toString() if (ip.isNotEmpty()) { + SharedPrefsMgr.getInstance().putString(SharedPrefsConstants.inputDriverIpDomainController, ip) CallerAutoPilotControlManager.connectSpecifiedServer(ip) } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt index 1cfbb44b87..9da052716b 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeDialog.kt @@ -15,6 +15,7 @@ import com.zhjt.mogo_core_function_devatools.ota.OTAUpgradeConfig import kotlinx.android.synthetic.main.dialog_ota_upgrade.tvUpgradeContent import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_later import kotlinx.android.synthetic.main.dialog_ota_upgrade.tv_upgrade_now +import org.json.JSONObject import system_master.SsmInfo /** @@ -30,6 +31,7 @@ class OTAUpgradeDialog(context: Context) : private var clickListener: ClickListener? = null private var upgradeWaitingTimer: CountDownTimer ?= null //等待升级确认计时器 + private var otaVersion: Int = 0 init{ setContentView(R.layout.dialog_ota_upgrade) @@ -40,21 +42,73 @@ class OTAUpgradeDialog(context: Context) : private fun initView(){ //立即升级 tv_upgrade_now.setOnClickListener { - val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) - if(result){ - ToastUtils.showShort("立即升级命令发送成功") + if(otaVersion == 1){ + val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(result){ + ToastUtils.showShort("立即升级命令发送成功") + }else{ + ToastUtils.showShort("立即升级命令发送失败") + } + }else if(otaVersion == 2){ + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",true) + query.put("reason","") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) }else{ - ToastUtils.showShort("立即升级命令发送失败") + val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(result){ + ToastUtils.showShort("立即升级命令发送成功") + }else{ + ToastUtils.showShort("立即升级命令发送失败") + } + + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",true) + query.put("reason","") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) } dismiss() } //稍后升级 tv_upgrade_later.setOnClickListener { - val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) - if(delayResult){ - ToastUtils.showShort("稍后升级命令发送成功") + if(otaVersion == 1){ + val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + if(delayResult){ + ToastUtils.showShort("稍后升级命令发送成功") + }else{ + ToastUtils.showShort("稍后升级命令发送失败") + } + }else if(otaVersion == 2){ + //不允许OTA升级 + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",false) + query.put("reason","user click") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) }else{ - ToastUtils.showShort("稍后升级命令发送失败") + val delayResult = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.DELAY) + if(delayResult){ + ToastUtils.showShort("稍后升级命令发送成功") + }else{ + ToastUtils.showShort("稍后升级命令发送失败") + } + + //不允许OTA升级 + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",false) + query.put("reason","user click") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) } dismiss() } @@ -64,7 +118,37 @@ class OTAUpgradeDialog(context: Context) : override fun onFinish() { //立即升级 - CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(otaVersion == 1){ + val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(result){ + ToastUtils.showShort("立即升级命令发送成功") + }else{ + ToastUtils.showShort("立即升级命令发送失败") + } + }else if(otaVersion == 2){ + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",true) + query.put("reason","") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + }else{ + val result = CallerAutoPilotControlManager.sendSsmFuncOtaDownloadResponse(OTAUpgradeConfig.otaToken,SsmInfo.IfUpgrade.IMMEDIATELY) + if(result){ + ToastUtils.showShort("立即升级命令发送成功") + }else{ + ToastUtils.showShort("立即升级命令发送失败") + } + + val query = JSONObject() + query.put("cmd","ASK_PAD_UPGRADE_RES") + query.put("token",OTAUpgradeConfig.token) + query.put("allow_upgrade",true) + query.put("reason","") + Log.i(TAG,query.toString()) + CallerAutoPilotControlManager.sendOtaPadMsgQuery(query.toString()) + } UiThreadHandler.postDelayed({ CallerAutoPilotControlManager.sendSsmFuncOtaStatusQuery(OTAUpgradeConfig.otaToken) dismiss() @@ -86,6 +170,10 @@ class OTAUpgradeDialog(context: Context) : } } + fun setOTAVersion(version: Int){ + otaVersion = version + } + interface ClickListener{ //立即升级 fun upgradeNow() diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt index bcebb8df8f..4b4574b4ea 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/tools/OTAUpgradeResultDialog.kt @@ -40,7 +40,7 @@ class OTAUpgradeResultDialog(context: Context) : * 展示OTA升级结果弹窗 * @param result true升级成功 false升级失败 */ - fun showResult(result: Boolean){ + fun showResult(result: Boolean,isTimeout: Boolean){ if(result){ //升级成功 ivUpgradeResult.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_ota_upgrade_success)) @@ -60,7 +60,11 @@ class OTAUpgradeResultDialog(context: Context) : }else{ //升级失败 ivUpgradeResult.setImageDrawable(ResourceUtils.getDrawable(R.drawable.icon_ota_upgrade_fail)) - tvResultContent.text = context.resources.getString(R.string.ota_result_fail) + tvResultContent.text = if(isTimeout){ + context.resources.getString(R.string.ota_result_timeout) + }else{ + context.resources.getString(R.string.ota_result_fail) + } tvResultTip.text = context.resources.getString(R.string.ota_result_fail_tip) //消息盒子和语音提示升级失败结果 CallerMsgBoxManager.saveMsgBox( diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt index 36882a73d0..b6e86431e9 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/widget/VersionNameView.kt @@ -77,6 +77,12 @@ class VersionNameView @JvmOverloads constructor( it.text = version } } + }else if(version.isNullOrEmpty()){ + scope.launch { + tvMapVersionName?.also { + it.text = "" + } + } } } diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java index 4fa08617f8..80ac75b516 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/main/MainMoGoApplication.java @@ -43,7 +43,7 @@ public abstract class MainMoGoApplication extends AbsMogoApplication { //启动业务 CallerStartUpManager.initStageOne(); // Crash 日志收集 - initCrashConfig(); +// initCrashConfig(); initLogConfig(); initTipToast(); diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_v2x_toast.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_v2x_toast.png new file mode 100644 index 0000000000..81fc493bfc Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/bg_v2x_toast.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_v2x_tip.png b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_v2x_tip.png new file mode 100644 index 0000000000..3e1e27d6bd Binary files /dev/null and b/core/function-impl/mogo-core-function-hmi/src/main/res/drawable-xhdpi/icon_v2x_tip.png differ diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_container.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_container.xml index 2f2f5e8065..904c162dc4 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_container.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/view_bone_container.xml @@ -3,8 +3,14 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" - android:layout_gravity="center" - android:background="@drawable/bone_bg"> + android:layout_gravity="center"> + + -