fix(deeplink): 딥링크 포그라운드 라우팅을 정비한다

This commit is contained in:
2026-03-06 16:54:35 +09:00
parent 93b620f4a8
commit 2b5240a565
9 changed files with 549 additions and 111 deletions

View File

@@ -85,6 +85,7 @@ object Constants {
const val LIVE_SERVICE_NOTIFICATION_ID: Int = 2
const val ACTION_AUDIO_CONTENT_RECEIVER = "soda_live_action_content_receiver"
const val ACTION_MAIN_AUDIO_CONTENT_RECEIVER = "soda_live_action_main_content_receiver"
const val ACTION_LIVE_ROOM_DEEPLINK_CONFIRM = "soda_live_action_live_room_deeplink_confirm"
const val EXTRA_COMMUNITY_POST_ID = "community_post_id"
const val EXTRA_COMMUNITY_CREATOR_ID = "community_creator_id"

View File

@@ -14,7 +14,7 @@ import kr.co.vividnext.sodalive.R
import kr.co.vividnext.sodalive.app.SodaLiveApp
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.splash.SplashActivity
import kr.co.vividnext.sodalive.main.DeepLinkActivity
class SodaFirebaseMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
@@ -62,33 +62,22 @@ class SodaFirebaseMessagingService : FirebaseMessagingService() {
notificationManager.createNotificationChannel(channel)
}
val intent = Intent(this, SplashActivity::class.java)
val intent = Intent(this, DeepLinkActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
val roomId = messageData["room_id"]
if (roomId != null) {
intent.putExtra(Constants.EXTRA_ROOM_ID, roomId.toLong())
val deepLinkExtras = android.os.Bundle().apply {
messageData["room_id"]?.let { putString("room_id", it) }
messageData["message_id"]?.let { putString("message_id", it) }
messageData["content_id"]?.let { putString("content_id", it) }
messageData["channel_id"]?.let { putString("channel_id", it) }
messageData["audition_id"]?.let { putString("audition_id", it) }
messageData["deep_link_value"]?.let { putString("deep_link_value", it) }
messageData["deep_link_sub5"]?.let { putString("deep_link_sub5", it) }
}
val messageId = messageData["message_id"]
if (messageId != null) {
intent.putExtra(Constants.EXTRA_MESSAGE_ID, messageId.toLong())
}
val audioContentId = messageData["content_id"]
if (audioContentId != null) {
intent.putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, audioContentId.toLong())
}
val channelId = messageData["channel_id"]
if (channelId != null) {
intent.putExtra(Constants.EXTRA_USER_ID, channelId.toLong())
}
val auditionId = messageData["audition_id"]
if (auditionId != null) {
intent.putExtra(Constants.EXTRA_AUDITION_ID, auditionId.toLong())
if (!deepLinkExtras.isEmpty) {
intent.putExtra(Constants.EXTRA_DATA, deepLinkExtras)
}
val pendingIntent =

View File

@@ -10,6 +10,10 @@ import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.BroadcastReceiver
import android.content.IntentFilter
import android.content.pm.PackageManager
import android.content.pm.ResolveInfo
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
@@ -18,6 +22,7 @@ import android.graphics.Path
import android.graphics.Rect
import android.graphics.Typeface
import android.graphics.drawable.Drawable
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.os.CountDownTimer
@@ -51,6 +56,7 @@ import androidx.core.graphics.withTranslation
import androidx.core.net.toUri
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import coil.transform.CircleCropTransformation
@@ -109,6 +115,8 @@ import kr.co.vividnext.sodalive.live.room.update.LiveRoomInfoEditDialog
import kr.co.vividnext.sodalive.live.roulette.RoulettePreviewDialog
import kr.co.vividnext.sodalive.live.roulette.RouletteSpinDialog
import kr.co.vividnext.sodalive.live.roulette.config.RouletteConfigActivity
import kr.co.vividnext.sodalive.main.DeepLinkActivity
import kr.co.vividnext.sodalive.main.MainActivity
import kr.co.vividnext.sodalive.report.ProfileReportDialog
import kr.co.vividnext.sodalive.report.ReportType
import kr.co.vividnext.sodalive.report.UserReportDialog
@@ -116,6 +124,7 @@ import kr.co.vividnext.sodalive.settings.language.LanguageManager
import kr.co.vividnext.sodalive.settings.notification.MemberRole
import org.koin.android.ext.android.inject
import org.json.JSONObject
import java.util.Locale
import java.util.concurrent.TimeUnit
import java.util.regex.Pattern
import kotlin.random.Random
@@ -242,6 +251,22 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}
}
private val deepLinkConfirmReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val bundle = intent?.getBundleExtra(Constants.EXTRA_DATA) ?: return
val destinationPageName = resolveDestinationPageName(bundle)
showDeepLinkNavigationDialog(destinationPageName) {
val nextIntent = Intent(applicationContext, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
putExtra(Constants.EXTRA_DATA, bundle)
}
startActivity(nextIntent)
finish()
}
}
}
// region lifecycle
override fun onCreate(savedInstanceState: Bundle?) {
initAgora()
@@ -265,6 +290,11 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
override fun onStart() {
super.onStart()
isForeground = true
LocalBroadcastManager.getInstance(this).registerReceiver(
deepLinkConfirmReceiver,
IntentFilter(Constants.ACTION_LIVE_ROOM_DEEPLINK_CONFIRM)
)
if (this::layoutManager.isInitialized) {
layoutManager.scrollToPosition(chatAdapter.itemCount - 1)
@@ -284,6 +314,12 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}
}
override fun onStop() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(deepLinkConfirmReceiver)
isForeground = false
super.onStop()
}
override fun onDestroy() {
cropper.cleanup()
hideKeyboard {
@@ -297,6 +333,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
countDownTimer.cancel()
super.onDestroy()
}
// endregion
// region setupView
@@ -1177,7 +1214,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
val url = spannable.subSequence(start, end).toString()
startActivity(Intent(Intent.ACTION_VIEW, url.toUri()))
handleNoticeUrlClick(url)
}
}
spannable.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
@@ -1187,6 +1224,135 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
textView.movementMethod = LinkMovementMethod.getInstance()
}
private fun handleNoticeUrlClick(url: String) {
val viewIntent = Intent(Intent.ACTION_VIEW, url.toUri())
if (isInAppDeepLinkIntent(viewIntent)) {
val deepLinkExtras = buildDeepLinkExtrasFromUri(viewIntent.data)
val destinationPageName = resolveDestinationPageName(deepLinkExtras)
showDeepLinkNavigationDialog(destinationPageName) {
startActivity(viewIntent)
finish()
}
return
}
startActivity(viewIntent)
}
private fun isInAppDeepLinkIntent(intent: Intent): Boolean {
val handlers = queryIntentActivitiesCompat(intent)
return handlers.any { resolveInfo ->
resolveInfo.activityInfo.packageName == packageName &&
resolveInfo.activityInfo.name == DeepLinkActivity::class.java.name
}
}
@Suppress("DEPRECATION")
private fun queryIntentActivitiesCompat(intent: Intent): List<ResolveInfo> {
val flags = PackageManager.MATCH_DEFAULT_ONLY
return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
packageManager.queryIntentActivities(
intent,
PackageManager.ResolveInfoFlags.of(flags.toLong())
)
} else {
packageManager.queryIntentActivities(intent, flags)
}
}
private fun buildDeepLinkExtrasFromUri(data: Uri?): Bundle {
val extras = Bundle()
if (data == null) {
return extras
}
fun putQuery(key: String) {
val value = data.getQueryParameter(key)
if (!value.isNullOrBlank()) {
extras.putString(key, value)
}
}
putQuery("room_id")
putQuery("channel_id")
putQuery("message_id")
putQuery("audition_id")
putQuery("content_id")
putQuery("deep_link_value")
putQuery("deep_link_sub5")
val deepLinkValue = extras.getString("deep_link_value")
val deepLinkValueId = extras.getString("deep_link_sub5")
if (!deepLinkValue.isNullOrBlank() && !deepLinkValueId.isNullOrBlank()) {
when (deepLinkValue.lowercase(Locale.ROOT)) {
"live" -> if (!extras.containsKey("room_id")) {
extras.putString("room_id", deepLinkValueId)
}
"channel" -> if (!extras.containsKey("channel_id")) {
extras.putString("channel_id", deepLinkValueId)
}
"content" -> if (!extras.containsKey("content_id")) {
extras.putString("content_id", deepLinkValueId)
}
"audition" -> if (!extras.containsKey("audition_id")) {
extras.putString("audition_id", deepLinkValueId)
}
else -> Unit
}
}
return extras
}
private fun resolveDestinationPageName(bundle: Bundle): String {
val roomId = bundle.getString("room_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_ROOM_ID).takeIf { it > 0 }
val channelId = bundle.getString("channel_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_USER_ID).takeIf { it > 0 }
val messageId = bundle.getString("message_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_MESSAGE_ID).takeIf { it > 0 }
val contentId = bundle.getString("content_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_AUDIO_CONTENT_ID).takeIf { it > 0 }
return when {
roomId != null && roomId > 0 -> getString(R.string.screen_live_room_deeplink_target_live_room)
channelId != null && channelId > 0 -> getString(R.string.screen_live_room_deeplink_target_channel_profile)
contentId != null && contentId > 0 -> getString(R.string.screen_live_room_deeplink_target_content_detail)
messageId != null && messageId > 0 -> getString(R.string.screen_live_room_deeplink_target_message)
else -> {
when (bundle.getString("deep_link_value")?.lowercase(Locale.ROOT)) {
"live" -> getString(R.string.screen_live_room_deeplink_target_live_room)
"channel" -> getString(R.string.screen_live_room_deeplink_target_channel_profile)
"content" -> getString(R.string.screen_live_room_deeplink_target_content_detail)
"series" -> getString(R.string.screen_live_room_deeplink_target_series_detail)
"audition" -> getString(R.string.screen_live_room_deeplink_target_audition)
else -> getString(R.string.screen_live_room_deeplink_target_default)
}
}
}
}
private fun showDeepLinkNavigationDialog(destinationPageName: String, onConfirm: () -> Unit) {
SodaDialog(
activity = this,
layoutInflater = layoutInflater,
title = getString(R.string.screen_live_room_deeplink_move_title),
desc = getString(R.string.screen_live_room_deeplink_move_message, destinationPageName),
confirmButtonTitle = getString(R.string.screen_live_room_yes),
confirmButtonClick = {
onConfirm()
},
cancelButtonTitle = getString(R.string.cancel),
cancelButtonClick = {}
).show(screenWidth)
}
private fun onClickQuit() {
hideKeyboard {
if (viewModel.isEqualToHostId(SharedPreferenceManager.userId.toInt())) {
@@ -3583,5 +3749,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
companion object {
private const val NO_CHATTING_TIME = 180L
var isForeground: Boolean = false
}
}

View File

@@ -3,9 +3,11 @@ package kr.co.vividnext.sodalive.main
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.os.Handler
import android.os.Looper
import androidx.appcompat.app.AppCompatActivity
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import kr.co.vividnext.sodalive.app.SodaLiveApp
import kr.co.vividnext.sodalive.common.Constants
import kr.co.vividnext.sodalive.live.room.LiveRoomActivity
import kr.co.vividnext.sodalive.mypage.can.payment.CanPaymentActivity
import kr.co.vividnext.sodalive.splash.SplashActivity
@@ -14,6 +16,8 @@ class DeepLinkActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
val data: Uri? = intent?.data
val deepLinkExtras = buildDeepLinkExtras(intent)
if (data != null && data.scheme != null) {
val host = data.host
val path = data.path
@@ -30,15 +34,136 @@ class DeepLinkActivity : AppCompatActivity() {
}
}
// 그 외 일반 딥링크는 기존처럼 Splash로 위임
if (SodaLiveApp.isAppInForeground && LiveRoomActivity.isForeground && deepLinkExtras != null) {
LocalBroadcastManager.getInstance(applicationContext).sendBroadcast(
Intent(Constants.ACTION_LIVE_ROOM_DEEPLINK_CONFIRM).apply {
putExtra(Constants.EXTRA_DATA, deepLinkExtras)
}
)
finish()
return
}
if (SodaLiveApp.isAppInForeground) {
startActivity(
Intent(applicationContext, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
deepLinkExtras?.let { putExtra(Constants.EXTRA_DATA, it) }
}
)
finish()
return
}
startActivity(
Intent(applicationContext, SplashActivity::class.java).apply {
setData(intent.data)
setData(data)
deepLinkExtras?.let { putExtra(Constants.EXTRA_DATA, it) }
}
)
finish()
}
Handler(Looper.getMainLooper()).postDelayed({
finish()
}, 1000)
private fun buildDeepLinkExtras(intent: Intent): Bundle? {
val extras = Bundle()
val data = intent.data
if (data != null) {
fun putQuery(key: String) {
val value = data.getQueryParameter(key)
if (!value.isNullOrBlank()) {
extras.putString(key, value)
}
}
putQuery("room_id")
putQuery("channel_id")
putQuery("message_id")
putQuery("audition_id")
putQuery("content_id")
putQuery("deep_link_value")
putQuery("deep_link_sub5")
}
intent.getBundleExtra(Constants.EXTRA_DATA)?.let { source ->
fun copyString(key: String) {
val value = source.getString(key)
if (!value.isNullOrBlank()) {
extras.putString(key, value)
}
}
copyString("room_id")
copyString("channel_id")
copyString("message_id")
copyString("audition_id")
copyString("content_id")
copyString("deep_link_value")
copyString("deep_link_sub5")
source.getLong(Constants.EXTRA_ROOM_ID).takeIf { it > 0 }?.let {
extras.putString("room_id", it.toString())
}
source.getLong(Constants.EXTRA_USER_ID).takeIf { it > 0 }?.let {
extras.putString("channel_id", it.toString())
}
source.getLong(Constants.EXTRA_MESSAGE_ID).takeIf { it > 0 }?.let {
extras.putString("message_id", it.toString())
}
source.getLong(Constants.EXTRA_AUDITION_ID).takeIf { it > 0 }?.let {
extras.putString("audition_id", it.toString())
}
source.getLong(Constants.EXTRA_AUDIO_CONTENT_ID).takeIf { it > 0 }?.let {
extras.putString("content_id", it.toString())
}
}
intent.getLongExtra(Constants.EXTRA_ROOM_ID, 0).takeIf { it > 0 }?.let {
extras.putString("room_id", it.toString())
}
intent.getLongExtra(Constants.EXTRA_USER_ID, 0).takeIf { it > 0 }?.let {
extras.putString("channel_id", it.toString())
}
intent.getLongExtra(Constants.EXTRA_MESSAGE_ID, 0).takeIf { it > 0 }?.let {
extras.putString("message_id", it.toString())
}
intent.getLongExtra(Constants.EXTRA_AUDITION_ID, 0).takeIf { it > 0 }?.let {
extras.putString("audition_id", it.toString())
}
intent.getLongExtra(Constants.EXTRA_AUDIO_CONTENT_ID, 0).takeIf { it > 0 }?.let {
extras.putString("content_id", it.toString())
}
val deepLinkValue = extras.getString("deep_link_value")
val deepLinkValueId = extras.getString("deep_link_sub5")
if (!deepLinkValue.isNullOrBlank() && !deepLinkValueId.isNullOrBlank()) {
when (deepLinkValue.lowercase()) {
"live" -> if (!extras.containsKey("room_id")) {
extras.putString("room_id", deepLinkValueId)
}
"channel" -> if (!extras.containsKey("channel_id")) {
extras.putString("channel_id", deepLinkValueId)
}
"content" -> if (!extras.containsKey("content_id")) {
extras.putString("content_id", deepLinkValueId)
}
"audition" -> if (!extras.containsKey("audition_id")) {
extras.putString("audition_id", deepLinkValueId)
}
else -> Unit
}
}
return if (extras.isEmpty) {
null
} else {
extras
}
}
}

View File

@@ -51,6 +51,7 @@ import kr.co.vividnext.sodalive.settings.event.EventDetailActivity
import kr.co.vividnext.sodalive.settings.notification.NotificationSettingsDialog
import kr.co.vividnext.sodalive.user.login.LoginActivity
import org.koin.android.ext.android.inject
import java.util.Locale
@UnstableApi
class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::inflate) {
@@ -267,105 +268,146 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
}
private fun executeDeeplink(intent: Intent) {
val isLoggedIn =
SharedPreferenceManager.token.isNotBlank() && SharedPreferenceManager.token.length > 10
if (!isLoggedIn) {
executeOneLink()
return
}
val bundle = intent.getBundleExtra(Constants.EXTRA_DATA)
if (
SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10 &&
bundle != null
) {
val isHandledFromBundle = if (bundle != null) {
try {
val roomId = bundle.getString("room_id")?.toLong()
?: bundle.getLong(Constants.EXTRA_ROOM_ID)
val channelId = bundle.getString("channel_id")?.toLong()
?: bundle.getLong(Constants.EXTRA_USER_ID)
val messageId = bundle.getString("message_id")?.toLong()
?: bundle.getLong(Constants.EXTRA_MESSAGE_ID)
val auditionId = bundle.getString("audition_id")?.toLong()
?: bundle.getLong(Constants.EXTRA_AUDITION_ID)
val contentId = bundle.getString("content_id")?.toLong()
?: bundle.getLong(Constants.EXTRA_AUDIO_CONTENT_ID)
val isLiveReservation = bundle.getBoolean(Constants.EXTRA_LIVE_RESERVATION_RESPONSE)
if (roomId > 0) {
viewModel.clickTab(MainViewModel.CurrentTab.LIVE)
handler.postDelayed({
if (isLiveReservation) {
liveFragment.reservationRoom(roomId)
} else {
liveFragment.enterLiveRoom(roomId)
}
}, 500)
} else if (channelId > 0) {
val nextIntent = Intent(applicationContext, UserProfileActivity::class.java)
nextIntent.putExtra(Constants.EXTRA_USER_ID, channelId)
startActivity(nextIntent)
} else if (contentId > 0) {
val nextIntent = Intent(
applicationContext,
AudioContentDetailActivity::class.java
)
nextIntent.putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
startActivity(nextIntent)
} else if (messageId > 0) {
startActivity(Intent(applicationContext, MessageActivity::class.java))
} else if (auditionId > 0) {
}
executeBundleDeeplink(bundle)
} catch (_: IllegalStateException) {
false
}
} else {
false
}
if (isHandledFromBundle) {
clearDeferredDeepLink()
return
}
executeOneLink()
}
private fun executeBundleDeeplink(bundle: Bundle): Boolean {
val roomId = bundle.getString("room_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_ROOM_ID).takeIf { it > 0 }
val channelId = bundle.getString("channel_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_USER_ID).takeIf { it > 0 }
val messageId = bundle.getString("message_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_MESSAGE_ID).takeIf { it > 0 }
val contentId = bundle.getString("content_id")?.toLongOrNull()
?: bundle.getLong(Constants.EXTRA_AUDIO_CONTENT_ID).takeIf { it > 0 }
val isLiveReservation = bundle.getBoolean(Constants.EXTRA_LIVE_RESERVATION_RESPONSE)
when {
roomId != null && roomId > 0 -> {
viewModel.clickTab(MainViewModel.CurrentTab.LIVE)
handler.postDelayed({
if (isLiveReservation) {
liveFragment.reservationRoom(roomId)
} else {
liveFragment.enterLiveRoom(roomId)
}
}, 500)
return true
}
channelId != null && channelId > 0 -> {
val nextIntent = Intent(applicationContext, UserProfileActivity::class.java)
nextIntent.putExtra(Constants.EXTRA_USER_ID, channelId)
startActivity(nextIntent)
return true
}
contentId != null && contentId > 0 -> {
val nextIntent = Intent(
applicationContext,
AudioContentDetailActivity::class.java
)
nextIntent.putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, contentId)
startActivity(nextIntent)
return true
}
messageId != null && messageId > 0 -> {
startActivity(Intent(applicationContext, MessageActivity::class.java))
return true
}
}
val deepLinkValue = bundle.getString("deep_link_value")
val deepLinkValueId = bundle.getString("deep_link_sub5")?.toLongOrNull()
if (!deepLinkValue.isNullOrBlank() && deepLinkValueId != null && deepLinkValueId > 0) {
return routeByDeepLinkValue(deepLinkValue = deepLinkValue, deepLinkValueId = deepLinkValueId)
}
return false
}
private fun executeOneLink() {
val deepLinkValue = SharedPreferenceManager.marketingLinkValue
val deepLinkValueId = SharedPreferenceManager.marketingLinkValueId
if (deepLinkValue.isNotBlank() && deepLinkValueId > 0) {
when (deepLinkValue) {
"series" -> {
startActivity(
Intent(applicationContext, SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, deepLinkValueId)
}
)
}
"content" -> {
startActivity(
Intent(
applicationContext,
AudioContentDetailActivity::class.java
).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, deepLinkValueId)
}
)
}
"channel" -> {
startActivity(
Intent(applicationContext, UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, deepLinkValueId)
}
)
}
"live" -> {
viewModel.clickTab(MainViewModel.CurrentTab.LIVE)
handler.postDelayed({
liveFragment.enterLiveRoom(deepLinkValueId)
}, 500)
}
else -> {}
}
routeByDeepLinkValue(deepLinkValue = deepLinkValue, deepLinkValueId = deepLinkValueId)
}
clearDeferredDeepLink()
}
private fun routeByDeepLinkValue(deepLinkValue: String, deepLinkValueId: Long): Boolean {
return when (deepLinkValue.lowercase(Locale.ROOT)) {
"series" -> {
startActivity(
Intent(applicationContext, SeriesDetailActivity::class.java).apply {
putExtra(Constants.EXTRA_SERIES_ID, deepLinkValueId)
}
)
true
}
"content" -> {
startActivity(
Intent(
applicationContext,
AudioContentDetailActivity::class.java
).apply {
putExtra(Constants.EXTRA_AUDIO_CONTENT_ID, deepLinkValueId)
}
)
true
}
"channel" -> {
startActivity(
Intent(applicationContext, UserProfileActivity::class.java).apply {
putExtra(Constants.EXTRA_USER_ID, deepLinkValueId)
}
)
true
}
"live" -> {
viewModel.clickTab(MainViewModel.CurrentTab.LIVE)
handler.postDelayed({
liveFragment.enterLiveRoom(deepLinkValueId)
}, 500)
true
}
else -> false
}
}
private fun clearDeferredDeepLink() {
SharedPreferenceManager.marketingUtmSource = ""
SharedPreferenceManager.marketingUtmMedium = ""

View File

@@ -429,6 +429,15 @@
<string name="screen_live_room_end_message">End this live?\nChat history will not be saved and will disappear.\nParticipants will also be removed when the live ends.</string>
<string name="screen_live_room_exit_title">Leave live</string>
<string name="screen_live_room_exit_message">Leave this live room?</string>
<string name="screen_live_room_deeplink_move_title">Open deep link</string>
<string name="screen_live_room_deeplink_move_message">Close this page and move to %1$s?</string>
<string name="screen_live_room_deeplink_target_live_room">Live room page</string>
<string name="screen_live_room_deeplink_target_channel_profile">Channel profile page</string>
<string name="screen_live_room_deeplink_target_content_detail">Content detail page</string>
<string name="screen_live_room_deeplink_target_message">Message page</string>
<string name="screen_live_room_deeplink_target_series_detail">Series detail page</string>
<string name="screen_live_room_deeplink_target_audition">Audition page</string>
<string name="screen_live_room_deeplink_target_default">requested page</string>
<string name="screen_live_room_yes">Yes</string>
<string name="screen_live_room_no">No</string>
<string name="screen_live_room_request_speaker">Speaker request sent.\nwait a moment.</string>

View File

@@ -428,6 +428,15 @@
<string name="screen_live_room_end_message">ライブを終了しますか?\n終了するとチャット内容は保存されず消えます。\nリスナーもライブ終了と共に\n強制退出となります。</string>
<string name="screen_live_room_exit_title">ライブ退出</string>
<string name="screen_live_room_exit_message">ライブから退出しますか?</string>
<string name="screen_live_room_deeplink_move_title">ディープリンク移動</string>
<string name="screen_live_room_deeplink_move_message">現在のページを終了して%1$sへ移動しますか</string>
<string name="screen_live_room_deeplink_target_live_room">ライブルームページ</string>
<string name="screen_live_room_deeplink_target_channel_profile">チャンネルプロフィールページ</string>
<string name="screen_live_room_deeplink_target_content_detail">コンテンツ詳細ページ</string>
<string name="screen_live_room_deeplink_target_message">メッセージページ</string>
<string name="screen_live_room_deeplink_target_series_detail">シリーズ詳細ページ</string>
<string name="screen_live_room_deeplink_target_audition">オーディションページ</string>
<string name="screen_live_room_deeplink_target_default">リクエストされたページ</string>
<string name="screen_live_room_yes">はい</string>
<string name="screen_live_room_no">いいえ</string>
<string name="screen_live_room_request_speaker">スピーカーリクエストを送りました。\n少々お待ちください。</string>

View File

@@ -428,6 +428,15 @@
<string name="screen_live_room_end_message">라이브를 종료하시겠습니까?\n라이브를 종료하면 대화내용은\n저장되지 않고 사라집니다.\n참여자들 또한 라이브가 종료되어\n강제퇴장 됩니다.</string>
<string name="screen_live_room_exit_title">라이브 나가기</string>
<string name="screen_live_room_exit_message">라이브에서 나가시겠습니까?</string>
<string name="screen_live_room_deeplink_move_title">딥링크 이동</string>
<string name="screen_live_room_deeplink_move_message">현재 페이지를 종료하고 %1$s로 이동하시겠습니까?</string>
<string name="screen_live_room_deeplink_target_live_room">라이브룸 페이지</string>
<string name="screen_live_room_deeplink_target_channel_profile">채널 프로필 페이지</string>
<string name="screen_live_room_deeplink_target_content_detail">콘텐츠 상세 페이지</string>
<string name="screen_live_room_deeplink_target_message">메시지 페이지</string>
<string name="screen_live_room_deeplink_target_series_detail">시리즈 상세 페이지</string>
<string name="screen_live_room_deeplink_target_audition">오디션 페이지</string>
<string name="screen_live_room_deeplink_target_default">요청한 페이지</string>
<string name="screen_live_room_yes"></string>
<string name="screen_live_room_no">아니오</string>
<string name="screen_live_room_request_speaker">스피커 요청을 보냈습니다.\n잠시만 기다려 주세요.</string>