📖 PrzeglądOverview
ReviewTrap to kompletny moduł do zbierania ocen i feedbacku:ReviewTrap is a complete module for collecting ratings and feedback:
- Smart Rating - inteligentne pytanie o ocenę z warunkamiSmart Rating - intelligent rating prompt with conditions
- In-App Review - Google Play In-App Review API
- Feedback - formularz feedbacku dla niezadowolonychFeedback - feedback form for dissatisfied users
- Survey - wielopytaniowe ankietySurvey - multi-question surveys
- Bug Report - zgłaszanie błędów ze screenshotemBug Report - reporting bugs with screenshot
- Quick Feedback - szybki feedback emojiQuick Feedback - quick emoji feedback
// 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
- Wyświetl dialog: "Czy podoba Ci się nasza aplikacja?"Show dialog: "Do you like our app?"
- Jeśli TAK → Google In-App Review APIIf YES → Google In-App Review API
- Jeśli NIE → Callback (możesz pokazać feedback form)If NO → Callback (you can show a feedback form)
📚 API
show(activity: Activity, callback: (Event) -> Unit)
Pokaż dialog prośby o ocenę.Show rating request dialog.
showDirectReview(activity: Activity)
Pokaż bezpośrednio Google In-App Review (bez wstępnego dialogu).Show Google In-App Review directly (without initial dialog).
configure(config: Config)
SkonfigurujConfigure teksty dialogu.
Config
| Property | DomyślnieDefault |
|---|---|
title | "Podoba Ci się nasza aplikacja?""Do you like our app?" |
positiveButton | "Tak, lubię!""Yes, I like it!" |
negativeButton | "Nie za bardzo""Not really" |
📦 Events
enum class Event
- LikedYesUżytkownikUser lubi aplikację, In-App Review pokazany
- DislikedNoUżytkownik nie lubiUser doesn't like
- DismissedDialog zamknięty bez odpowiedziDialog closed without response
- ReviewCompletedIn-App Review zakończonyIn-App Review completed
- ReviewFailedIn-App Review nie udał sięIn-App Review failed
💡 PrzykładyExamples
// 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 -> { }
}
}
}
⚠️ UwagiNotes
- Nie masz kontroli czy dialog zostanie pokazany (Google decyduje)You have no control whether the dialog is shown (Google decides)
- Nie dostajesz informacji o wyniku ocenyYou don't receive info about the rating result
- Quota - Google limituje częstotliwośćQuota - Google limits the frequency
- TestowanieTesting wymaga pobrania z Google Play (Internal Testing)
🧠 Smart Rating
Smart Rating pozwala inteligentnie decydowaćSmart Rating allows intelligent decision-making kiedy pytać o ocenę.when to ask for a rating.
// 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")
}
StrategieStrategies
// 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 akcjiAction Tracking
// Śledź pozytywne akcje użytkownika (zakup, ukończenie poziomu)
ADict.ReviewTrap.trackPositiveAction()
// Sprawdź statystyki
val sessions = ADict.ReviewTrap.getSessionCount()
val hasRated = ADict.ReviewTrap.hasRated()
🔗 IntegracjaIntegration z FeedbackManager
ReviewTrap może używać zaawansowanego formularza feedbacku dla niezadowolonych użytkowników.ReviewTrap can use an advanced feedback form for dissatisfied users.
// 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")
}
}
ADict.ReviewTrap.smartPromptWithFeedback(
activity = this,
config = SmartConfig(
strategy = Strategy.AfterSessions(5)
),
feedbackEmail = "support@myapp.com",
showRating = true
) { shown ->
Log.d("Review", "Prompt shown: $shown")
}
ADict.ReviewTrap.promptWithFeedback(
activity = this,
feedbackEmail = "support@myapp.com",
onFeedbackSubmit = { rating, comment, isBugReport ->
// Wyślij do swojego backendu
api.sendFeedback(rating, comment, isBugReport)
}
)
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ń.Create multi-question surveys with various question types.
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}")
}
}
}
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") }
}
TypyTypes pytań
| MetodaMethod | TypType | OpisDescription |
|---|---|---|
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)
}