chore(ads): DARO 광고 제거를 반영한다
This commit is contained in:
@@ -11,11 +11,9 @@ import androidx.lifecycle.ProcessLifecycleOwner
|
||||
import com.appsflyer.AppsFlyerLib
|
||||
import com.appsflyer.deeplink.DeepLinkResult
|
||||
import com.facebook.FacebookSdk
|
||||
import droom.daro.a.Daro
|
||||
import com.kakao.sdk.common.KakaoSdk
|
||||
import com.orhanobut.logger.AndroidLogAdapter
|
||||
import com.orhanobut.logger.Logger
|
||||
import droom.daro.SDKConfig
|
||||
import kr.co.vividnext.sodalive.BuildConfig
|
||||
import kr.co.vividnext.sodalive.R
|
||||
import kr.co.vividnext.sodalive.chat.talk.room.ChatRoomPreferenceManager
|
||||
@@ -54,8 +52,6 @@ class SodaLiveApp : Application(), DefaultLifecycleObserver {
|
||||
setupAppsFlyer()
|
||||
|
||||
setupNotifly()
|
||||
|
||||
setupDaro()
|
||||
}
|
||||
|
||||
private fun isDebuggable(): Boolean {
|
||||
@@ -141,16 +137,6 @@ class SodaLiveApp : Application(), DefaultLifecycleObserver {
|
||||
)
|
||||
}
|
||||
|
||||
private fun setupDaro() {
|
||||
Daro.init(
|
||||
application = this,
|
||||
sdkConfig = SDKConfig.Builder()
|
||||
.setDebugMode(BuildConfig.DEBUG && isDebuggable())
|
||||
.setAppMuted(false)
|
||||
.build()
|
||||
)
|
||||
}
|
||||
|
||||
override fun onStart(owner: LifecycleOwner) {
|
||||
super.onStart(owner)
|
||||
isAppInForeground = true
|
||||
|
||||
@@ -71,15 +71,6 @@ import com.bumptech.glide.request.target.Target
|
||||
import com.google.gson.Gson
|
||||
import com.orbitalsonic.waterwave.WaterWaveView
|
||||
import com.orhanobut.logger.Logger
|
||||
import droom.daro.core.adunit.DaroLightPopupAdUnit
|
||||
import droom.daro.core.listener.DaroLightPopupAdListener
|
||||
import droom.daro.core.listener.DaroLightPopupAdLoaderListener
|
||||
import droom.daro.core.model.DaroAdDisplayFailError
|
||||
import droom.daro.core.model.DaroAdInfo
|
||||
import droom.daro.core.model.DaroAdLoadError
|
||||
import droom.daro.core.model.DaroLightPopupAd
|
||||
import droom.daro.core.model.DaroLightPopupAdOptions
|
||||
import droom.daro.loader.DaroLightPopupAdLoader
|
||||
import io.agora.rtc2.ClientRoleOptions
|
||||
import io.agora.rtc2.IRtcEngineEventHandler
|
||||
import io.agora.rtm.LinkStateEvent
|
||||
@@ -176,11 +167,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
private lateinit var roomInfoEditDialog: LiveRoomInfoEditDialog
|
||||
private lateinit var roomUserProfileDialog: LiveRoomUserProfileDialog
|
||||
|
||||
private var daroLightPopupAdLoader: DaroLightPopupAdLoader? = null
|
||||
private var daroLightPopupAd: DaroLightPopupAd? = null
|
||||
private var hasRequestedDaroLightPopupEligibility = false
|
||||
private var hasAttemptedDaroLightPopup = false
|
||||
|
||||
private var isSpeakerMute = false
|
||||
private var isMicrophoneMute = false
|
||||
private var isSpeaker = false
|
||||
@@ -468,8 +454,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
override fun onDestroy() {
|
||||
// 액티비티 종료 전에 강제 음소거 상태를 원복한다.
|
||||
clearCapturePrivacyMuteState()
|
||||
clearDaroLightPopupLoader()
|
||||
clearDaroLightPopupAd()
|
||||
cropper.cleanup()
|
||||
hideKeyboard {
|
||||
viewModel.quitRoom(roomId) {
|
||||
@@ -1315,7 +1299,6 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
|
||||
isCaptureRecordingAvailable = response.isCaptureRecordingAvailable
|
||||
syncRoomRoleState(response)
|
||||
requestDaroLightPopupIfEligible()
|
||||
syncCaptureSecurityPolicy()
|
||||
binding.tvChatFreezeSwitch.visibility = if (isHost) {
|
||||
View.VISIBLE
|
||||
@@ -4293,111 +4276,9 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
)
|
||||
}
|
||||
|
||||
private fun requestDaroLightPopupIfEligible() {
|
||||
if (hasRequestedDaroLightPopupEligibility || isHost) {
|
||||
return
|
||||
}
|
||||
|
||||
hasRequestedDaroLightPopupEligibility = true
|
||||
|
||||
if (DARO_LIGHT_POPUP_AD_UNIT_KEY.isBlank()) {
|
||||
Logger.w("Daro light popup skipped because ad unit key is blank.")
|
||||
return
|
||||
}
|
||||
|
||||
viewModel.getRoomPriceForDaroLightPopup(roomId = roomId) { roomPrice ->
|
||||
val resolvedRoomPrice = roomPrice ?: return@getRoomPriceForDaroLightPopup
|
||||
if (
|
||||
!shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost = isHost,
|
||||
roomPrice = resolvedRoomPrice,
|
||||
hasAttemptedPopup = hasAttemptedDaroLightPopup
|
||||
)
|
||||
) {
|
||||
return@getRoomPriceForDaroLightPopup
|
||||
}
|
||||
|
||||
hasAttemptedDaroLightPopup = true
|
||||
loadDaroLightPopup()
|
||||
}
|
||||
}
|
||||
|
||||
private fun loadDaroLightPopup() {
|
||||
clearDaroLightPopupLoader()
|
||||
clearDaroLightPopupAd()
|
||||
|
||||
val adUnit = DaroLightPopupAdUnit(
|
||||
key = DARO_LIGHT_POPUP_AD_UNIT_KEY,
|
||||
placement = DARO_LIGHT_POPUP_PLACEMENT,
|
||||
options = DaroLightPopupAdOptions()
|
||||
)
|
||||
|
||||
daroLightPopupAdLoader = DaroLightPopupAdLoader(
|
||||
context = this,
|
||||
adUnit = adUnit
|
||||
).apply {
|
||||
setListener(object : DaroLightPopupAdLoaderListener {
|
||||
override fun onAdLoadSuccess(ad: DaroLightPopupAd, adInfo: DaroAdInfo) {
|
||||
if (isFinishing || isDestroyed) {
|
||||
ad.destroy()
|
||||
clearDaroLightPopupLoader()
|
||||
return
|
||||
}
|
||||
|
||||
daroLightPopupAd = ad
|
||||
ad.setListener(object : DaroLightPopupAdListener {
|
||||
override fun onAdImpression(adInfo: DaroAdInfo) = Unit
|
||||
|
||||
override fun onAdClicked(adInfo: DaroAdInfo) = Unit
|
||||
|
||||
override fun onShown(adInfo: DaroAdInfo) = Unit
|
||||
|
||||
override fun onFailedToShow(
|
||||
adInfo: DaroAdInfo,
|
||||
error: DaroAdDisplayFailError
|
||||
) {
|
||||
Logger.w(
|
||||
"Daro light popup failed to show. message=${error.message}"
|
||||
)
|
||||
clearDaroLightPopupLoader()
|
||||
clearDaroLightPopupAd()
|
||||
}
|
||||
|
||||
override fun onDismiss(adInfo: DaroAdInfo) {
|
||||
clearDaroLightPopupLoader()
|
||||
clearDaroLightPopupAd()
|
||||
}
|
||||
})
|
||||
ad.show(this@LiveRoomActivity)
|
||||
}
|
||||
|
||||
override fun onAdLoadFail(err: DaroAdLoadError) {
|
||||
Logger.w(
|
||||
"Daro light popup load failed. code=${err.code}, message=${err.message}"
|
||||
)
|
||||
clearDaroLightPopupLoader()
|
||||
}
|
||||
})
|
||||
load()
|
||||
}
|
||||
}
|
||||
|
||||
private fun clearDaroLightPopupLoader() {
|
||||
val adLoader = daroLightPopupAdLoader ?: return
|
||||
daroLightPopupAdLoader = null
|
||||
adLoader.destroy()
|
||||
}
|
||||
|
||||
private fun clearDaroLightPopupAd() {
|
||||
val ad = daroLightPopupAd ?: return
|
||||
daroLightPopupAd = null
|
||||
ad.destroy()
|
||||
}
|
||||
// endregion
|
||||
|
||||
companion object {
|
||||
private const val DARO_LIGHT_POPUP_AD_UNIT_KEY = "59082e9e-de1b-4f5d-bbc3-8b4124d110d8"
|
||||
private const val DARO_LIGHT_POPUP_PLACEMENT = "LiveRoomFreeListener"
|
||||
private const val NO_CHATTING_TIME = 180L
|
||||
var isForeground: Boolean = false
|
||||
}
|
||||
|
||||
@@ -1,9 +0,0 @@
|
||||
package kr.co.vividnext.sodalive.live.room
|
||||
|
||||
internal fun shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost: Boolean,
|
||||
roomPrice: Int,
|
||||
hasAttemptedPopup: Boolean
|
||||
): Boolean {
|
||||
return !isHost && roomPrice == 0 && !hasAttemptedPopup
|
||||
}
|
||||
@@ -296,28 +296,6 @@ class LiveRoomViewModel(
|
||||
)
|
||||
}
|
||||
|
||||
fun getRoomPriceForDaroLightPopup(roomId: Long, onResult: (Int?) -> Unit) {
|
||||
compositeDisposable.add(
|
||||
repository.getRoomDetail(roomId, token = "Bearer ${SharedPreferenceManager.token}")
|
||||
.subscribeOn(Schedulers.io())
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.subscribe(
|
||||
{
|
||||
if (it.success && it.data != null) {
|
||||
onResult(it.data.price)
|
||||
} else {
|
||||
Logger.w("Daro light popup room detail unavailable. roomId=$roomId")
|
||||
onResult(null)
|
||||
}
|
||||
},
|
||||
{ error ->
|
||||
Logger.e(error.message ?: "Daro light popup room detail request failed.")
|
||||
onResult(null)
|
||||
}
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
fun isEqualToHostId(memberId: Int): Boolean {
|
||||
return memberId == roomInfoResponse.creatorId.toInt()
|
||||
}
|
||||
|
||||
@@ -15,15 +15,6 @@ import androidx.recyclerview.widget.RecyclerView
|
||||
import coil.load
|
||||
import coil.transform.CircleCropTransformation
|
||||
import com.google.gson.Gson
|
||||
import com.orhanobut.logger.Logger
|
||||
import droom.daro.core.adunit.DaroBannerAdUnit
|
||||
import droom.daro.core.model.DaroAdInfo
|
||||
import droom.daro.core.model.DaroAdLoadError
|
||||
import droom.daro.core.model.DaroBannerSize
|
||||
import droom.daro.core.model.DaroViewAd
|
||||
import droom.daro.view.DaroAdViewListener
|
||||
import droom.daro.view.DaroBannerAdView
|
||||
import kr.co.vividnext.sodalive.BuildConfig
|
||||
import kr.co.vividnext.sodalive.R
|
||||
import kr.co.vividnext.sodalive.audio_content.box.AudioContentBoxActivity
|
||||
import kr.co.vividnext.sodalive.audio_content.detail.AudioContentDetailActivity
|
||||
@@ -66,9 +57,6 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
|
||||
|
||||
companion object {
|
||||
private const val FUNCTION_BUTTON_SPAN_COUNT = 4
|
||||
|
||||
private const val DARO_BANNER_AD_UNIT_KEY = "43df2529-31d8-45f8-a17d-1a760f5bc777"
|
||||
private const val DARO_BANNER_PLACEMENT = "MyPage"
|
||||
}
|
||||
|
||||
private val viewModel: MyPageViewModel by inject()
|
||||
@@ -76,7 +64,6 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
|
||||
|
||||
private lateinit var loadingDialog: LoadingDialog
|
||||
private val functionButtonAdapter = FunctionButtonAdapter()
|
||||
private var daroBannerAdView: DaroBannerAdView? = null
|
||||
|
||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||
super.onViewCreated(view, savedInstanceState)
|
||||
@@ -86,71 +73,6 @@ class MyPageFragment : BaseFragment<FragmentMyBinding>(FragmentMyBinding::inflat
|
||||
bindData()
|
||||
setupRecentContentSection()
|
||||
setupLatestNotice()
|
||||
setupDaroBottomBanner()
|
||||
}
|
||||
|
||||
override fun onDestroyView() {
|
||||
daroBannerAdView?.destroy()
|
||||
daroBannerAdView = null
|
||||
binding.flDaroBannerContainer.removeAllViews()
|
||||
super.onDestroyView()
|
||||
}
|
||||
|
||||
private fun setupDaroBottomBanner() {
|
||||
binding.flDaroBannerContainer.visibility = View.GONE
|
||||
binding.flDaroBannerContainer.removeAllViews()
|
||||
|
||||
val adUnit = DaroBannerAdUnit(
|
||||
key = DARO_BANNER_AD_UNIT_KEY,
|
||||
placement = DARO_BANNER_PLACEMENT,
|
||||
bannerSize = DaroBannerSize.Banner
|
||||
)
|
||||
|
||||
val adView = DaroBannerAdView(
|
||||
context = requireContext(),
|
||||
adUnit = adUnit
|
||||
).apply {
|
||||
setListener(object : DaroAdViewListener {
|
||||
override fun onAdImpression(adInfo: DaroAdInfo) = Unit
|
||||
|
||||
override fun onAdClicked(adInfo: DaroAdInfo) = Unit
|
||||
|
||||
override fun onAdLoadSuccess(ad: DaroViewAd, adInfo: DaroAdInfo) {
|
||||
binding.flDaroBannerContainer.visibility = View.VISIBLE
|
||||
}
|
||||
|
||||
override fun onAdLoadFail(err: DaroAdLoadError) {
|
||||
handleDaroBannerLoadFail(err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
daroBannerAdView = adView
|
||||
binding.flDaroBannerContainer.addView(adView)
|
||||
adView.loadAd()
|
||||
}
|
||||
|
||||
private fun handleDaroBannerLoadFail(err: DaroAdLoadError) {
|
||||
binding.flDaroBannerContainer.visibility = View.GONE
|
||||
|
||||
Logger.w(
|
||||
"Daro banner load failed. package=${BuildConfig.APPLICATION_ID}, placement=$DARO_BANNER_PLACEMENT"
|
||||
)
|
||||
Logger.w(
|
||||
"Daro banner load failed. code=${err.code}, message=${err.message}"
|
||||
)
|
||||
|
||||
if (err.message.contains("no fill", ignoreCase = true)) {
|
||||
Logger.w(
|
||||
"Daro no fill. Verify app-ads.txt, Live status, registered package=${BuildConfig.APPLICATION_ID}"
|
||||
)
|
||||
|
||||
if (BuildConfig.DEBUG && BuildConfig.APPLICATION_ID.endsWith(".debug")) {
|
||||
Logger.w(
|
||||
"Debug package differs from release. Register ${BuildConfig.APPLICATION_ID} in Daro or test release package."
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun setupLatestNotice() {
|
||||
|
||||
@@ -347,14 +347,6 @@
|
||||
android:paddingHorizontal="24dp" />
|
||||
</LinearLayout>
|
||||
|
||||
<!-- Daro bottom banner container -->
|
||||
<FrameLayout
|
||||
android:id="@+id/fl_daro_banner_container"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginHorizontal="24dp"
|
||||
android:layout_marginTop="32dp"
|
||||
android:visibility="gone" />
|
||||
</LinearLayout>
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
package kr.co.vividnext.sodalive.live.room
|
||||
|
||||
import org.junit.Assert.assertFalse
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
class LiveRoomDaroLightPopupPolicyTest {
|
||||
|
||||
@Test
|
||||
fun `비방장 무료 라이브에서 아직 시도하지 않았으면 라이트 팝업을 노출한다`() {
|
||||
assertTrue(
|
||||
shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost = false,
|
||||
roomPrice = 0,
|
||||
hasAttemptedPopup = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `방장이면 무료 라이브여도 라이트 팝업을 노출하지 않는다`() {
|
||||
assertFalse(
|
||||
shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost = true,
|
||||
roomPrice = 0,
|
||||
hasAttemptedPopup = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `유료 라이브면 비방장이어도 라이트 팝업을 노출하지 않는다`() {
|
||||
assertFalse(
|
||||
shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost = false,
|
||||
roomPrice = 100,
|
||||
hasAttemptedPopup = false
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun `이미 시도한 액티비티 인스턴스에서는 다시 노출하지 않는다`() {
|
||||
assertFalse(
|
||||
shouldAttemptLiveRoomDaroLightPopup(
|
||||
isHost = false,
|
||||
roomPrice = 0,
|
||||
hasAttemptedPopup = true
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user