pid를 심어놓은 광고를 타고 들어온 경우 항상 AppLaunch 이벤트를 실행하는 코드 추가

This commit is contained in:
klaus 2025-03-26 16:37:49 +09:00
parent b50df2cdf3
commit 4d87544b7b
9 changed files with 61 additions and 3 deletions

View File

@ -71,6 +71,8 @@ class SodaLiveApp : Application() {
AppsFlyerLib.getInstance().subscribeForDeepLink { deepLinkResult -> AppsFlyerLib.getInstance().subscribeForDeepLink { deepLinkResult ->
when (deepLinkResult.status) { when (deepLinkResult.status) {
DeepLinkResult.Status.FOUND -> { DeepLinkResult.Status.FOUND -> {
SharedPreferenceManager.alreadyTrackingAppLaunch = false
val deepLink = deepLinkResult.deepLink val deepLink = deepLinkResult.deepLink
SharedPreferenceManager.marketingLinkValue = deepLink?.getStringValue( SharedPreferenceManager.marketingLinkValue = deepLink?.getStringValue(
"deep_link_value" "deep_link_value"

View File

@ -26,6 +26,7 @@ object Constants {
const val PREF_MARKETING_UTM_CAMPAIGN = "pref_marketing_utm_campaign" const val PREF_MARKETING_UTM_CAMPAIGN = "pref_marketing_utm_campaign"
const val PREF_MARKETING_LINK_VALUE = "pref_marketing_link_value" const val PREF_MARKETING_LINK_VALUE = "pref_marketing_link_value"
const val PREF_MARKETING_LINK_VALUE_ID = "pref_marketing_link_value_id" const val PREF_MARKETING_LINK_VALUE_ID = "pref_marketing_link_value_id"
const val PREF_ALREADY_TRACKING_APP_LAUNCH = "pref_already_tracking_app_launch"
const val EXTRA_CAN = "extra_can" const val EXTRA_CAN = "extra_can"
const val EXTRA_DATA = "extra_data" const val EXTRA_DATA = "extra_data"

View File

@ -210,4 +210,10 @@ object SharedPreferenceManager {
set(value) { set(value) {
sharedPreferences[Constants.PREF_MARKETING_LINK_VALUE_ID] = value sharedPreferences[Constants.PREF_MARKETING_LINK_VALUE_ID] = value
} }
var alreadyTrackingAppLaunch: Boolean
get() = sharedPreferences[Constants.PREF_ALREADY_TRACKING_APP_LAUNCH, true]
set(value) {
sharedPreferences[Constants.PREF_ALREADY_TRACKING_APP_LAUNCH] = value
}
} }

View File

@ -150,6 +150,8 @@ import kr.co.vividnext.sodalive.settings.signout.SignOutViewModel
import kr.co.vividnext.sodalive.settings.terms.TermsApi import kr.co.vividnext.sodalive.settings.terms.TermsApi
import kr.co.vividnext.sodalive.settings.terms.TermsRepository import kr.co.vividnext.sodalive.settings.terms.TermsRepository
import kr.co.vividnext.sodalive.settings.terms.TermsViewModel import kr.co.vividnext.sodalive.settings.terms.TermsViewModel
import kr.co.vividnext.sodalive.tracking.AdTrackingApi
import kr.co.vividnext.sodalive.tracking.AdTrackingRepository
import kr.co.vividnext.sodalive.user.UserApi import kr.co.vividnext.sodalive.user.UserApi
import kr.co.vividnext.sodalive.user.UserRepository import kr.co.vividnext.sodalive.user.UserRepository
import kr.co.vividnext.sodalive.user.UserViewModel import kr.co.vividnext.sodalive.user.UserViewModel
@ -226,6 +228,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
single { ApiBuilder().build(get(), CategoryApi::class.java) } single { ApiBuilder().build(get(), CategoryApi::class.java) }
single { ApiBuilder().build(get(), PlaylistApi::class.java) } single { ApiBuilder().build(get(), PlaylistApi::class.java) }
single { ApiBuilder().build(get(), AuditionApi::class.java) } single { ApiBuilder().build(get(), AuditionApi::class.java) }
single { ApiBuilder().build(get(), AdTrackingApi::class.java) }
} }
private val viewModelModule = module { private val viewModelModule = module {
@ -233,7 +236,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
viewModel { SignUpViewModel(get()) } viewModel { SignUpViewModel(get()) }
viewModel { TermsViewModel(get()) } viewModel { TermsViewModel(get()) }
viewModel { FindPasswordViewModel(get()) } viewModel { FindPasswordViewModel(get()) }
viewModel { MainViewModel(get(), get(), get(), get()) } viewModel { MainViewModel(get(), get(), get(), get(), get()) }
viewModel { LiveViewModel(get(), get(), get(), get()) } viewModel { LiveViewModel(get(), get(), get(), get()) }
viewModel { MyPageViewModel(get(), get()) } viewModel { MyPageViewModel(get(), get()) }
viewModel { CanStatusViewModel(get()) } viewModel { CanStatusViewModel(get()) }
@ -359,6 +362,7 @@ class AppDI(private val context: Context, isDebugMode: Boolean) {
factory { AudioContentMainTabReplayRepository(get()) } factory { AudioContentMainTabReplayRepository(get()) }
factory { AudioContentMainTabFreeRepository(get()) } factory { AudioContentMainTabFreeRepository(get()) }
factory { OriginalAudioDramaContentAllRepository(get()) } factory { OriginalAudioDramaContentAllRepository(get()) }
factory { AdTrackingRepository(get()) }
} }
private val moduleList = listOf( private val moduleList = listOf(

View File

@ -202,6 +202,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
checkPermissions() checkPermissions()
handler.postDelayed({
val alreadyTrackingAppLaunch = SharedPreferenceManager.alreadyTrackingAppLaunch
val pid = SharedPreferenceManager.marketingPid
if (!alreadyTrackingAppLaunch && pid.isNotBlank()) {
SharedPreferenceManager.alreadyTrackingAppLaunch = true
viewModel.adTrackingAppLaunch(pid = pid)
}
}, 1000)
if ( if (
SharedPreferenceManager.token.isNotBlank() && SharedPreferenceManager.token.isNotBlank() &&
SharedPreferenceManager.token.length > 10 SharedPreferenceManager.token.length > 10
@ -219,7 +229,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
deInitMiniPlayer() deInitMiniPlayer()
} }
handler.postDelayed({ executeDeeplink(intent) }, 500) handler.postDelayed({ executeDeeplink(intent) }, 1000)
} }
onBackPressedDispatcher.addCallback { onBackPressedDispatcher.addCallback {
@ -338,7 +348,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>(ActivityMainBinding::infl
val deepLinkValueId = SharedPreferenceManager.marketingLinkValueId val deepLinkValueId = SharedPreferenceManager.marketingLinkValueId
if (deepLinkValue.isNotBlank() && deepLinkValueId > 0) { if (deepLinkValue.isNotBlank() && deepLinkValueId > 0) {
updatePidAndGaid()
when (deepLinkValue) { when (deepLinkValue) {
"series" -> { "series" -> {
startActivity( startActivity(

View File

@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.common.SharedPreferenceManager
import kr.co.vividnext.sodalive.settings.event.EventItem import kr.co.vividnext.sodalive.settings.event.EventItem
import kr.co.vividnext.sodalive.settings.event.EventRepository import kr.co.vividnext.sodalive.settings.event.EventRepository
import kr.co.vividnext.sodalive.settings.notification.UpdateNotificationSettingRequest import kr.co.vividnext.sodalive.settings.notification.UpdateNotificationSettingRequest
import kr.co.vividnext.sodalive.tracking.AdTrackingRepository
import kr.co.vividnext.sodalive.tracking.FirebaseTracking import kr.co.vividnext.sodalive.tracking.FirebaseTracking
import kr.co.vividnext.sodalive.tracking.NotiflyClient import kr.co.vividnext.sodalive.tracking.NotiflyClient
import kr.co.vividnext.sodalive.user.UserRepository import kr.co.vividnext.sodalive.user.UserRepository
@ -27,6 +28,7 @@ import java.util.concurrent.Executors
class MainViewModel( class MainViewModel(
private val userRepository: UserRepository, private val userRepository: UserRepository,
private val eventRepository: EventRepository, private val eventRepository: EventRepository,
private val adTrackingRepository: AdTrackingRepository,
private val audioContentRepository: AudioContentRepository, private val audioContentRepository: AudioContentRepository,
private val playbackTrackingRepository: PlaybackTrackingRepository private val playbackTrackingRepository: PlaybackTrackingRepository
) : BaseViewModel() { ) : BaseViewModel() {
@ -222,4 +224,13 @@ class MainViewModel(
} }
} }
} }
fun adTrackingAppLaunch(pid: String) {
compositeDisposable.add(
adTrackingRepository.appLaunch(pid)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({}, {})
)
}
} }

View File

@ -0,0 +1,11 @@
package kr.co.vividnext.sodalive.tracking
import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.common.ApiResponse
import retrofit2.http.Body
import retrofit2.http.POST
interface AdTrackingApi {
@POST("/ad-tracking/app-launch")
fun appLaunch(@Body request: AdTrackingAppLaunchRequest): Single<ApiResponse<Any>>
}

View File

@ -0,0 +1,9 @@
package kr.co.vividnext.sodalive.tracking
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class AdTrackingAppLaunchRequest(
@SerializedName("pid") val pid: String
)

View File

@ -0,0 +1,5 @@
package kr.co.vividnext.sodalive.tracking
class AdTrackingRepository(private val api: AdTrackingApi) {
fun appLaunch(pid: String) = api.appLaunch(request = AdTrackingAppLaunchRequest(pid = pid))
}