ReviewTrap
Smart Rating • Feedback • Survey • Bug Report
📖 Przegląd
ReviewTrap to kompletny moduł do zbierania ocen i feedbacku:
- Smart Rating - inteligentne pytanie o ocenę z warunkami
- In-App Review - Google Play In-App Review API
- Feedback - formularz feedbacku dla niezadowolonych
- Survey - wielopytaniowe ankiety
- Bug Report - zgłaszanie błędów ze screenshotem
- Quick Feedback - szybki feedback emoji
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:
- Wyświetl dialog: "Czy podoba Ci się nasza aplikacja?"
- Jeśli TAK → Google In-App Review API
- 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
| Property | Domyś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ń
| Metoda | Typ | Opis |
|---|---|---|
ratingQuestion() | 1-5 ⭐ | Gwiazdki |
textQuestion() | String | Pole tekstowe |
yesNoQuestion() | Boolean | Tak/Nie |
singleChoice() | String | Jeden wybór |
multiChoice() | List | Wielokrotny 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)
}