fix(main): 오디오 알림 이동과 미니 플레이어를 연결한다

This commit is contained in:
2026-07-06 14:00:23 +09:00
parent 5b9b7eafa7
commit e3d81792bf
3 changed files with 235 additions and 2 deletions

View File

@@ -1,9 +1,12 @@
package kr.co.vividnext.sodalive.v2.main
import android.Manifest
import android.annotation.SuppressLint
import android.content.BroadcastReceiver
import android.content.Context
import android.content.ComponentName
import android.content.Intent
import android.content.IntentFilter
import android.os.Build
import android.os.Bundle
import android.os.Handler
@@ -39,6 +42,7 @@ import kr.co.vividnext.sodalive.audition.AuditionActivity
import kr.co.vividnext.sodalive.base.BaseActivity
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.extensions.dpToPx
import kr.co.vividnext.sodalive.databinding.ActivityMainV2Binding
import kr.co.vividnext.sodalive.explorer.profile.creator_community.all.CreatorCommunityAllActivity
import kr.co.vividnext.sodalive.main.EventPopupDialogFragment
@@ -72,6 +76,7 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
private var mediaControllerFuture: ListenableFuture<MediaController>? = null
private val handler = Handler(Looper.getMainLooper())
private val showMiniPlayerRunnable = Runnable { initAndVisibleMiniPlayer() }
private val audioContentReceiver = AudioContentReceiver()
private var playerStateJob: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
@@ -82,11 +87,16 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
trackAppLaunchIfNeeded()
pushTokenUpdate()
handler.postDelayed({
if (!handleAudioNotificationRoute(intent) && isLoggedIn()) {
executeDeeplink(intent)
}
}, 1000)
if (isLoggedIn()) {
updatePidAndGaid()
getEventPopup()
observePlayerState()
handler.postDelayed({ executeDeeplink(intent) }, 1000)
}
}
@@ -114,14 +124,22 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
return
}
if (isLoggedIn()) {
if (!handleAudioNotificationRoute(intent) && isLoggedIn()) {
executeDeeplink(intent)
}
}
@SuppressLint("UnspecifiedRegisterReceiverFlag")
override fun onResume() {
super.onResume()
getMemberInfo()
val intentFilter = IntentFilter(Constants.ACTION_MAIN_AUDIO_CONTENT_RECEIVER)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
registerReceiver(audioContentReceiver, intentFilter, RECEIVER_NOT_EXPORTED)
} else {
registerReceiver(audioContentReceiver, intentFilter)
}
startService(
Intent(this, AudioContentPlayService::class.java).apply {
action = AudioContentPlayService.MusicAction.INIT.name
@@ -129,6 +147,11 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
)
}
override fun onPause() {
unregisterReceiver(audioContentReceiver)
super.onPause()
}
override fun onDestroy() {
deInitMiniPlayer()
playerStateJob?.cancel()
@@ -405,6 +428,39 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
playerFragment.show(supportFragmentManager, playerFragment.tag)
}
private fun handleAudioNotificationRoute(intent: Intent): Boolean {
val route = intent.getStringExtra(EXTRA_AUDIO_NOTIFICATION_ROUTE) ?: return false
intent.removeExtra(EXTRA_AUDIO_NOTIFICATION_ROUTE)
return when (route) {
ROUTE_AUDIO_PLAYER -> {
if (isLoggedIn()) {
showPlayerFragment()
} else {
showLoginActivity()
}
true
}
ROUTE_AUDIO_DETAIL -> {
val contentId = intent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0)
intent.removeExtra(Constants.EXTRA_AUDIO_CONTENT_ID)
if (contentId > 0 && isLoggedIn()) {
startActivity(
Intent(applicationContext, AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
}
)
} else if (!isLoggedIn()) {
showLoginActivity()
}
contentId > 0
}
else -> false
}
}
private fun checkPermissions() {
val permissions = mutableListOf(Manifest.permission.RECORD_AUDIO)
@@ -734,8 +790,90 @@ class MainV2Activity : BaseActivity<ActivityMainV2Binding>(ActivityMainV2Binding
return SharedPreferenceManager.token.isNotBlank() && SharedPreferenceManager.token.length > 10
}
inner class AudioContentReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val contentId = intent?.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0)
val title = intent?.getStringExtra(Constants.EXTRA_AUDIO_CONTENT_TITLE)
val nickname = intent?.getStringExtra(Constants.EXTRA_NICKNAME)
val coverImageUrl = intent?.getStringExtra(
Constants.EXTRA_AUDIO_CONTENT_COVER_IMAGE_URL
)
val isPlaying = intent?.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_PLAYING, false)
val isShowing = intent?.getBooleanExtra(Constants.EXTRA_AUDIO_CONTENT_SHOWING, false)
if (isShowing == true) {
binding.clMiniPlayer.visibility = View.VISIBLE
if (contentId != null && contentId > 0) {
binding.clMiniPlayer.setOnClickListener {
startActivity(
Intent(applicationContext, AudioContentDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
}
)
}
}
if (isPlaying == true) {
binding.ivPlayerPlayOrPause.setImageResource(R.drawable.ic_noti_pause)
binding.ivPlayerPlayOrPause.setOnClickListener {
startService(
Intent(this@MainV2Activity, AudioContentPlayService::class.java).apply {
action = AudioContentPlayService.MusicAction.PAUSE.name
}
)
}
} else {
binding.ivPlayerPlayOrPause.setImageResource(R.drawable.ic_noti_play)
binding.ivPlayerPlayOrPause.setOnClickListener {
startService(
Intent(this@MainV2Activity, AudioContentPlayService::class.java).apply {
action = AudioContentPlayService.MusicAction.PLAY.name
}
)
}
}
binding.ivPlayerStop.setOnClickListener {
startService(
Intent(this@MainV2Activity, AudioContentPlayService::class.java).apply {
action = AudioContentPlayService.MusicAction.STOP.name
}
)
}
if (!title.isNullOrBlank()) {
binding.tvPlayerTitle.text = title
}
if (!nickname.isNullOrBlank()) {
binding.tvPlayerNickname.text = nickname
}
if (!coverImageUrl.isNullOrBlank()) {
binding.ivPlayerCover.load(coverImageUrl) {
crossfade(true)
placeholder(R.drawable.bg_placeholder)
transformations(RoundedCornersTransformation(5.3f.dpToPx()))
}
}
} else {
handler.post {
binding.ivPlayerPlayOrPause.setImageResource(0)
binding.ivPlayerCover.setImageResource(0)
binding.tvPlayerTitle.text = ""
binding.tvPlayerNickname.text = ""
binding.clMiniPlayer.visibility = View.GONE
binding.ivPlayerPlayOrPause.setOnClickListener {}
}
}
}
}
companion object {
private const val EXTRA_CHAT_FILTER: String = "extra_chat_filter"
const val EXTRA_AUDIO_NOTIFICATION_ROUTE: String = "extra_audio_notification_route"
const val ROUTE_AUDIO_PLAYER: String = "audio_player"
const val ROUTE_AUDIO_DETAIL: String = "audio_detail"
fun newChatDmIntent(context: Context): Intent {
return Intent(context, MainV2Activity::class.java).apply {