📖 Przegląd

System callbacków pozwala reagować na zdarzenia reklamowe - sukces załadowania, błędy, kliknięcia itp. Możesz zarejestrować wiele callbacków z różnymi nazwami i przypisywać je do konkretnych slotów reklamowych.

📝 Interfejs AdCallback

Definicja interfejsu
interface AdCallback {
    fun onSuccess(
        type: String,      // "banner", "native", "interstitial", "rewarded"
        provider: String,  // "admob", "homeads", etc.
        zone: String?,     // nazwa strefy
        adUnit: String     // ID jednostki reklamowej
    )

    fun onFail(
        type: String,
        provider: String,
        zone: String?,
        adUnit: String,
        error: String?     // opis błędu
    )
}

🚀 Rejestracja callbacka

Podstawowe użycie
// Rejestracja callbacka z nazwą "default"
ADict.ADS.Callbacks.register("default", object : AdCallback {
    override fun onSuccess(type: String, provider: String, zone: String?, adUnit: String) {
        Log.d("Ad", "✅ Success: $type from $provider (zone=$zone)")

        // Możesz wysłać event do analityki
        ADict.Analytics.log("ad_loaded", mapOf(
            "type" to type,
            "provider" to provider,
            "zone" to zone
        ))
    }

    override fun onFail(type: String, provider: String, zone: String?, adUnit: String, error: String?) {
        Log.e("Ad", "❌ Fail: $type from $provider - $error")

        // Logowanie błędów
        ADict.Analytics.logError("ad_failed", error ?: "Unknown error")
    }
})

🔗 Przypisanie do slotu reklamowego

W XML (Banner)

AdViewContainer z callbackiem
<rip.nerd.adictlibrary.ui.AdViewContainer
    android:id="@+id/bannerAd"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:providerName="admob"
    app:zoneName="default"
    app:callbackName="default"
    app:adSizeEnum="adaptive" />

W kodzie (NativeAdRotator)

NativeAdRotator z callbackiem
nativeRotator = NativeAdRotator(
    context = requireContext(),
    zoneName = "feed",
    callbackName = "default"  // ← nazwa zarejestrowanego callbacka
)

nativeRotator.attach(binding.nativeContainer)
nativeRotator.start()

Fullscreen (Interstitial/Rewarded)

Fullscreen z callbackiem
lifecycleScope.launch {
    FullscreenRotator.showInterstitial(
        activity = this@MainActivity,
        zone = "default",
        callbackName = "default"  // ← callback
    )
}

🎯 Wiele callbacków

Możesz zarejestrować różne callbacki dla różnych celów:

Różne callbacki
// Callback dla analityki
ADict.ADS.Callbacks.register("analytics", object : AdCallback {
    override fun onSuccess(type: String, provider: String, zone: String?, adUnit: String) {
        Firebase.analytics.logEvent("ad_impression") {
            param("ad_type", type)
            param("ad_provider", provider)
        }
    }
    override fun onFail(type: String, provider: String, zone: String?, adUnit: String, error: String?) {
        Crashlytics.log("Ad failed: $type, $error")
    }
})

// Callback dla UI (np. pokazanie placeholdera przy błędzie)
ADict.ADS.Callbacks.register("ui_handler", object : AdCallback {
    override fun onSuccess(type: String, provider: String, zone: String?, adUnit: String) {
        // Ukryj placeholder
        binding.adPlaceholder.visibility = View.GONE
    }
    override fun onFail(type: String, provider: String, zone: String?, adUnit: String, error: String?) {
        // Pokaż placeholder lub ukryj kontener
        binding.adContainer.visibility = View.GONE
    }
})

// Callback dla debugowania (tylko w debug build)
if (BuildConfig.DEBUG) {
    ADict.ADS.Callbacks.register("debug", object : AdCallback {
        override fun onSuccess(type: String, provider: String, zone: String?, adUnit: String) {
            Toast.makeText(context, "Ad loaded: $type", Toast.LENGTH_SHORT).show()
        }
        override fun onFail(type: String, provider: String, zone: String?, adUnit: String, error: String?) {
            Toast.makeText(context, "Ad failed: $error", Toast.LENGTH_LONG).show()
        }
    })
}

🧹 Zarządzanie

register(name: String, callback: AdCallback)

Zarejestruj callback pod podaną nazwą.

unregister(name: String)

Wyrejestruj callback o podanej nazwie.

clear()

Usuń wszystkie zarejestrowane callbacki.

Przykład
// Wyrejestruj konkretny callback
ADict.ADS.Callbacks.unregister("debug")

// Wyczyść wszystkie (np. przy logout)
ADict.ADS.Callbacks.clear()

💡 Dobre praktyki

✅ Zalecenia: