[8.0.0]
[fea] [music bottom bar]
This commit is contained in:
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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) {}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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 |
@@ -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>
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user