From d8768454ff39a90656770e2a315d4b1fa206a5ff Mon Sep 17 00:00:00 2001 From: yangyakun Date: Tue, 6 May 2025 18:06:36 +0800 Subject: [PATCH] [8.0.0] [fea] [music bottom bar] --- .../manager/audition/AuditionManager.kt | 8 +- .../module/manager/audition/MusicData.kt | 15 ++ .../passenger/ui/TaxiPassengerBaseFragment.kt | 7 + .../unmanned/passenger/ui/music/MusicModel.kt | 132 ++++++++++++++- .../unmanned/passenger/ui/music/MusicView.kt | 9 +- .../passenger/ui/music/bar/MusicBarView.kt | 157 ++++++++++++++++++ .../ui/music/bar/MusicBarViewModel.kt | 55 ++++++ .../ui/music/list/MusicListItemAdapter.kt | 38 +---- .../passenger/ui/music/list/MusicListView.kt | 56 +++++-- .../ui/music/list/MusicListViewModel.kt | 59 ++++--- .../ui/music/playing/MusicPlayingView.kt | 25 +-- .../ui/music/playing/MusicPlayingViewModel.kt | 130 +++------------ .../passenger/ui/video/InfoVideoView.kt | 30 +++- .../res/drawable-nodpi/iv_show_next_bar.png | Bin 0 -> 1131 bytes .../taxi_p_music_bar_bottom.png | Bin 0 -> 9140 bytes .../drawable-nodpi/taxi_p_music_bar_top.png | Bin 0 -> 3538 bytes .../drawable-nodpi/taxi_p_music_pause_bar.png | Bin 0 -> 550 bytes .../drawable-nodpi/taxi_p_music_play_bar.png | Bin 0 -> 1082 bytes .../src/main/res/layout/taxi_p_music_bar.xml | 74 +++++++++ .../res/layout/taxt_u_p_base_fragment.xml | 10 ++ 20 files changed, 575 insertions(+), 230 deletions(-) create mode 100644 OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt create mode 100644 OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png create mode 100644 OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml diff --git a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt index 89ce31b8fc..207561a4a7 100644 --- a/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt +++ b/OCH/common/common/src/main/java/com/mogo/och/common/module/manager/audition/AuditionManager.kt @@ -120,6 +120,12 @@ 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) {} @@ -189,7 +195,7 @@ object AuditionManager: AuditionCacheManager.DataChangeListener, Audition.OnAudi fun getPreMusicData(it: MusicData): MusicData { val indexOf = musicList.indexOf(it) - if(indexOf== 0){ + if(indexOf == 0){ return musicList.last() }else{ return musicList[indexOf-1] 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/manager/audition/MusicData.kt index 4ed8b67085..d0a23cf1be 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/manager/audition/MusicData.kt @@ -20,6 +20,21 @@ data class MusicData( fun isCloud():Boolean{ return songUrlType=="cloud" } + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (javaClass != other?.javaClass) return false + + other as MusicData + + return id == other.id + } + + override fun hashCode(): Int { + return id.hashCode() + } + + } /** diff --git a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt index 20898c27ae..d16762a0c9 100644 --- a/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/TaxiPassengerBaseFragment.kt @@ -28,6 +28,7 @@ import com.mogo.och.unmanned.passenger.ui.bar.LeftBarView import com.mogo.och.unmanned.passenger.ui.bottom.BottomBar import com.mogo.och.unmanned.passenger.ui.checkstartautopilot.ChekAndStartAutopilotView import com.mogo.och.unmanned.passenger.ui.debug.DebugCallback +import com.mogo.och.unmanned.passenger.ui.music.MusicModel import com.mogo.och.unmanned.passenger.ui.statusview.StatusBarView import io.reactivex.disposables.Disposable import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.arrivedView @@ -40,6 +41,7 @@ import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.itinerary import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.lbv_go2_center import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.light_setting import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.mHomeView +import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.musicBarView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.mv_music_info import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.overMapView import kotlinx.android.synthetic.main.taxt_u_p_base_fragment.speedView @@ -141,6 +143,11 @@ class TaxiPassengerBaseFragment : }else{ WakeUpManager.stopWakeup() } + if(selectItem!=BottomBar.SelectView.MUSIC){ + if(!MusicModel.isPlaying()){ + musicBarView.visibility = View.GONE + } + } when (selectItem) { BottomBar.SelectView.PRECISIONMAP -> { CallerHmiViewControlListenerManager.invokeMainPageViewVisible(View.VISIBLE) 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 6678e0d8a3..05371c7e0e 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 @@ -2,20 +2,31 @@ 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.util.TAG +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.bridge.autopilot.line.ILineCallback +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.utils.CallerBase import com.mogo.och.common.module.utils.RxUtils import com.mogo.och.data.taxi.BaseOrderBean import com.mogo.och.data.taxi.TaxiOrderStatusEnum 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 { + + private const val TAG = "MusicModel" -object MusicModel : com.mogo.och.unmanned.taxi.utils.order.OrderListener, IOchAutopilotStatusListener { init { - com.mogo.och.unmanned.taxi.utils.order.OrderModel.setOrderStatusCallback(TAG,this) + OrderModel.setOrderStatusCallback(TAG,this) //自动驾驶状态监听 OchAutoPilotStatusListenerManager.addListener(TAG, this) + AuditionManager.addDataChangeListener(TAG,this) } private var stopMusicDisposable: Disposable? = null @@ -87,4 +98,119 @@ object MusicModel : com.mogo.och.unmanned.taxi.utils.order.OrderListener, IOchAu } + + fun getCheckMusic(): MusicData? { + AuditionManager.musicList.forEach { + if (it.select==true) { + return it + } + } + return null + } + + fun seekTo(progress: Int) { + AuditionManager.seekTo(progress) + } + + override fun addOneData(musicData: MusicData) { + M_LISTENERS.forEach{ + it.value.addOneData(musicData) + } + } + + /** + * 1、更新选中状态 + * 2、如果正在播放 需要开始播放选中音乐 + */ + fun checkMusic(musicData: MusicData){ + AuditionManager.musicList.forEach { + if (it.select==true) { + if(it!=musicData){ + it.select = false + musicData.select = false + notifySelectChange(it) + }else{ + return + } + } + if(it==musicData){ + it.select = true + musicData.select = true + } + } + notifySelectChange(musicData) + if(AuditionManager.isPlaying()){ + AuditionManager.play(musicData) + } + } + + private fun notifySelectChange(musicData: MusicData) { + M_LISTENERS.forEach{ + it.value.checkChangeListener(musicData) + } + } + + fun clickPreMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + val preMusicData = AuditionManager.getPreMusicData(it) + checkMusic(preMusicData) + } + } + + fun clickNextMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + val preMusicData = AuditionManager.getNextMusicData(it) + checkMusic(preMusicData) + } + } + + fun toggleMusic(){ + val checkMusic = getCheckMusic() + checkMusic?.let { + AuditionManager.toggle(it) + } + } + + // 播放状态发生变化 + override fun updateState(oldData: MusicData?, musicData: MusicData) { + CallerLogger.d(TAG,"updateState") + M_LISTENERS.forEach{ + it.value.updateState(oldData,musicData) + } + } + + // 播放进度变化 + override fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData) { + CallerLogger.d(TAG, "updatePlayCurrent:currentPlay:${currentPlay}") + M_LISTENERS.forEach{ + it.value.updatePlayCurrent(currentPlay,duration,second) + } + } + + // 播放完毕 + override fun onMusicCompletion(musicData: MusicData) { + CallerLogger.d(TAG, "onMusicCompletion:${musicData}") + M_LISTENERS.forEach{ + it.value.onMusicCompletion(musicData) + } + } + + fun isPlaying(): Boolean { +// val checkMusic = getCheckMusic() +// if (checkMusic?.state== PlayState.None) { +// return false +// } +// return true + return AuditionManager.isPlaying() + } + + interface MusicDataListener{ + fun checkChangeListener(musicData: MusicData){} + fun addOneData(it: MusicData){} + fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData){} + fun updateState(oldData: MusicData?, musicData: MusicData) {} + fun onMusicCompletion(musicData: MusicData) {} + } } \ No newline at end of file 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 23f9e39b05..a2338a6660 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 @@ -13,7 +13,7 @@ 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, MusicListView.CheckListener { +class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback { private val TAG = "MusicView" @@ -41,7 +41,7 @@ class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicList } private fun setListener() { - mlv_list.setCheckItemListener(this) + } override fun onAttachedToWindow() { @@ -64,9 +64,4 @@ class MusicView : ConstraintLayout, MusicViewModel.IMusicViewCallback, MusicList } - override fun checkItem(musicData: MusicData) { - mpv_playing.setDatafromCheck(musicData) - } - - } \ No newline at end of file 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 new file mode 100644 index 0000000000..a2ec92ff80 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarView.kt @@ -0,0 +1,157 @@ +package com.mogo.och.unmanned.passenger.ui.music.bar + +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.content.Context +import android.os.Build +import android.util.AttributeSet +import android.view.LayoutInflater +import android.view.animation.LinearInterpolator +import android.widget.SeekBar +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.och.common.module.manager.audition.MusicData +import com.mogo.och.common.module.manager.audition.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 +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.aciv_music_top +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.actv_music_title +import kotlinx.android.synthetic.main.taxi_p_music_bar.view.sb_musuc_bar_progess + +class MusicBarView : ConstraintLayout, MusicBarViewModel.IMusicViewBarCallback { + + private val TAG = "MusicBarView" + + var viewModel: MusicBarViewModel?=null + + private var isSeekBarTouch = false + + private var animator:ObjectAnimator?=null + + + 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) + + private fun initView() { + LayoutInflater.from(context).inflate(R.layout.taxi_p_music_bar, this, true) + + setListener() + } + + private fun setListener() { + aciv_music_toggle_bar.onClick { + viewModel?.toggle() + } + aciv_music_next_bar.onClick { + viewModel?.playNext() + } + sb_musuc_bar_progess.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener{ + var seekToProgress = 0 + override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) { + if(isSeekBarTouch) { + CallerLogger.d(TAG, "progress:${progress}----fromUser:${fromUser}") + seekToProgress = progress + }else{ + + } + } + + override fun onStartTrackingTouch(seekBar: SeekBar?) { + isSeekBarTouch = true + } + + override fun onStopTrackingTouch(seekBar: SeekBar?) { + isSeekBarTouch = false + viewModel?.seekTo(seekToProgress) + seekToProgress = 0 + } + + }) + } + + override fun onAttachedToWindow() { + super.onAttachedToWindow() + + viewModel = findViewTreeViewModelStoreOwner()?.let { + ViewModelProvider(it).get(MusicBarViewModel::class.java) + } + + viewModel?.setDistanceCallback(this) + } + + + init { + try { + initView() + } catch (e: Exception) { + e.printStackTrace() + } + } + + override fun setCurrentMusicData(musicData: MusicData?) { + if(musicData==null){ + visibility = GONE + }else{ + visibility = VISIBLE + actv_music_title.text = musicData.songName + if(musicData.state== PlayState.Playing){ + aciv_music_toggle_bar.setImageResource(R.drawable.taxi_p_music_pause_bar) + startAnimal() + }else{ + aciv_music_toggle_bar.setImageResource(R.drawable.taxi_p_music_play_bar) + endAnimal() + } + } + } + + private fun startAnimal(){ + if(animator!=null){ + animator?.cancel() + animator = null + } + animator = ObjectAnimator.ofFloat(aciv_music_top, "rotation", 0f, 360f) + animator?.duration = 3000 + animator?.repeatCount = -1 + animator?.repeatMode = ValueAnimator.RESTART + animator?.interpolator = LinearInterpolator() + animator?.start() + } + private fun endAnimal(){ + if(animator!=null){ + animator?.cancel() + animator = null + } + } + + + override fun setProgress(currentPlay: Long, duration: Long) { + if(isSeekBarTouch){ + + }else{ + sb_musuc_bar_progess.max = duration.toInt() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + sb_musuc_bar_progess.setProgress(currentPlay.toInt(),true) + }else{ + sb_musuc_bar_progess.progress=currentPlay.toInt() + } + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..8fee84cb9a --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/java/com/mogo/och/unmanned/passenger/ui/music/bar/MusicBarViewModel.kt @@ -0,0 +1,55 @@ +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.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.ui.music.MusicModel + +class MusicBarViewModel : ViewModel(), MusicModel.MusicDataListener { + + private val TAG = MusicBarViewModel::class.java.simpleName + + private var viewCallback: IMusicViewBarCallback? = null + + fun setDistanceCallback(viewCallback: IMusicViewBarCallback) { + this.viewCallback = viewCallback + MusicModel.addListener(TAG, this) + } + + override fun onCleared() { + super.onCleared() + this.viewCallback = null + MusicModel.removeListener(TAG) + } + + interface IMusicViewBarCallback { + fun setCurrentMusicData(musicData: MusicData?) + fun setProgress(currentPlay: Long, duration: Long) + } + + override fun updateState(oldData: MusicData?, musicData: MusicData) { + this.viewCallback?.setCurrentMusicData(musicData) + } + + fun toggle() { + MusicModel.toggleMusic() + } + + fun playNext() { + MusicModel.clickNextMusic() + } + + fun seekTo(seekToProgress: Int) { + MusicModel.seekTo(seekToProgress) + } + + override fun checkChangeListener(musicData: MusicData) { + this.viewCallback?.setCurrentMusicData(musicData) + } + + override fun updatePlayCurrent(currentPlay: Long, duration: Long, musicData: MusicData) { + BizLoopManager.runInMainThread { + viewCallback?.setProgress(currentPlay, duration) + } + } +} \ No newline at end of file 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 86dcafea5d..899c28293a 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 @@ -74,10 +74,9 @@ class MusicListItemAdapter( holder.itemView.background = null } - if (musicData.state==PlayState.Playing||musicData.state==PlayState.Pause) { + if (musicData.state==PlayState.Playing) { holder.musicPlayState.visibility = View.VISIBLE }else{ - holder.musicPlayState.visibility = View.GONE } } @@ -86,39 +85,10 @@ class MusicListItemAdapter( return dataList.size } - fun setNewData(data: MutableList) { - dataList.clear() - dataList.addAll(data) - notifyDataSetChanged() - } - - fun addOneData(musicData: MusicData){ - dataList.add(musicData) - notifyItemInserted(dataList.size) - } - - fun upDateMusicData(oldData: MusicData?,musicData: MusicData) { - dataList.forEachIndexed { index, musicDataIn -> - if (musicDataIn.id==musicData.id) { - musicDataIn.state = musicData.state - notifyItemChanged(index,0) - } - if(oldData?.id==musicDataIn.id){ - notifyItemChanged(index,0) - } - } - } - inner class TextVH(itemView: View) : RecyclerView.ViewHolder(itemView) { - var musicName: TextView - var musicPlayState: ImageView - var tvTag: TextView - - init { - musicName = itemView.findViewById(R.id.tv_song_name) - tvTag = itemView.findViewById(R.id.tv_tag) - musicPlayState = itemView.findViewById(R.id.iv_music_playing) - } + var musicName: TextView = itemView.findViewById(R.id.tv_song_name) + var musicPlayState: ImageView = itemView.findViewById(R.id.iv_music_playing) + var tvTag: TextView = itemView.findViewById(R.id.tv_tag) } interface ClickListener { 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 6ac9f328a9..841ab6df03 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 @@ -1,5 +1,6 @@ package com.mogo.och.unmanned.passenger.ui.music.list +import android.annotation.SuppressLint import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater @@ -9,6 +10,7 @@ import androidx.lifecycle.findViewTreeViewModelStoreOwner import androidx.recyclerview.widget.LinearLayoutManager import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger import com.mogo.och.common.module.manager.audition.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 @@ -27,7 +29,6 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb private val dataList = mutableListOf() private lateinit var lineAdapter:MusicListItemAdapter - private var checkListener:CheckListener?=null private fun initView() { LayoutInflater.from(context).inflate(R.layout.taxi_p_music_list, this, true) @@ -46,6 +47,17 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb viewModel?.setDistanceCallback(this) } + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(isVisible){ + if (MusicModel.getCheckMusic()==null) { + if(dataList.isNotEmpty()) { + MusicModel.checkMusic(dataList.first()) + } + } + } + } + init { try { @@ -55,32 +67,42 @@ class MusicListView : ConstraintLayout, MusicListViewModel.IMusicListViewCaLillb } } + @SuppressLint("NotifyDataSetChanged") override fun addAllData(data: MutableList) { - lineAdapter.setNewData(data) + dataList.clear() + dataList.addAll(data) + lineAdapter.notifyDataSetChanged() } override fun addOneData(it: MusicData) { - lineAdapter.addOneData(it) + dataList.add(it) + lineAdapter.notifyItemInserted(dataList.size) } - override fun updateMusicData(oldData: MusicData?,musicData: MusicData) { - lineAdapter.upDateMusicData(oldData,musicData) - CallerLogger.d(TAG,"${Thread.currentThread().name}----更新数据${oldData}-----${musicData}") + + override fun updateSelect(musicData: MusicData) { + dataList.forEachIndexed { index, musicDataIn -> + if (musicDataIn == musicData) { + musicDataIn.select = musicData.select + lineAdapter.notifyItemChanged(index) + return + } + } + } + + override fun updateStete(musicData: MusicData) { + dataList.forEachIndexed { index, musicDataIn -> + if (musicDataIn == musicData) { + musicDataIn.state = musicData.state + lineAdapter.notifyItemChanged(index) + return + } + } } override fun clickItem(musicData: MusicData) { // 通知主页面去显示详情 - this.checkListener?.checkItem(musicData) + MusicModel.checkMusic(musicData) } - fun setCheckItemListener(checkListener:CheckListener) { - this.checkListener = checkListener - } - - interface CheckListener { - fun checkItem(musicData: MusicData) - } - - - } \ No newline at end of file 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 f10768c617..914dd3aeb9 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 @@ -5,54 +5,63 @@ 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.manager.loop.BizLoopManager +import com.mogo.och.unmanned.passenger.ui.music.MusicModel -class MusicListViewModel : ViewModel(), - AuditionManager.MusicDataChangeListener { +class MusicListViewModel : ViewModel(), MusicModel.MusicDataListener { 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) + CallerLogger.d(TAG, "初始化音乐${AuditionManager.musicList.size}") + MusicModel.addListener(TAG, this) } override fun onCleared() { - AuditionManager.removeDataChangeListener(TAG) super.onCleared() this.viewCallback = null + MusicModel.removeListener(TAG) } interface IMusicListViewCaLillback { - fun addAllData(data:MutableList) + fun addAllData(data: MutableList) fun addOneData(it: MusicData) - fun updateMusicData(oldData: MusicData?,musicData: MusicData) + fun updateSelect(musicData: MusicData) + fun updateStete(musicData: MusicData) } - override fun addOneData(it: MusicData) { - CallerLogger.d(TAG,"添加音乐:${it.songName}--${it.path}") - UiThreadHandler.post({ - this.viewCallback?.addOneData(it) - }, UiThreadHandler.MODE.QUEUE) - } - - override fun updateState(oldData: MusicData?,musicData: MusicData) { - UiThreadHandler.post({ - viewCallback?.updateMusicData(oldData, musicData) - }, UiThreadHandler.MODE.QUEUE) + override fun updateState(oldData: MusicData?, musicData: MusicData) { + BizLoopManager.runInMainThread{ + if(oldData!=null&&oldData!=musicData){ + viewCallback?.updateStete(oldData) + } + viewCallback?.updateStete(musicData) + } } override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) - UiThreadHandler.post({ - viewCallback?.updateMusicData(musicData, musicData) - }, UiThreadHandler.MODE.QUEUE) + BizLoopManager.runInMainThread{ + viewCallback?.updateStete(musicData) + } } + + override fun checkChangeListener(musicData: MusicData) { + BizLoopManager.runInMainThread { + viewCallback?.updateSelect(musicData) + } + } + + override fun addOneData(it: MusicData) { + CallerLogger.d(TAG, "添加音乐:${it.songName}--${it.path}") + BizLoopManager.runInMainThread { + this.viewCallback?.addOneData(it) + } + } + + } \ No newline at end of file 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 cdbc3cae52..579bd5820c 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,6 +13,7 @@ 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.utils.DateTimeUtil @@ -104,14 +105,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi super.onVisibilityAggregated(isVisible) } - fun setData(musicData: MusicData?) { - viewModel?.setMusicData(musicData) - } - - fun setDatafromCheck(musicData: MusicData){ - viewModel?.setMusciDataFromCheck(musicData) - } - override fun setViewData(musicData: MusicData){ tv_music_name.text = musicData.songName tv_tag.text = musicData.tag.first() @@ -129,15 +122,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi }else{ sb_musuc_progess.progress=0.toInt() } - -// Glide.with(context) -// .load(musicData.coverHeadImageUrl) -// .apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_head)) -// .into(iv_music_cover) -// Glide.with(context) -// .load(musicData.coverBottomImageUrl) -// .apply(RequestOptions().placeholder(R.drawable.taxt_p_music_bg_relax_bottom)) -// .into(iv_music_cover_bg) } private fun startAnimal(){ @@ -146,8 +130,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi animator = null } animator = ObjectAnimator.ofFloat(iv_music_cover, "rotation", 0f, 360f) -// iv_music_cover.pivotX = (centerWidth).toFloat() -// iv_music_cover.pivotY = (centerWidth).toFloat() animator?.duration = 3000 animator?.repeatCount = -1 animator?.repeatMode = ValueAnimator.RESTART @@ -208,11 +190,6 @@ class MusicPlayingView : ConstraintLayout, MusicPlayingViewModel.IMusicPlayingVi tv_playing_during.text = TimeTransformUtils.stringForTime(duration.toInt()) } - fun listenerPlaying(){ - - } - - init { try { initView() 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 052f38e271..454eb4eb94 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 @@ -1,106 +1,40 @@ package com.mogo.och.unmanned.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.eagle.core.utilcode.util.GsonUtils -import com.mogo.eagle.core.utilcode.util.ThreadUtils -import com.mogo.och.common.module.manager.audition.AuditionManager import com.mogo.och.common.module.manager.audition.MusicData +import com.mogo.och.unmanned.passenger.ui.music.MusicModel -class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListener { +class MusicPlayingViewModel : ViewModel(), MusicModel.MusicDataListener { private val TAG = MusicPlayingViewModel::class.java.simpleName private var viewCallback: IMusicPlayingViewCallback? = null - private var checkMusicData:MusicData?=null - init { - AuditionManager.addDataChangeListener(TAG,this) CallerLogger.d(TAG, "init") } fun setDistanceCallback(viewCallback: IMusicPlayingViewCallback) { this.viewCallback = viewCallback + MusicModel.addListener(TAG,this) } override fun onCleared() { super.onCleared() this.viewCallback = null - AuditionManager.removeDataChangeListener(TAG) - } - - fun setMusicData(musicData: MusicData?) { - if (ThreadUtils.isMainThread()) { - showData(musicData) - }else { - UiThreadHandler.post { - showData(musicData) - } - } - } - - fun setMusciDataFromCheck(musicData: MusicData){ - val playing = AuditionManager.isPlaying() - showData(musicData) - if(playing){ - play() - } - } - - private fun showData(musicData: MusicData?){ - if(musicData==null){ - if(AuditionManager.isPlaying()){ - if (AuditionManager.musicDataPlaying==null) { - this.checkMusicData = AuditionManager.musicList.first() - }else { - this.checkMusicData = AuditionManager.musicDataPlaying!! - } - }else { - //暂停播放的时候,如果在选择页面什么也不选,应该也需要默认是当前暂停播放的音乐 - return - } - }else { - this.checkMusicData = musicData - } - this.checkMusicData?.let { - this.viewCallback?.setViewData(it) - } } fun toggle() { - checkMusicData?.let { - AuditionManager.toggle(it) - } - } - - fun play(){ - checkMusicData?.let { - AuditionManager.play(it) - } + MusicModel.toggleMusic() } fun showPreMusic() { - checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getPreMusicData(it) - setMusicData(nextMusicData) - if(playing){ - play() - } - } + MusicModel.clickPreMusic() } fun showNextMusic() { - checkMusicData?.let { - val playing = AuditionManager.isPlaying() - val nextMusicData = AuditionManager.getNextMusicData(it) - setMusicData(nextMusicData) - if(playing){ - play() - } - } + MusicModel.clickNextMusic() } interface IMusicPlayingViewCallback { @@ -109,44 +43,20 @@ class MusicPlayingViewModel : ViewModel(), AuditionManager.MusicDataChangeListen fun setProgress(currentPlay: Long, duration: Long) } - override fun updateState(oldData:MusicData?,musicData: MusicData) { - checkMusicData?.let { - if(it.id==musicData.id){ - it.state = musicData.state - UiThreadHandler.post { - viewCallback?.setPlayOrpause(it) - } - } - } - } - override fun updatePlayCurrent(currentPlay: Long, duration: Long, musicData: MusicData){ - checkMusicData?.let { - if(it.id==musicData.id){ - UiThreadHandler.post { - viewCallback?.setProgress(currentPlay, duration) - } - } - } - } - - override fun onMusicCompletion(musicData: MusicData) { - super.onMusicCompletion(musicData) - CallerLogger.d(TAG, "onMusicCompletion:${GsonUtils.toJson(musicData)}") - checkMusicData?.let { - if(it.id==musicData.id){ - it.state = musicData.state - UiThreadHandler.post { - viewCallback?.setPlayOrpause(it) - } - } - } - val nextMusicData = AuditionManager.getNextMusicData(musicData) - CallerLogger.d(TAG, "onMusicCompletion-nextMusic:${GsonUtils.toJson(nextMusicData)}") - setMusicData(nextMusicData) - play() - } - fun seekTo(progress: Int) { - AuditionManager.seekTo(progress) + MusicModel.seekTo(progress) + } + + override fun checkChangeListener(musicData: MusicData) { + CallerLogger.d(TAG, "showData:setMusicData:${musicData}") + this.viewCallback?.setViewData(musicData) + } + + override fun updatePlayCurrent(currentPlay: Long, duration: Long, second: MusicData) { + this.viewCallback?.setProgress(currentPlay,duration) + } + + override fun updateState(oldData: MusicData?, musicData: MusicData) { + this.viewCallback?.setPlayOrpause(musicData) } } \ No newline at end of file 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 73e24dc31a..f2ba3471ae 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 @@ -3,6 +3,7 @@ package com.mogo.och.unmanned.passenger.ui.video import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater +import android.view.View import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView @@ -11,6 +12,7 @@ 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.eagle.core.utilcode.util.UiThreadHandler +import com.mogo.och.common.module.manager.audiofocus.AudioFocusManager 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 @@ -64,15 +66,23 @@ internal class InfoVideoView @JvmOverloads constructor( fun exitFullScreenMode(resetVideoPlayer: Boolean) { - val carouselLayoutManager = infoVideoPlaylist.layoutManager as CarouselLayoutManager -// val (_: Int, player) = getPlayer(carouselLayoutManager) -// player?.let { -// it.exitFullScreenMode() -// it.onVideoPause() -// if (resetVideoPlayer) { -// it.onVideoReset() -// } -// } + video_item_player.exitFullScreenMode() + video_item_player.onVideoPause() + if (resetVideoPlayer) { + video_item_player.onVideoReset() + } + + } + + override fun onVisibilityAggregated(isVisible: Boolean) { + super.onVisibilityAggregated(isVisible) + if(!isVisible){ + video_item_player.onVideoPause() + } + } + + override fun onVisibilityChanged(changedView: View, visibility: Int) { + super.onVisibilityChanged(changedView, visibility) } override fun onAttachedToWindow() { @@ -148,10 +158,12 @@ internal class InfoVideoView @JvmOverloads constructor( GSYVideoView.CURRENT_STATE_PLAYING ->{ currentMedia?.isPlayiing = true infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) + AudioFocusManager.setVideoFocusChange(true) } else ->{ currentMedia?.isPlayiing = false infoVideoPlaylist.adapter?.notifyItemChanged(currentMediaIndex) + AudioFocusManager.setVideoFocusChange(false) } } } diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..343db6bc2f721ec4fb86e2dd9642b63cfdf10f57 GIT binary patch literal 1131 zcmeAS@N?(olHy`uVBq!ia0vp^Zb0nL!3HFE6&Wf5DaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDbz8s;XS;(G2D@sm04l%g>Eakt z!T9#}S$|W$o`|T)cD*KGl%TSOLtpa&psn}<6TMGx3~HC zvu9^APM9q+fhov=%Y#u~(Kt`NR>IwaHPq0aWBSl&2mqf7Q(M@1G+b!EH0K<{O~ZLP)}F? zw!{sW7VR#q-|^TjJbb#lh{Ey2E&&b>si?oR1ea}bY1CBp3Yc<9h}Uh#B_Y0Ld$wHp z_N{qo$)la(qRUbQj##R`<#$(J$`)6BF>!`7vw+az(-PM!_hs*7Y)MnYe@DD%+BJ9bZHw*d{SSJ2KkpW6 z3lqJldZw&VK4hu&(&NXsnMYSY*%Vr1^!nqYed(7kzh9fWV$NCF^@c3hUND_Y@Z#R` z$sy4v@5GF7j)(J}{|b@%a`IGkc5wFzN#_@3+xa#f=h84^44EBvrbqFEAhYFe3+ef* z#CF_$`zV#CN$|r#LG?h1T^5qg3eNVSu|BHm^0(&lx;+zTeWvNSB45$+<2jEDHoq)l zy)1Xh*iE_g=T?&*A6Ij^QF0t}*skE>jj0zN+e}Jue_o)J{K8zVfPYhUzgR$-h~EBl zdyJn6|E>BTqh)#U{p6_LX?GGbX7wbU|JAzGDQ?usml{8Kt z9kJ7wG}?S!gB~ZiJh0Qf{cr8z$lKQ*N6Ah9e`C)yOBwmaS#!^RnZB^Kep7%z)XeM2 mdFzsn+om#LWT(a~rvD5o%KZBtr(OaT3k;sFelF{r5}E+@gx(_n literal 0 HcmV?d00001 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..639ff84620e9d6f11d52fd743327c81b146ea56c GIT binary patch literal 9140 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 literal 0 HcmV?d00001 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png new file mode 100644 index 0000000000000000000000000000000000000000..28c5f825751e9fe5a18a7e26f7c3109ab2350254 GIT binary patch literal 3538 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 M07*qoM6N<$f;|n99{>OV literal 0 HcmV?d00001 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd87a9865c763c89df275c09732aa4b723c8066 GIT binary patch literal 550 zcmeAS@N?(olHy`uVBq!ia0vp^Zb0nL!3HFE6&Wf5DaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDbz8s;XS;(G2D@sm04kf{>Eakt z!T9!;wcp_Yf!2qT%~R%CtzO{372+__bR(140ka4O&CCS}k^#yWCo0Lws61bIXR@bC zyvh>$-nYj4j4w{tOg_fW$RgmtfI_TLdf;3>*JpXU+4tQW%HF(Ful?TmDs!Cco*|yG|=x@8YmX-Wj2v|JN}0{P^0y=*H18 zqnCE%Pv;r>hO7HGSN*^D%+z}FRr6}u68j&=T8`njxg HN@xNAT{^+* literal 0 HcmV?d00001 diff --git a/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png new file mode 100644 index 0000000000000000000000000000000000000000..c62353599147dce296eab890418dd0e4d2eff04c GIT binary patch literal 1082 zcmeAS@N?(olHy`uVBq!ia0vp^Zb0nL!3HFE6&Wf5DaPU;cPEB*=VV?2IWDOYo@u_m z3|c@o2Loe!CIbsd2@p#GF#`kh0!9XAAk7F8TfhXDbz8s;XS;(G2D@sm04iVN>Eakt z!T9#peQyy*8HNw<&#Wr9z2f{u%y!w$$r4ZJrfpX*DHr>u)^Z^_aBjY9SG_}!Agg2G z&1T0yep}YEd#;HJ70HoNxUl(k(7 zhJIo};j`Q4Kf3)*xT{sKoV$6d!B0=&73mJ@e+~w$U-vpLQ#Fj|Ox28G#Xae}6L&BkR6eD(`Lgf96N-|7KW5Bn z_?dmM{-n<_wm*#@{@PaEHoMs%(;V5NaN%L&&+Y#bb|i1~ZQ@pxwz>1O>(*1g84mub zJvVwTo1IHPQ`C4^-?#{3c?$uq$>}t6BTwar=)SDDF!#`Co(wwtjPfJ?-VzV^ROKSX< zp3jT^EZ^&E!qxvgY(^97&A#)o{k2su8ebgentu36Eysk#p$7AXes12Un85Wi*m`+o zx%j&4wYLlmDlY%rv$bna{B{q;18$9-%vWb6Z;S{N>3JKS8_4{;uwvSS*Q<>)l|Oo< z#K@gqEBRUazC+Bf(4$#v9UdCIJ1ybX)-Yr4%alj5^BY3js}m$@4%(i+SyJ?2VW`B? z!n*-p+!1EsFPhTBZ*5?2Wj;CAkSA!0Q^}DI|LNxc&GIyYsh#l>QPjdN}PMX_ejc4(Ji}u*=9ttEy+G3v8Q{o_*bd4yM5=T z3NhCRp3JLIi0;++YqYQ+bh(k*VUvzNUe&mdjwdQ^@P3y4u44N#^4I^Gi;|YA6{$ zV`aM?9Z}nsdO3cl!|wL>UEu iHAld*#}9s%e+(<0ym`I-vSB+Y-+H?GxvX + + + + + + + + + + + + + + \ No newline at end of file diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml index 46f75fa938..889782b12f 100644 --- a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxt_u_p_base_fragment.xml @@ -170,6 +170,16 @@ app:layout_constraintBottom_toBottomOf="@+id/bottom" android:layout_marginEnd="@dimen/dp_86" /> + +