null
893c88d774
feat(auth): remove anonymous sign-in, add email verification flow (batch 0.3.0)
2026-06-21 21:18:30 -05:00
null
8f47593cf5
fix: user repository cleanup, settings VM, iOS app init + settings parity
2026-06-21 17:44:56 -05:00
null
6b50e84f60
fix: onboarding flow, settings screen polish, iOS settings parity
2026-06-21 17:37:14 -05:00
null
e2fd65f070
feat: security screen, theme polish, settings navigation, build config
2026-06-21 17:25:39 -05:00
null
b720f0cf14
feat: pending invite store, iOS subscription illustration, settings theme polish
2026-06-21 17:04:40 -05:00
null
b19fc0934c
feat: paywall illustrations, subscription polish, recovery store, settings cleanup
2026-06-21 16:27:55 -05:00
null
720b52a33b
chore: firebase config, gitignore updates, build tweaks
2026-06-21 16:07:19 -05:00
null
af70280daa
feat: E2EE recovery flow, iOS parity updates, onboarding + pairing polish
2026-06-21 11:20:48 -05:00
null
62d99505c9
feat: subscription screen with clear pricing, restore, cancel instructions
2026-06-21 09:54:59 -05:00
null
dff86eb089
feat: settings polish, privacy strings, home partner state, proguard rules
2026-06-21 09:49:02 -05:00
null
26419ce08d
feat: remove email invite screen, add accept-invite rate limiting, clean up iOS pairing (v0.2.2)
2026-06-21 08:55:43 -05:00
null
a5aad4f0bf
fix(outcomes): use AutoMirrored.TrendingUp to resolve icon import/type mismatch
2026-06-21 00:07:52 -05:00
null
b70463274f
fix(home): resolve OutcomeDay import for outcome dialogs
2026-06-21 00:03:02 -05:00
null
57a3e35359
feat(outcomes): add 30/60/90 day check-in flow with baseline + reminders
2026-06-20 23:59:24 -05:00
null
535c0ce668
feat(home): surface couple streak count on Home dashboard
2026-06-20 23:47:55 -05:00
null
bc3317c65a
feat(home): add "5-minute check-in" time budget framing to daily question card
2026-06-20 23:46:28 -05:00
null
2a1e5fad10
feat(functions): add createInviteCallable and tighten invite rules
2026-06-20 23:28:20 -05:00
null
8967fd23cd
fix(crypto): define single source of truth for encryptionVersion and document v0/v2 drift risk
...
- Add EncryptionVersion.kt with constants PLAINTEXT(0), MIGRATING(1), STRICT(2)
- Route CoupleEncryptionManager through the new constants and add explicit v2 branch
- Comment acceptInviteCallable.ts:91 explaining the version and sync contract
- Add TODO in iOS FirestoreService.swift warning that iOS MVP creates v0 couples
Fixes Risk #2 from review.md.
2026-06-20 22:29:43 -05:00
null
bdd2bf27c0
feat(settings): add appearance screen with theme picker, refactor settings nav
2026-06-20 18:45:44 -05:00
null
1f777e827d
feat: add onMessageWritten cloud function, notification settings screen, user repo cleanup
2026-06-20 18:25:05 -05:00
null
4dad0e774e
refactor: update crypto, invite flow, and account screen patterns
2026-06-20 18:09:46 -05:00
null
09a2480359
refactor(android): update question thread and answer mapping patterns
2026-06-20 18:02:21 -05:00
null
2a5cd28397
refactor(android): update question flow and navigation patterns (batch 6)
2026-06-20 17:17:51 -05:00
null
38aedab962
chore: update README, screenshots, answer data source cleanup (batch v1.0.21)
2026-06-20 02:01:42 -05:00
null
9c1fbf60a0
fix: reveal screen UX and rules hardening (batch v1.0.20)
2026-06-20 01:51:02 -05:00
null
737514d18f
fix: sealed reveal flow fixes (batch v1.0.19)
2026-06-20 01:40:24 -05:00
null
8de5990230
fix: add Tink dependency, release key cleanup, rules hardening (batch v1.0.17)
2026-06-20 01:10:20 -05:00
null
84eab1825b
feat: add thread sealed answers, release key cleanup, rules hardening (batch v1.0.16)
2026-06-20 00:41:48 -05:00
null
a3993d08df
feat: implement partner-proof sealed answers (batches 1-8)
...
- UserKeyManager: per-user keypair stored in Android Keystore
- SealedAnswerEncryptor: one-time answer key, sealed:v1 ciphertext
- PendingAnswerKeyStore: local EncryptedSharedPreferences storage
- ReleaseKeyEncryptor: keybox:v1 encrypted to recipient public key
- SealedRevealManager: full reveal flow with mutual key release
- AnswerCommitment: SHA-256 commitment hash over canonical payload
- FirestoreDeviceKeyDataSource: public key CRUD
- FirestoreReleaseKeyDataSource: release key CRUD
- FirestoreAnswerDataSource: sealed answer writes with schemaVersion=3
- FirestoreCollections: sealed answer and release key paths
- firestore.rules: ownership, immutability, timing, prefix enforcement
- HomeViewModel: sealed answer state integration
- AnswerRevealScreen/ViewModel: sealed reveal flow with UX states
- CloserApp: initialize UserKeyManager on startup
- LocalAnswer model: schemaVersion field
- Unit tests: SealedAnswerEncryptor, ReleaseKeyEncryptor, AnswerCommitment
- Crypto test vectors: docs/crypto/sealed-answer-test-vectors.json
- .gitignore: add partner-proof build plan
2026-06-20 00:23:58 -05:00
null
521989ec44
fix: remove duplicate comparison in StreakCalculator (batch v1.0.14)
2026-06-19 23:53:50 -05:00
null
195dfb5a0a
refactor: replace PendingActionCard.action lambda with HomeActionTarget (batch v1.0.13)
...
- PendingActionCard now uses target enum instead of lambda
- HomeScreen routes pending actions through toActionHandler
- Remove onPendingAction callback, simplify HomeCallbacks
- Fix WeeklyRecapGenerator filter logic (remove always-true || true)
2026-06-19 23:51:47 -05:00
null
0e75b3b536
feat: add gentle reminder callable and wire into HomeViewModel (batch v1.0.12)
...
- GENTLE_REMINDER notification type with warm copy
- sendGentleReminderCallable Cloud Function
- HomeViewModel.sendGentleReminder() calls function, shows snackbar
- Snackbar event consumed after display
2026-06-19 23:47:01 -05:00
null
7dc14af627
feat: wire retention signals into HomeViewModel (batch v1.0.11)
...
- Replace TODO placeholders with real data source calls
- Add hasWaitingGame, hasActiveChallenge, hasUpcomingDatePlan, hasUnlockedCapsule, weeklyRecapReady
- Parallel async fetches in loadHome(), failures default to false
- FirestoreCapsuleDataSource.getCapsules() for capsule status checks
2026-06-19 23:42:54 -05:00
null
89213445b9
fix: add coEvery import and re-set settings flow in PartnerNotificationManagerTest (batch v1.0.10)
2026-06-19 22:52:27 -05:00
null
fa501089f2
test: add unit tests for retention features (batch v1.0.10)
...
- PartnerNotificationManagerTest: notification creation, type mapping, deep links
- build.gradle.kts: enable Robolectric and default return values for unit tests
- AppRoute: fix NPE in asRouteArg when android.net.Uri is stubbed on test classpath
2026-06-19 22:51:08 -05:00
null
5698e5436a
feat: add memory capsule generator for saving meaningful moments (batch v1.0.9)
2026-06-19 22:47:36 -05:00
null
a500b86621
chore: update UI copy to match retention tone guidelines (batch v1.0.9)
2026-06-19 22:46:07 -05:00
null
3575af1b6f
feat: add date suggestion engine for date planning loop (batch v1.0.8)
2026-06-19 22:44:33 -05:00
null
9db3c35f8d
feat: add follow-up prompts after reveals (batch v1.0.7)
2026-06-19 22:43:40 -05:00
null
9040b97eb2
feat: add challenge loop state machine with 6 states and copy (batch v1.0.6)
...
- ChallengeState data model with 6 states: not started, started, waiting, both complete, missed, complete
- ChallengeStateMachine: pure Kotlin, configurable missed-day behavior
- 12 unit tests covering all states and edge cases
- Fix pre-existing missing import in AnswerRevealViewModel
2026-06-19 22:41:43 -05:00
null
b1b35891c9
feat: add HomePriorityEngine and weekly recap generator (batch v1.0.5)
...
- HomePriorityEngine: 13-level priority system, primary + secondary CTA
- HomeScreen: add onNavigate to HomeContent, fix compile error
- WeeklyRecapGenerator: pure logic, counts, favorite category, suggested pack
- Privacy: hidden answers excluded from recap counts
- Unit tests for both engine and recap generator
2026-06-19 22:37:47 -05:00
null
935aee5ec5
feat: add partner-trigger notifications with rate limits and quiet hours (batch v1.0.4)
...
- PartnerNotificationManager: 6 notification types, static copy only
- NotificationRateLimiter: max 2 partner/day, 1 reminder/day, 4/week
- QuietHoursManager: default 10pm-8am, user-configurable
- NotificationChannelSetup: partner-actions channel (HIGH importance)
- PartnerNotificationScheduler: routes FCM events through manager
- AppMessagingService: safe static copy, drops unknown types
- Deep link navigation for all notification targets
- 3 test files covering quiet hours, rate limits, notification types
2026-06-19 22:34:42 -05:00
null
9828e73171
feat: add 'Waiting for you' unfinished business dashboard (batch v1.0.3)
...
- PendingActionCard data class with priority-ordered cards
- 6 card types: reveal ready, partner answered, game, challenge, date, capsule
- Max 3 cards, highest priority first, deep link to correct screen
- Placeholder guards for game/challenge/date/capsule (wired in later batches)
- Compact cards with purple/pink palette, no private text leaked
2026-06-19 22:31:11 -05:00
null
c38e83b8ee
feat: add streak calculator with couple/personal/weekly streaks and repair (batch v1.0.2)
...
- Streak data models: Couple, Personal, WeeklyRhythm streaks
- StreakCalculator: pure Kotlin, no Android deps, deterministic
- Milestone copy at 1/3/7/14/30 days
- Streak repair: 1 missed day per 7-day window, requires both partners
- 23 unit tests covering all streak types, milestones, repair, timezone
2026-06-19 22:25:47 -05:00
null
0b619ee7ba
feat: improve daily question habit loop with 5 UI states (batch v1.0.1)
...
- Add DailyQuestionState enum to HomeViewModel with 5 states
- Real-time Firestore listener for partner's daily answer
- Home card shows correct copy/CTA per state
- CTAs: answer, gentle reminder (no-op), reveal, follow-up (placeholder)
- Cleanup listener on onCleared()
2026-06-19 22:23:24 -05:00
null
aff1150295
feat: add retention events and analytics wrapper (batch v1.0.0)
...
- RetentionEvent sealed class with 19 event types (metadata only, no answer text)
- RetentionAnalytics interface + LogcatRetentionAnalytics (debug-only, hashed IDs)
- NoopRetentionAnalytics for tests/disabled state
- Hilt AnalyticsModule binding as singleton
- Couple IDs SHA-256 hashed before logging
2026-06-19 22:20:49 -05:00
null
700201bbd6
refactor: extract EncryptedSharedPreferences into SecurePreferencesFactory with auto-recovery (batch v0.2.21)
...
- New SecurePreferencesFactory handles EncryptedSharedPreferences creation
- Auto-resets and recreates on corruption (unreadable prefs)
- CoupleKeyStore and SharedPreferencesLocalAnswerRepository use the factory
- Removes duplicated EncryptedSharedPreferences boilerplate
2026-06-19 22:06:52 -05:00
null
c31177d52b
chore: remove dead invite code after Cloud Function migration (batch v0.2.19)
...
- Remove unused markAccepted from InviteRepository/Impl
- Remove unused loadedInvite field from InviteConfirmViewModel
- Fix deprecated getHttpsCallable result access
- Remove unused SetOptions import
2026-06-19 21:50:29 -05:00
null
39255c8733
fix: prevent invite code enumeration via Cloud Function (batch v0.2.18)
...
- Remove client-side read access to invites (only inviter can read own invite)
- Deny direct client update to invites (server-side only via Admin SDK)
- Add acceptInviteCallable Cloud Function: validates code, creates couple,
updates user docs, marks invite accepted, returns wrapped key for local decryption
- Update Android client: FirestoreInviteDataSource calls callable function,
InviteConfirmViewModel uses acceptInvite + unwrapAndStore flow
- Deprecate CoupleRepositoryImpl.createCouple (client-side path removed)
- Update Firestore rules tests: unpaired read now denied, direct update now denied
- 118/118 tests passing
2026-06-19 21:46:12 -05:00
null
2e2c79be3d
fix: remove android.util.Base64 from RecoveryKeyManager for portability (batch v0.2.16)
...
- Replace android.util.Base64 with java.util.Base64 in RecoveryKeyManager
- Crypto layer now has zero Android SDK dependencies — portable to iOS/shared testing
2026-06-19 21:26:35 -05:00