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 0000000000..343db6bc2f Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/iv_show_next_bar.png differ 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 0000000000..639ff84620 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_bottom.png differ 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 0000000000..28c5f82575 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_bar_top.png differ 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 0000000000..bbd87a9865 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_pause_bar.png differ 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 0000000000..c623535991 Binary files /dev/null and b/OCH/taxi/unmanned-passenger/src/main/res/drawable-nodpi/taxi_p_music_play_bar.png differ diff --git a/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml new file mode 100644 index 0000000000..7ed4fb62c1 --- /dev/null +++ b/OCH/taxi/unmanned-passenger/src/main/res/layout/taxi_p_music_bar.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + \ 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" /> + +