Musicoo/app/src/main/java/com/player/musicoo/activity/PrimaryActivity.kt
2024-05-13 18:34:51 +08:00

294 lines
9.1 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.player.musicoo.activity
import android.content.Intent
import android.os.Handler
import android.os.Looper
import android.os.Message
import android.view.View
import android.widget.Toast
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.media3.common.MediaItem
import androidx.media3.common.Player
import com.bumptech.glide.Glide
import com.player.musicoo.R
import com.player.musicoo.databinding.ActivityPrimaryBinding
import com.player.musicoo.fragment.ImportFragment
import com.player.musicoo.fragment.MoHomeFragment
import com.player.musicoo.fragment.SearchFragment
import com.player.musicoo.media.MediaControllerManager
import com.player.musicoo.util.LogTag.LogD
import kotlinx.coroutines.isActive
import kotlinx.coroutines.selects.select
class PrimaryActivity : MoBaseActivity() ,SearchFragment.SearchFragmentCancelClickListener{
/**
* musicResponsiveListItemRenderer
* musicTwoRowItemRenderer
*/
private lateinit var binding: ActivityPrimaryBinding
private val mFragments: MutableList<Fragment> = ArrayList()
private var currentIndex: Int = 0
private var mCurrentFragment: Fragment? = null
override suspend fun main() {
binding = ActivityPrimaryBinding.inflate(layoutInflater)
setContentView(binding.root)
initView()
initPlayerListener()
onReceive()
}
private fun initView() {
initClick()
initFragment()
}
private fun initClick() {
binding.homeBtn.setOnClickListener {
updateBtnState(0)
changeFragment(0)
}
binding.searchBtn.setOnClickListener {
updateBtnState(1)
changeFragment(1)
}
binding.importBtn.setOnClickListener {
updateBtnState(2)
changeFragment(2)
}
binding.playBlackBtn.setOnClickListener {
if (meController != null) {
if (meController.isPlaying) {
meController.pause()
updatePlayState(false)
} else {
meController.play()
updatePlayState(true)
}
updateProgressState()
}
}
binding.goDetailsBtn.setOnClickListener {
val intent = Intent(this, MoPlayDetailsActivity::class.java)
intent.putExtra(
MoPlayDetailsActivity.PLAY_DETAILS_COME_FROM,
PrimaryActivity::class.java
)
startActivity(intent)
}
}
private fun initFragment() {
mFragments.clear()
mFragments.add(MoHomeFragment())
val searchFragment = SearchFragment()
searchFragment.setButtonClickListener(this)
mFragments.add(searchFragment)
mFragments.add(ImportFragment())
updateBtnState(0)
changeFragment(0)
}
private fun changeFragment(index: Int) {
currentIndex = index
val ft: FragmentTransaction = supportFragmentManager.beginTransaction()
if (null != mCurrentFragment) {
ft.hide(mCurrentFragment!!)
}
var fragment = supportFragmentManager.findFragmentByTag(
mFragments[currentIndex].javaClass.name
)
if (null == fragment) {
fragment = mFragments[index]
}
mCurrentFragment = fragment
if (!fragment.isAdded) {
ft.add(R.id.frame_layout, fragment, fragment.javaClass.name)
} else {
ft.show(fragment)
}
ft.commit()
}
private fun updateBtnState(index: Int) {
binding.apply {
homeImg.setImageResource(
when (index) {
0 -> R.drawable.home_select_icon
else -> R.drawable.home_unselect_icon
}
)
searchImg.setImageResource(
when (index) {
1 -> {
binding.tabLayout.visibility = View.GONE
R.drawable.search_select_icon
}
else -> {
binding.tabLayout.visibility = View.VISIBLE
R.drawable.search_unselect_icon
}
}
)
importImg.setImageResource(
when (index) {
2 -> R.drawable.import_select_icon
else -> R.drawable.import_unselect_icon
}
)
}
}
private suspend fun onReceive() {
while (isActive) {
select<Unit> {
events.onReceive {
when (it) {
Event.ActivityOnResume -> {
activityOnResume()
}
else -> {}
}
}
}
}
}
private fun activityOnResume() {
if (meController != null && meController.mediaItemCount > 0 && meController.duration > 0) {
binding.playingStatusLayout.visibility = View.VISIBLE
updateInfoUi(meController.currentMediaItem)
} else {
binding.playingStatusLayout.visibility = View.GONE
}
}
private fun initPlayerListener() {
meController?.addListener(playerListener)
}
private val playerListener = object : Player.Listener {
override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
reason: Int
) {
if (reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
updateInfoUi(meController?.currentMediaItem)
}
}
override fun onPlaybackStateChanged(playbackState: Int) {
LogD(TAG, "playbackState->$playbackState")
updateProgressState()
when (playbackState) {
Player.STATE_READY -> {
if (meController != null) {
LogD(TAG, "meController.duration->${meController.duration}")
binding.progressBar.setMaxProgress(MediaControllerManager.getDuration())
val currentPosition = meController.currentPosition
binding.progressBar.setProgress(currentPosition)
}
}
else -> {}
}
}
override fun onPlayWhenReadyChanged(
playWhenReady: Boolean,
reason: Int
) {
updatePlayState(playWhenReady)
updateProgressState()
}
}
override fun onDestroy() {
super.onDestroy()
meController?.removeListener(playerListener)
}
private var backPressedTime: Long = 0
private val backToast: Toast by lazy {
Toast.makeText(baseContext, getString(R.string.exit_main_text), Toast.LENGTH_SHORT)
}
override fun onBackPressed() {
if (currentIndex == 1) {//等于搜索返回响应先退回home
changeFragment(0)
updateBtnState(0)
} else {
if (backPressedTime + 2000 > System.currentTimeMillis()) {
super.onBackPressed()
backToast.cancel()
return
} else {
backToast.show()
}
backPressedTime = System.currentTimeMillis()
}
}
/**
* 更新播放进度
*/
private fun updateProgressState() {
//判断是否ready与播放中否则停止更新进度
if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) {
updatePlayState(meController.isPlaying)
progressHandler.removeCallbacksAndMessages(null)
progressHandler.sendEmptyMessage(1)
} else {
progressHandler.removeCallbacksAndMessages(null)
}
}
/**
* 播放进度
*/
private val progressHandler = object : Handler(Looper.myLooper()!!) {
override fun handleMessage(msg: Message) {
//判断是否ready与播放中否则停止更新进度
if (meController != null && meController.playbackState == Player.STATE_READY && meController.isPlaying) {
val currentPosition = meController.currentPosition
binding.progressBar.setProgress(currentPosition)
sendEmptyMessageDelayed(1, 50)
}
}
}
private fun updatePlayState(b: Boolean) {
if (b) {
binding.playStatusImg.setImageResource(R.drawable.playing_black_icon)
} else {
binding.playStatusImg.setImageResource(R.drawable.play_black_icon)
}
}
private fun updateInfoUi(mediaItem: MediaItem?) {
if (mediaItem == null) {
return
}
Glide.with(this@PrimaryActivity)
.load(mediaItem.mediaMetadata.artworkUri)
.into(binding.audioImg)
binding.name.text = mediaItem.mediaMetadata.title
binding.desc.text = mediaItem.mediaMetadata.artist
}
override fun onFragmentClick() {
onBackPressed()
}
}