[fea]
[music bottom bar]
This commit is contained in:
yangyakun
2025-05-06 18:06:36 +08:00
parent 81c480cf00
commit d8768454ff
20 changed files with 575 additions and 230 deletions

View File

@@ -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]

View File

@@ -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()
}
}
/**

View File

@@ -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)

View File

@@ -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<MusicModel.MusicDataListener>(), 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) {}
}
}

View File

@@ -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)
}
}

View File

@@ -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()
}
}
}
}

View File

@@ -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)
}
}
}

View File

@@ -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<MusicData>) {
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 {

View File

@@ -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<MusicData>()
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<MusicData>) {
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)
}
}

View File

@@ -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<MusicData>)
fun addAllData(data: MutableList<MusicData>)
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)
}
}
}

View File

@@ -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()

View File

@@ -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)
}
}

View File

@@ -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)
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="@dimen/dp_150"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_music_bottom"
android:src="@drawable/taxi_p_music_bar_bottom"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_width="@dimen/dp_140"
android:layout_height="@dimen/dp_140"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_music_top"
android:src="@drawable/taxi_p_music_bar_top"
app:layout_constraintTop_toTopOf="@+id/aciv_music_bottom"
app:layout_constraintBottom_toBottomOf="@+id/aciv_music_bottom"
app:layout_constraintStart_toStartOf="@+id/aciv_music_bottom"
app:layout_constraintEnd_toEndOf="@+id/aciv_music_bottom"
android:layout_width="@dimen/dp_48"
android:layout_height="@dimen/dp_48"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/actv_music_title"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toEndOf="@+id/aciv_music_bottom"
android:layout_marginTop="@dimen/dp_29"
app:layout_constraintEnd_toEndOf="@+id/sb_musuc_bar_progess"
tools:text="Lark in the clear air"
android:textSize="@dimen/dp_32"
android:maxLines="1"
android:ellipsize="end"
android:textColor="@color/taxi_p_303C52"
android:layout_width="0dp"
android:layout_height="wrap_content"/>
<SeekBar
android:max="100"
android:progress="0"
android:id="@+id/sb_musuc_bar_progess"
android:thumb="@drawable/taxi_p_music_seekbar_thumb"
app:layout_constraintBottom_toBottomOf="parent"
android:paddingStart="@dimen/dp_0"
app:layout_constraintStart_toEndOf="@+id/aciv_music_bottom"
android:layout_marginBottom="@dimen/dp_46"
android:duplicateParentState="true"
android:progressDrawable="@drawable/taxt_p_music_seekbar_style"
android:layout_width="@dimen/dp_300"
android:layout_height="@dimen/dp_8"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_music_toggle_bar"
android:src="@drawable/taxi_p_music_pause_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/sb_musuc_bar_progess"
android:layout_marginStart="@dimen/dp_77"
android:layout_width="@dimen/dp_70"
android:layout_height="@dimen/dp_71"/>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/aciv_music_next_bar"
android:src="@drawable/iv_show_next_bar"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/aciv_music_toggle_bar"
android:layout_marginStart="@dimen/dp_80"
android:layout_width="@dimen/dp_70"
android:layout_height="@dimen/dp_71"/>
</merge>

View File

@@ -170,6 +170,16 @@
app:layout_constraintBottom_toBottomOf="@+id/bottom"
android:layout_marginEnd="@dimen/dp_86" />
<com.mogo.och.unmanned.passenger.ui.music.bar.MusicBarView
android:id="@+id/musicBarView"
app:layout_constraintTop_toTopOf="@+id/bottom"
app:layout_constraintBottom_toBottomOf="@+id/bottom"
app:layout_constraintEnd_toStartOf="@+id/cb_setting_voice"
android:layout_marginEnd="@dimen/dp_80"
android:visibility="gone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.mogo.och.unmanned.passenger.ui.setting.LightSetting
android:id="@+id/light_setting"