null
95c3bc21fa
feat(dates): Firestore-backed date catalog + sponsored ideas
...
- DateIdea gains sponsored/sponsorName/externalUrl (native, clearly-labeled ads
— no tracking SDK).
- FirestoreDateIdeaDataSource reads the server-curated date_ideas collection
(defensive: malformed docs skipped, https-only externalUrl); DateMatchRepo
serves remote first, falling back to the shipped static seed when empty/failed
so the feature always has content. Fallback verified live (Date Match renders
the seed) + unit-tested (remote-present / empty / failure).
- Date card shows a "Sponsored · <name>" pill and a "Learn more" link (opened via
the system browser, https-only, no click IDs).
- Local admin seeder (functions/scripts/seedDateIdeas.ts + date_ideas_seed.json,
generated from the Kotlin seed + 1 sponsored example) — idempotent by id, has a
--dry-run; NOT a deployed endpoint. Verified: 38 docs upserted to the emulator,
1 sponsored, tsc builds.
Owner: run the seeder against prod (GOOGLE_APPLICATION_CREDENTIALS) to populate
date_ideas; add real sponsor content.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 21:02:22 -05:00
null
6ecc98eec2
feat(paywall): free-trial/intro pricing, gift framing, one-time SKUs
...
- PaywallPricing turns a RevenueCat Package into a headline price + an offer line
(free trial, intro price, or one-time), so a dashboard-configured trial or a
lifetime SKU renders without an app release; unknown shapes degrade to the
plain price. Pure formatting is unit-tested (PaywallPricingTest); the SDK
extraction is type-checked against purchases 8.20.
- Gift framing on the plan chooser ("One subscription covers you both — treat
your partner"): couple-shared premium already unlocks both partners, so this
is copy only, no billing change.
Live paywall (real offerings) still needs a real RC key + sandbox per
docs/SUBSCRIPTION_GO_LIVE.md (owner).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 20:53:15 -05:00
null
8464cb9219
feat(analytics): record specific notification type on push-opened
...
Foreground notification taps carried only app_route, so their
push_notification_opened event logged the generic "app_route" category. Also
put the notification type on the intent so the event records the specific kind
(partner_answered, reveal_ready, ...). Backgrounded taps already carry type via
the FCM data payload. Completes push-opened coverage across both tap paths.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 20:48:49 -05:00
null
368d8c455f
fix(streak): gentle day-based streak with a grace day + earlier milestones
...
The live couple streak used a raw 48h rule that reset on any 48h gap AND
inflated the count by incrementing on every answer (several a day counted
several times). Replace with StreakCalculator.nextCount: once per calendar day,
one forgiving grace day (a single missed day still continues), reset only after
2+ missed days; skip the redundant write on a same-day answer.
Celebration milestones now include the habit-building early tiers
(1/3/7/14/30/100/365), single-sourced from StreakCalculator so the count and the
celebration can't drift; the milestone dialog handles day 1 grammatically.
Tested (StreakCountTest): same-day idempotency, consecutive, grace, reset, and
partner timezone-skew (never breaks a same-boundary streak). Existing 24
StreakCalculator tests still pass.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 20:46:14 -05:00
null
f0a05f779b
feat(widget): Glance "Today" home-screen widget
...
Content-free daily-question state + streak, mirrored from HomeViewModel via a
dedicated DataStore (TodayWidgetUpdater -> TodayWidgetState). App-lock drops it
to a generic card so partner-activity state doesn't sit on the protected home
screen; signed-out/unpaired show neutral prompts. Tapping opens the daily
question via MainActivity's app_route extra.
Verified: provider registers, state bridge writes, headline logic unit-tested
(TodayWidgetTest), no crash on launch. On-home-screen render + a Remote Config
kill switch are tracked in Future.md.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 20:40:28 -05:00
null
55699e17ed
feat: security hardening, CI, analytics, invite deep links, solo mode, weekly recap
...
Roadmap phases 0-3.1 (see plan). Verified: unit tests, functions tests,
firestore rules 119/119, live emulator smokes.
Security + CI:
- Move App Check debug token out of committed build.gradle.kts to
local.properties (secret() resolver: local.properties -> -P -> env);
admin service-account key relocated outside the repo.
- Add GitHub Actions (android unit/scan/gitleaks, backend functions +
rules emulator via emulators:exec) with a CI google-services.json stub
and a reviewed .gitleaksignore baseline.
- Fix firestore rules tests to the current deployed contract (was 108/118,
now 119/119).
Analytics + consent:
- FirebaseRetentionAnalytics behind a fail-safe composite sink, single-
sourced hashing (AnalyticsHashing), Settings -> Privacy opt-out toggle
gating Firebase + the sink, and the ~11 missing event call sites.
- NoPlaintextInAnalyticsTest guards the content-free rule at build time.
Funnel:
- Invite deep links (https App Link + closer:// fallback), JoinLink parser,
PendingJoinCodeStore, prefilled/already-paired pairing, richer share text.
- Solo pre-pairing: UnpairedLockedCard on Play, SoloAnswerMigrator + consent
dialog moving pre-pairing answers into Couple Lore.
Weekly recap:
- WeeklyRecapScreen driven by the existing generator from local answer data,
Home card rewired, content-free shareable card.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-06 20:33:38 -05:00
null
f68cab5cf2
feat: signup flow, age gate, user model updates, how well screen, game prompt banner
2026-07-02 02:42:55 -05:00
null
24823a39f0
feat: question discussion components, conversation VM, wheel session, settings, text input limits
2026-07-01 21:39:00 -05:00
null
09fea873e2
fix: DateReflectionScreen and FirestoreDateReflectionDataSource updates
2026-07-01 20:01:01 -05:00
null
896bf26b28
feat: date reflection reveal, UI upgrade plan, seed updates, ime-scan script
2026-07-01 04:12:58 -05:00
null
222bbd1c57
chore(db): update seed database
2026-07-01 02:55:38 -05:00
null
31a2652e48
feat(art): add illustration_daily_reveal_ready (light + dark)
2026-07-01 02:55:20 -05:00
null
d03e071098
feat(home): escalate daily-question art by state (partner prompt → reveal ready)
2026-07-01 02:55:15 -05:00
null
6d0a52641c
feat(daily): rename modes to weekday theme names (Mood Check Monday, Tiny Win Tuesday, etc.)
2026-07-01 02:55:11 -05:00
null
611481786f
fix(home): update PairedHomePreview to BOTH_ANSWERED state
2026-07-01 02:19:35 -05:00
null
cbffaeca9f
test(settings): ChangePasswordViewModelTest — validation + typed exception mapping
2026-07-01 02:19:31 -05:00
null
e585856228
feat(nav): wire ChangePasswordScreen composable into AppNavigation
2026-07-01 02:19:26 -05:00
null
06c94f55f4
feat(nav): add CHANGE_PASSWORD route constant
2026-07-01 02:19:22 -05:00
null
a096ca15d1
feat(settings): add Change password row to SecurityScreen (email/password accounts only)
2026-07-01 02:19:18 -05:00
null
30000e7150
feat(settings): ChangePasswordScreen + ViewModel with validation and typed error mapping
2026-07-01 02:19:14 -05:00
null
7fe095ef3b
feat(auth): delegate changePassword in FirebaseAuthRepositoryImpl
2026-07-01 02:19:11 -05:00
null
54608796e1
feat(auth): add changePassword to AuthRepository interface
2026-07-01 02:19:04 -05:00
null
d1e23f24ee
feat(auth): wire changePassword with reauth + typed exceptions in FirebaseAuthDataSource
2026-07-01 02:19:01 -05:00
null
07eaf3c989
feat(auth): ChangePasswordException sealed class with typed failure reasons
2026-07-01 02:18:50 -05:00
null
7ff405cad6
feat(notifications): remove partner avatar from notifications (privacy)
2026-07-01 01:50:50 -05:00
null
f47fa3cdbd
test(auth): ForgotPasswordViewModelTest — typed exception + blank-email coverage
2026-07-01 01:50:46 -05:00
null
1a6cdaa078
feat(auth): enumeration-safe forgot-password confirmation copy
2026-07-01 01:50:40 -05:00
null
79bfea7cfb
feat(auth): use typed PasswordResetException in ForgotPasswordViewModel
2026-07-01 01:50:36 -05:00
null
885af0b9e4
feat(auth): wire typed PasswordResetException into FirebaseAuthDataSource
2026-07-01 01:50:32 -05:00
null
a1d2ea2db8
feat(auth): typed PasswordResetException sealed class
2026-07-01 01:50:27 -05:00
null
f117da16c8
test(home): 10 unit tests for computeDailyQuestionState
2026-07-01 00:21:42 -05:00
null
0feb72eaf0
feat(home): reveal-waiting art swap, copy polish, extracted computeDailyQuestionState
2026-07-01 00:21:33 -05:00
null
aa09566636
feat(backup): lock-less phrase reveal, copy-to-clipboard, partner-restore empty-state, manual helper entry (R24-d)
2026-06-30 21:24:52 -05:00
null
b78dc24870
feat(backup): add back button to restore screens (R24-d)
2026-06-30 21:24:36 -05:00
null
71227561e7
feat(backup): pass recovery phrase through RestoreManager fulfill/complete (R24-c)
2026-06-30 21:24:30 -05:00
null
209ad74532
feat(backup): add ckx:v1 keybox envelope for recovery phrase transfer (R24-c)
2026-06-30 21:24:26 -05:00
null
db948511fb
chore: add org.json:json:20240303 test dependency for BackupCodec round-trips
2026-06-30 20:43:30 -05:00
null
139a78c222
feat(backup): add RESTORE_REQUESTED and RESTORE_SELF_ALERT notification types
2026-06-30 20:43:18 -05:00
null
72c251ae95
feat(backup): wire opportunistic backup trigger into HomeViewModel.loadHome
2026-06-30 20:43:14 -05:00
null
fd854b635c
feat(backup): add RESTORE_REQUEST and RESTORE_CONSENT routes + navigation
2026-06-30 20:43:10 -05:00
null
df9edc1daf
feat(backup): add 'Ask your partner to restore' entry to RecoveryScreen
2026-06-30 20:43:06 -05:00
null
f161fa49a5
feat(backup): add RestoreViewModel + RestoreRequestScreen + RestoreConsentScreen (partner-assisted restore UI)
2026-06-30 20:43:02 -05:00
null
ed3c3e4d22
feat(backup): add RestoreManager (request/fulfill/complete partner-assisted restore with OOB code gate)
2026-06-30 20:42:58 -05:00
null
c8b0130f1c
feat(backup): add CoupleKeyTransfer (ECIES couple-key wrap + OOB verification code) and CoupleEncryptionManager export/store methods
2026-06-30 20:42:54 -05:00
null
4ac2c8f841
feat(backup): add BackupManager (incremental append + compaction) and BackupRestoreManager (download + decrypt + upsert)
2026-06-30 20:42:50 -05:00
null
f94fccfc61
feat(backup): wire ConversationCacheDatabase and DAO into DatabaseModule
2026-06-30 20:42:46 -05:00
null
ab59e7e5c9
feat(backup): add ConversationCache Room DB (entity, DAO, database)
2026-06-30 20:42:42 -05:00
null
230e7f6201
feat(backup): add uploadBackupSnapshot and deleteBackupSnapshot to FirebaseStorageDataSource
2026-06-30 20:42:38 -05:00
null
909d261b6c
feat(backup): add backup record reads to FirestoreConversationDataSource (getConversationsForBackup, getBackupRecords)
2026-06-30 20:42:34 -05:00
null
522823f739
feat(backup): add FirestoreBackupDataSource (manifest CAS, chunk append, snapshot compaction, restore requests)
2026-06-30 20:42:30 -05:00
null
14ba8f2b53
feat(backup): add BACKUP and RESTORE_REQUESTS collection constants to FirestoreCollections
2026-06-30 20:42:26 -05:00
null
7f8dac0b14
feat(backup): add BackupCodec (JSON codec for backup chunks, checksum, reactions)
2026-06-30 20:42:12 -05:00
null
6b469357c1
feat(backup): add ConversationBackup domain models (BackupMessageRecord, BackupCursor, BackupManifest, RestoreRequest)
2026-06-30 20:42:07 -05:00
null
02e7e6d5c3
test(daily-question): add ReconcileLocalAnswerTest for Room/Firestore desync guard
2026-06-30 19:06:14 -05:00
null
96274d68f9
fix(daily-question): wire reconcileLocalAnswerFromFirestore into HomeViewModel
2026-06-30 19:06:12 -05:00
null
6dd1451095
fix(daily-question): wire reconcileLocalAnswerFromFirestore into DailyQuestionViewModel
2026-06-30 19:06:01 -05:00
null
a6d3062585
fix(daily-question): add reconcileLocalAnswerFromFirestore to heal Room/Firestore desync
2026-06-30 19:05:59 -05:00
null
02c3180ee7
feat(date-memories): add illustration_date_memories_empty (light and dark)
2026-06-30 18:15:03 -05:00
null
097140bc9d
feat(date-memories): add glyph_date_replay vector drawable
2026-06-30 18:15:00 -05:00
null
aa5ebcbcac
feat(date-memories): add date_logged and date_reflection_* notification channels to PartnerNotificationManager
2026-06-30 18:14:39 -05:00
null
a96be6ea07
feat(date-memories): handle date_logged and date_reflection_* notification types in AppMessagingService
2026-06-30 18:14:27 -05:00
null
47f311abda
test(date-memories): add DATE_REFLECTION_PENDING priority engine tests
2026-06-30 18:14:25 -05:00
null
5375ba90a8
feat(date-memories): add date reflection nudge card to HomeScreen
2026-06-30 18:14:23 -05:00
null
c056f6a7a1
feat(date-memories): add date reflection pending computation to HomeViewModel
2026-06-30 18:14:21 -05:00
null
9b5f6b4eb3
feat(date-memories): add DATE_REFLECTION_PENDING priority to HomePriorityEngine
2026-06-30 18:14:18 -05:00
null
038c1bd6e6
feat(date-memories): wire DateMemoriesScreen and DateReflectionScreen into AppNavigation
2026-06-30 18:14:16 -05:00
null
9cd9cffe23
feat(date-memories): add dateReflection route to AppRoute
2026-06-30 18:14:14 -05:00
null
cf061f24f6
feat(date-memories): add date memory marking logic to DateMatchesViewModel
2026-06-30 18:14:12 -05:00
null
e4f10551a0
feat(date-memories): add 'We did this' and 'Date memories' entry to DateMatchesScreen
2026-06-30 18:14:10 -05:00
null
90995cdaef
feat(date-memories): add DateReflectionScreen and ViewModel
2026-06-30 18:14:08 -05:00
null
151e019a88
feat(date-memories): add DateMemoriesScreen and ViewModel
2026-06-30 18:14:03 -05:00
null
f81987fa94
feat(date-memories): add DATE_HISTORY and DATE_REFLECTIONS to FirestoreCollections
2026-06-30 18:14:00 -05:00
null
540ef29041
feat(date-memories): add FirestoreDateReflectionDataSource
2026-06-30 18:13:57 -05:00
null
631064fcfe
feat(date-memories): add FirestoreDateMemoryDataSource
2026-06-30 18:13:56 -05:00
null
de597f6238
feat(date-memories): add DateReflection domain model
2026-06-30 18:13:48 -05:00
null
9a92b2b020
feat(date-memories): add DateMemory domain model
2026-06-30 18:13:46 -05:00
null
28eb10f6c9
Revert "feat(date-memories): add DateMemory/DateReflection domain models and Firestore data sources (batch 1/8)"
...
This reverts commit 18ffdcdbaf .
2026-06-30 18:13:00 -05:00
null
6a0849deb7
Revert "feat(date-memories): add DateMemories timeline + DateReflection screen, wire into nav (batch 2/8)"
...
This reverts commit 15087df13b .
2026-06-30 18:13:00 -05:00
null
5905c2b2d0
Revert "feat(date-memories): add Home nudge for pending date reflection + priority engine (batch 3/8)"
...
This reverts commit 4ecb1560cb .
2026-06-30 18:13:00 -05:00
null
c19e7ea711
Revert "feat(date-memories): wire date_logged/date_reflection_* notification types into messaging service (batch 4/8)"
...
This reverts commit 8cfa367484 .
2026-06-30 18:13:00 -05:00
null
2119792cca
Revert "feat(date-memories): add glyph_date_replay + illustration_date_memories_empty assets (batch 7/8)"
...
This reverts commit 067155c108 .
2026-06-30 18:13:00 -05:00
null
067155c108
feat(date-memories): add glyph_date_replay + illustration_date_memories_empty assets (batch 7/8)
2026-06-30 16:52:04 -05:00
null
8cfa367484
feat(date-memories): wire date_logged/date_reflection_* notification types into messaging service (batch 4/8)
2026-06-30 16:51:57 -05:00
null
4ecb1560cb
feat(date-memories): add Home nudge for pending date reflection + priority engine (batch 3/8)
2026-06-30 16:51:55 -05:00
null
15087df13b
feat(date-memories): add DateMemories timeline + DateReflection screen, wire into nav (batch 2/8)
2026-06-30 16:51:52 -05:00
null
18ffdcdbaf
feat(date-memories): add DateMemory/DateReflection domain models and Firestore data sources (batch 1/8)
2026-06-30 16:51:50 -05:00
null
d87603211a
feat(activity): ActivityScreen timeline, HomeScreen activity feed, HomeViewModel wiring, PartnerNotificationManager, sendThinkingOfYouCallable Cloud Function
2026-06-30 03:54:01 -05:00
null
e74b6f59af
feat(cloud-functions): onEntitlementChanged, acceptInviteCallable, onGameSessionUpdate, onAnswerRevealed, onMessageWritten — FirestoreUserDataSource E2EE, AppMessagingService, EditProfileScreen, iOS plan
2026-06-30 02:38:31 -05:00
null
fb810a12aa
feat(profile): FirestoreUserDataSource E2EE read/write, EditProfileViewModel wiring, CoupleRepository/UserRepository updates, HomeViewModel polish
2026-06-30 02:18:10 -05:00
null
941f22cdbd
feat(home): HomePriorityEngine priority logic, HomeViewModel wiring, unit test coverage
2026-06-30 01:26:09 -05:00
null
2a5c40508e
feat(notifications): QuietHoursManager + NotificationSettingsScreen rewrite, Cloud Functions (streakReminder, quietHours, reengagement, gameRetention), UserRepository E2EE wiring, SettingsDataStore, firestore rules, wiring-scan
2026-06-30 00:38:06 -05:00
null
7b1443e578
feat(pairing): CreateInviteScreen invite-code UX, MainActivity nav wiring, LocalQuestionContent question pool expansion, Future.md planning
2026-06-29 21:44:26 -05:00
null
f6291e1f2e
feat(home): HomeScreen rewrite, HomePriorityEngine polish, CoupleRepository E2EE wiring, OutcomeCheckInDialog, YourProgress, MemoryLane, settings/pairing/paywall/play/wheel/question screens cleanup, brand illustrations, QA docs
2026-06-29 16:51:46 -05:00
null
912b8c8093
feat(onboarding): RecoveryKeyManager fix, OnboardingScreen polish, build.gradle bump, Future.md planning update
2026-06-29 13:01:08 -05:00
null
b5b8ad8df9
feat(games): GameSessionManager cleanup, QuestionSessionRepositoryImpl fixes, HomeViewModel game-state wiring, QA docs
2026-06-29 12:20:07 -05:00
null
b2dc96ca04
feat(games): GamePromptBanner UI + MessageBubbleOverlay polish, wheel bounce fix, GameCopy strings, QA coverage updates
2026-06-29 11:02:31 -05:00
null
f51a55743c
feat(games): partner game-session push orchestration — in-app notification banner, Firestore rules, Cloud Function, QA docs
2026-06-28 22:24:46 -05:00
null
0aaec3c10f
feat(android): portrait lock for MainActivity + ThisOrThat answer-select glow + QA report
2026-06-28 20:59:44 -05:00
null
403be3939c
feat(wheel): finish gate UX polish — bounced-back banner on unanswered prompts, screen-reader live region, ViewModel unit test
2026-06-28 19:54:31 -05:00
null
763ca0c7cb
feat(tools+docs): add androidTest deps for paired-CI vector harness; add SCHEMA_VERSION_DECISION + SPEC §19 pre-deploy checklist (iOS E2EE Batch 8)
2026-06-28 17:56:44 -05:00