From 2c3c2df8c4bb2f0f43c7b7c38efe2325069c4473 Mon Sep 17 00:00:00 2001 From: null Date: Thu, 9 Jul 2026 00:50:29 -0500 Subject: [PATCH] fix(copy): reconcile divergent premium benefit lists + drop inaccurate claim MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The paywall and subscription screens showed two different premium benefit lists (centralizing into CloserCopy surfaced the drift). Unified to a single CloserCopy.premiumBenefits used by both. Also an accuracy fix: dropped "Exportable memories" — it directly contradicts the app's own privacy copy ("Closer does not currently offer a data export", strings.xml privacy_no_export_body), i.e. a benefit the app explicitly does not provide. Remaining items are all verified real features (QuestionComposer, Connection Challenges, Desire Sync, Memory Lane, date planning, answer history). compileDebugKotlin clean; single source of truth for both surfaces going forward. Co-Authored-By: Claude Opus 4.8 --- .../java/app/closer/ui/brand/CloserCopy.kt | 37 ++++++++----------- .../app/closer/ui/paywall/PaywallScreen.kt | 2 +- .../closer/ui/settings/SubscriptionScreen.kt | 4 +- 3 files changed, 18 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/app/closer/ui/brand/CloserCopy.kt b/app/src/main/java/app/closer/ui/brand/CloserCopy.kt index c6f41565..7ff53892 100644 --- a/app/src/main/java/app/closer/ui/brand/CloserCopy.kt +++ b/app/src/main/java/app/closer/ui/brand/CloserCopy.kt @@ -19,6 +19,21 @@ object CloserCopy { /** Reused verbatim across the paywall and the subscription screen. */ const val whatsIncluded = "What's included" + /** + * The single premium benefits list — shown identically on the paywall and the subscription screen. + * Reconciled 2026-07-09 from two divergent lists; dropped "Exportable memories" because it + * contradicted the app's own "no data export" privacy statement (strings.xml `privacy_no_export_body`). + */ + val premiumBenefits = listOf( + "Unlimited questions every day", + "Every premium question pack", + "Connection Challenges and Desire Sync", + "Memory Lane time capsules", + "Date planning and bucket list", + "Custom questions and private notes", + "Full answer history and growth", + ) + object Paywall { const val headline = "Go deeper together" const val subhead = "Unlock everything Closer has built for couples." @@ -26,34 +41,12 @@ object CloserCopy { const val coupleShared = "One subscription covers you both — treat your partner." const val thankYouTitle = "You're all set" const val thankYouBody = "Thank you for supporting Closer." - - val benefits = listOf( - "Unlimited questions every day", - "Every premium question pack", - "Date planning and bucket list", - "Full answer history and growth", - "Custom questions and private notes", - "Exportable memories", - ) } object Subscription { const val upgradeHeadline = "Unlock Premium" const val premiumTitle = "You're Premium" const val coupleShared = "One subscription for both partners — no double billing." - - // NOTE (copy drift surfaced by centralizing): this benefit list diverges from - // [Paywall.benefits] — it swaps "Custom questions and private notes" + "Exportable - // memories" for "Connection Challenges and Desire Sync" + "Memory Lane time capsules", - // and reorders. Left verbatim on purpose; unify the two lists if that's a copy decision. - val benefits = listOf( - "Unlimited questions every day", - "Every premium question pack", - "Full answer history and growth", - "Date planning and bucket list", - "Connection Challenges and Desire Sync", - "Memory Lane time capsules", - ) } /** 18+ gate copy (O-AGE-001). Consolidated from SignUp + CreateProfile, where the min-age diff --git a/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt b/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt index 8886fccd..ddc89e3e 100644 --- a/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt +++ b/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt @@ -244,7 +244,7 @@ private fun BenefitsCard(modifier: Modifier = Modifier) { horizontalArrangement = Arrangement.spacedBy(8.dp), verticalArrangement = Arrangement.spacedBy(8.dp) ) { - CloserCopy.Paywall.benefits.forEach { benefit -> + CloserCopy.premiumBenefits.forEach { benefit -> BenefitPill(benefit) } } diff --git a/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt b/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt index f14e602c..deffee14 100644 --- a/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt @@ -234,7 +234,7 @@ private fun PremiumContent( style = MaterialTheme.typography.labelLarge.copy(fontWeight = FontWeight.SemiBold), color = MaterialTheme.colorScheme.onSurfaceVariant ) - CloserCopy.Subscription.benefits.forEach { benefit -> + CloserCopy.premiumBenefits.forEach { benefit -> Row( horizontalArrangement = Arrangement.spacedBy(10.dp), verticalAlignment = Alignment.CenterVertically @@ -335,7 +335,7 @@ private fun FreeContent( modifier = Modifier.padding(20.dp), verticalArrangement = Arrangement.spacedBy(12.dp) ) { - CloserCopy.Subscription.benefits.forEach { benefit -> + CloserCopy.premiumBenefits.forEach { benefit -> Row( horizontalArrangement = Arrangement.spacedBy(10.dp), verticalAlignment = Alignment.CenterVertically