📖 Przegląd

ReviewTrap to kompletny moduł do zbierania ocen i feedbacku:

Szybki przykład
// Prosty prompt
ADict.ReviewTrap.prompt(activity) { event ->
    when (event) {
        is ReviewTrap.Event.LikedYes -> { /* In-App Review */ }
        is ReviewTrap.Event.DislikedNo -> { /* Feedback */ }
        is ReviewTrap.Event.Completed -> { }
    }
}

// Smart prompt z warunkami
ADict.ReviewTrap.smartPrompt(
    activity = this,
    config = ReviewTrap.SmartConfig(
        strategy = ReviewTrap.Strategy.AfterSessions(5),
        maxPrompts = 3
    )
) { shown ->
    if (!shown) Log.d("Review", "Warunki nie spełnione")
}

🔄 Flow

💡 Jak to działa:
  1. Wyświetl dialog: "Czy podoba Ci się nasza aplikacja?"
  2. Jeśli TAK → Google In-App Review API
  3. Jeśli NIE → Callback (możesz pokazać feedback form)

📚 API

show(activity: Activity, callback: (Event) -> Unit)

Pokaż dialog prośby o ocenę.

showDirectReview(activity: Activity)

Pokaż bezpośrednio Google In-App Review (bez wstępnego dialogu).

configure(config: Config)

Skonfiguruj teksty dialogu.

Config

PropertyDomyślnie
title"Podoba Ci się nasza aplikacja?"
positiveButton"Tak, lubię!"
negativeButton"Nie za bardzo"

📦 Events

enum class Event

  • LikedYesUżytkownik lubi aplikację, In-App Review pokazany
  • DislikedNoUżytkownik nie lubi
  • DismissedDialog zamknięty bez odpowiedzi
  • ReviewCompletedIn-App Review zakończony
  • ReviewFailedIn-App Review nie udał się

💡 Przykłady

Pełna obsługa
// Konfiguracja tekstów
ADict.ReviewTrap.configure(
    ReviewTrap.Config(
        title = "Czy podoba Ci się MyApp?",
        positiveButton = "Tak, super!",
        negativeButton = "Mogłoby być lepiej"
    )
)

// Pokazanie
fun showRatingPrompt() {
    ADict.ReviewTrap.show(activity) { event ->
        when (event) {
            ReviewTrap.Event.LikedYes -> {
                ADict.Analytics.log("review_trap_liked")
                // In-App Review automatycznie
            }
            ReviewTrap.Event.DislikedNo -> {
                ADict.Analytics.log("review_trap_disliked")
                // Pokaż formularz feedbacku
                ADict.ReviewTrap.show(activity) { feedback ->
                    sendFeedbackToServer(feedback)
                }
            }
            ReviewTrap.Event.ReviewCompleted -> {
                ADict.Analytics.log("in_app_review_completed")
            }
            ReviewTrap.Event.Dismissed -> {
                ADict.Analytics.log("review_trap_dismissed")
            }
            else -> { }
        }
    }
}

⚠️ Uwagi

Google In-App Review:
  • Nie masz kontroli czy dialog zostanie pokazany (Google decyduje)
  • Nie dostajesz informacji o wyniku oceny
  • Quota - Google limituje częstotliwość
  • Testowanie wymaga pobrania z Google Play (Internal Testing)

🧠 Smart Rating

Smart Rating pozwala inteligentnie decydować kiedy pytać o ocenę.

Smart Prompt
// Inteligentne pytanie - sprawdza warunki przed wyświetleniem
ADict.ReviewTrap.smartPrompt(
    activity = this,
    config = SmartConfig(
        strategy = Strategy.Combined(listOf(
            Strategy.AfterSessions(5),    // Po 5 sesjach
            Strategy.AfterDays(7)          // I po 7 dniach
        )),
        maxPrompts = 3,                    // Max 3 razy pytaj
        minIntervalMs = TimeUnit.DAYS.toMillis(30)  // Min 30 dni między
    )
) { shown ->
    if (shown) analytics.log("review_prompt_shown")
}

Strategie

// Po X sesjach
Strategy.AfterSessions(minSessions = 5)

// Po X dniach od instalacji
Strategy.AfterDays(minDays = 7)

// Po X pozytywnych akcjach
Strategy.AfterPositiveActions(minActions = 10)

// Kombinacja (wszystkie warunki)
Strategy.Combined(listOf(
    Strategy.AfterSessions(5),
    Strategy.AfterDays(7)
))

// Dowolny z warunków
Strategy.AnyOf(listOf(
    Strategy.AfterDays(14),
    Strategy.AfterPositiveActions(20)
))

// Custom logika
Strategy.Custom { checkMyCondition() }

Śledzenie akcji

// Śledź pozytywne akcje użytkownika (zakup, ukończenie poziomu)
ADict.ReviewTrap.trackPositiveAction()

// Sprawdź statystyki
val sessions = ADict.ReviewTrap.getSessionCount()
val hasRated = ADict.ReviewTrap.hasRated()

🔗 Integracja z FeedbackManager

ReviewTrap może używać zaawansowanego formularza feedbacku dla niezadowolonych użytkowników.

Prompt z formularzem feedbacku
// Prosty prompt z formularzem feedbacku
ADict.ReviewTrap.promptWithFeedback(
    activity = this,
    feedbackEmail = "support@myapp.com",
    showRating = true,       // Pokaż gwiazdki
    showBugReport = true     // Checkbox "zgłoszenie błędu"
) { event ->
    when (event) {
        is ReviewTrap.Event.FeedbackSendChosen ->
            analytics.log("feedback_sent")
        is ReviewTrap.Event.InAppReviewLaunched ->
            analytics.log("review_shown")
    }
}
Smart prompt z feedbackiem
ADict.ReviewTrap.smartPromptWithFeedback(
    activity = this,
    config = SmartConfig(
        strategy = Strategy.AfterSessions(5)
    ),
    feedbackEmail = "support@myapp.com",
    showRating = true
) { shown ->
    Log.d("Review", "Prompt shown: $shown")
}
Custom callback do wysyłki
ADict.ReviewTrap.promptWithFeedback(
    activity = this,
    feedbackEmail = "support@myapp.com",
    onFeedbackSubmit = { rating, comment, isBugReport ->
        // Wyślij do swojego backendu
        api.sendFeedback(rating, comment, isBugReport)
    }
)
Z pełnym survey
ADict.ReviewTrap.promptWithSurvey(
    activity = this,
    onDisliked = {
        // Użytkownik nie lubi - pokaż survey
        ADict.ReviewTrap.showSurvey(activity, "dissatisfied") {
            title("Pomóż nam się poprawić")
            ratingQuestion("Jak oceniasz aplikację?")
            textQuestion("Co możemy poprawić?")
            onComplete { responses ->
                sendToAnalytics(responses)
            }
        }
    }
)

📋 Survey (Ankiety)

Twórz wielopytaniowe ankiety z różnymi typami pytań.

Prosta ankieta
ADict.ReviewTrap.showSurvey(activity, "satisfaction") {
    title("Ankieta satysfakcji")

    ratingQuestion("Jak oceniasz aplikację?")
    textQuestion("Co możemy poprawić?", required = false)
    yesNoQuestion("Polecisz nas znajomym?")

    onComplete { responses ->
        responses.forEach { r ->
            Log.d("Survey", "${r.questionText}: ${r.value}")
        }
    }
}
Ankieta z wyborem
ADict.ReviewTrap.showSurvey(activity, "features") {
    title("Która funkcja jest najważniejsza?")

    singleChoice(
        "Wybierz jedną:",
        listOf("Wygląd", "Szybkość", "Funkcje", "Cena")
    )

    multiChoice(
        "Co chciałbyś zobaczyć?",
        listOf("Tryb ciemny", "Offline", "Więcej języków")
    )

    onComplete { responses -> sendToBackend(responses) }
    onCancel { Log.d("Survey", "Anulowano") }
}

Typy pytań

MetodaTypOpis
ratingQuestion()1-5 ⭐Gwiazdki
textQuestion()StringPole tekstowe
yesNoQuestion()BooleanTak/Nie
singleChoice()StringJeden wybór
multiChoice()ListWielokrotny wybór

🐛 Bug Report

Dialog zgłaszania błędów ze screenshotem i informacjami o urządzeniu.

ADict.ReviewTrap.showBugReport(
    activity = this,
    email = "bugs@myapp.com",
    includeScreenshot = true,
    includeDeviceInfo = true
) { report ->
    // Własna obsługa
    Log.d("Bug", "Title: ${report.title}")
    Log.d("Bug", "Description: ${report.description}")
    Log.d("Bug", "Device: ${report.deviceInfo?.model}")
}

😀 Quick Feedback (Emoji)

Szybki feedback za pomocą emoji.

ADict.ReviewTrap.showQuickFeedback(
    activity = this,
    question = "Jak oceniasz tę funkcję?"
) { emoji, sentiment ->
    // sentiment: 1=😡, 2=😕, 3=😐, 4=🙂, 5=😍
    analytics.log("quick_feedback", sentiment)
}

⭐ Rating Dialog

Prosty dialog z gwiazdkami i komentarzem.

ADict.ReviewTrap.showRatingDialog(
    activity = this,
    title = "Oceń nas!",
    message = "Jak podoba Ci się aplikacja?"
) { rating, comment ->
    sendFeedback(rating, comment)
}