import android.os.Bundle
import android.util.Log
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Button
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import net.adwhale.sdk.mediation.ads.AdWhaleMediationAds
import net.adwhale.sdk.mediation.ads.AdWhaleMediationInterstitialAd
import net.adwhale.sdk.mediation.ads.AdWhaleMediationInterstitialAdListener
import net.adwhale.sdk.utils.AdWhaleLog
class MainActivity : ComponentActivity() {
// Java 가이드와 동일하게 멤버 필드로 유지
private var adWhaleMediationInterstitialAd: AdWhaleMediationInterstitialAd? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Java 가이드와 동일: init + 로그 레벨 설정
AdWhaleMediationAds.init(this) { statusCode, message ->
AdWhaleLog.setLogLevel(AdWhaleLog.LogLevel.Verbose)
Log.i(MainActivity::class.java.simpleName, ".onInitComplete($statusCode, $message)")
}
val defaultPlacementUid = "발급받은 placement uid 값"
setContent {
MaterialTheme {
var placementUid by remember { mutableStateOf(defaultPlacementUid) }
InterstitialScreen(
placementUid = placementUid,
onPlacementUidChange = { placementUid = it },
onRequestAd = { requestInterstitialAd(placementUid) },
onShowAd = { showInterstitialAd() }
)
}
}
}
/**
* Java 가이드의 onCreate 내부 로직과 동일한 흐름:
* - AdWhaleMediationInterstitialAd 생성
* - Listener 설정
* - loadAd() 호출
*/
private fun requestInterstitialAd(placementUid: String) {
if (placementUid.isBlank()) {
Toast.makeText(applicationContext, "placementUid 를 입력하세요.", Toast.LENGTH_SHORT)
.show()
return
}
// 기존 객체 정리
adWhaleMediationInterstitialAd?.destroy()
adWhaleMediationInterstitialAd = null
// Java 가이드와 동일: 생성자에 placementUid 전달
val interstitialAd = AdWhaleMediationInterstitialAd(placementUid)
adWhaleMediationInterstitialAd = interstitialAd
// Java 가이드와 동일한 리스너 구성
interstitialAd.setAdWhaleMediationInterstitialAdListener(object :
AdWhaleMediationInterstitialAdListener {
@Override
override fun onAdLoaded() {
Log.i(MainActivity::class.java.simpleName, ".onAdLoaded()")
Toast.makeText(applicationContext, ".onAdLoaded()", Toast.LENGTH_SHORT).show()
}
@Override
override fun onAdLoadFailed(statusCode: Int, message: String) {
Log.e(MainActivity::class.java.simpleName, ".onAdLoadFailed($statusCode, $message)")
Toast.makeText(
applicationContext,
".onAdLoadFailed(statusCode:$statusCode, message:$message)",
Toast.LENGTH_SHORT
).show()
}
@Override
override fun onAdShowed() {
Log.i(MainActivity::class.java.simpleName, ".onAdShowed()")
Toast.makeText(applicationContext, ".onAdShowed()", Toast.LENGTH_SHORT).show()
}
@Override
override fun onAdShowFailed(statusCode: Int, message: String) {
Log.e(MainActivity::class.java.simpleName, ".onAdShowFailed($statusCode, $message)")
Toast.makeText(
applicationContext,
".onAdShowFailed(statusCode:$statusCode, message:$message)",
Toast.LENGTH_SHORT
).show()
}
@Override
override fun onAdClosed() {
Log.i(MainActivity::class.java.simpleName, ".onAdClosed()")
Toast.makeText(applicationContext, ".onAdClosed()", Toast.LENGTH_SHORT).show()
}
@Override
override fun onAdClicked() {
Log.i(MainActivity::class.java.simpleName, ".onAdClicked()")
// 필요시 Toast 추가 가능
}
})
// Java 가이드 동일: loadAd() 호출
interstitialAd.loadAd()
}
/**
* Java 가이드와 동일한 showAd() 흐름
*/
private fun showInterstitialAd() {
val interstitialAd = adWhaleMediationInterstitialAd
if (interstitialAd == null) {
Toast.makeText(applicationContext, "광고가 아직 로드되지 않았습니다.", Toast.LENGTH_SHORT).show()
return
}
interstitialAd.showAd()
}
/**
* 라이프사이클 onDestroy 콜백 시 반드시 destroy() 호출 필요 (Java 가이드 동일)
*/
override fun onDestroy() {
if (adWhaleMediationInterstitialAd != null) {
adWhaleMediationInterstitialAd?.destroy()
adWhaleMediationInterstitialAd = null
}
super.onDestroy()
}
}
/**
* 기존 activity_programmatic_interstitial_main.xml 을 Compose 로 옮긴 UI
*/
@Composable
fun InterstitialScreen(
placementUid: String,
onPlacementUidChange: (String) -> Unit,
onRequestAd: () -> Unit,
onShowAd: () -> Unit
) {
Column(
modifier = Modifier
.fillMaxSize()
.padding(20.dp),
horizontalAlignment = Alignment.Start
) {
Text(
text = "1. 테스트 전면광고 Placement Uid 입력:",
style = MaterialTheme.typography.titleMedium
)
Spacer(modifier = Modifier.height(12.dp))
OutlinedTextField(
value = placementUid,
onValueChange = onPlacementUidChange,
modifier = Modifier.fillMaxWidth(),
label = { Text("placementUid 입력") }
)
Spacer(modifier = Modifier.height(24.dp))
Button(
onClick = onRequestAd,
modifier = Modifier.align(Alignment.CenterHorizontally)
) {
Text(text = "테스트 전면광고 요청")
}
Spacer(modifier = Modifier.height(16.dp))
Button(
onClick = onShowAd,
modifier = Modifier.align(Alignment.CenterHorizontally)
) {
Text(text = "테스트 전면광고 표시")
}
}
}