null
a7b602de87
feat(chat): encrypted image messages, notification deep link routing, partner photo on home, rate limiter bump, chat bubble drag-to-dismiss
...
- FirestoreQuestionThreadDataSource: sendImageMessage encrypts bytes with couple key, uploads to Storage, stores URL in Firestore; loadDecryptedMedia downloads + decrypts
- QuestionMessage: type field (text/image), mediaUrl, isImage helper
- QuestionDiscussionThread: image picker (gallery + camera), encrypted image rendering with produceState, messenger-style avatars on consecutive bubbles
- QuestionThreadViewModel: sendImage, loadDecryptedMedia, dailyRevealed skip for already-revealed daily questions, partner photo loading
- MainActivity: deepLinkRouteFromIntent resolves FCM data extras to navigation routes; pendingDeepLink state for onNewIntent
- AppNavigation: LaunchedEffect waits for HOME route before navigating deep link (fixes race with onboarding)
- PartnerHomeScreen: partner photoUrl loaded and displayed in identity card
- NotificationRateLimiter: 20 partner/day, 100/week (was 2/4 — too tight for game activity)
- MessageBubbleOverlay: drag-to-dismiss zone at bottom, no auto-timeout (persists until read)
- ActiveThreadMonitor: dismisses bubble when entering conversation
- onMessageWritten: includes author name + photo URL in notification payload
- firestore.rules: messages create allows type=image with mediaUrl or type=text with ciphertext
- storage.rules: chat_media path with 15MB cap
- file_paths.xml: cache-path for camera capture
2026-06-24 15:18:41 -05:00
null
7d3b47b3ba
fix(firestore): handle Timestamp type for lastAnsweredAt/createdAt in Android + Cloud Function
2026-06-23 12:40:00 -05:00
null
658ead38cd
security: App Check enforcement on all callables, fail-closed device integrity, no raw code in logs; release signing config; iOS RevenueCat log level
2026-06-23 10:56:42 -05:00
null
5e16177eb2
feat: code push -- notifications, cloud functions, iOS updates
2026-06-22 08:53:23 -05:00
null
af70280daa
feat: E2EE recovery flow, iOS parity updates, onboarding + pairing polish
2026-06-21 11:20:48 -05:00
null
0a377ecdda
fix(accept-invite): dynamic encryptionVersion, Firestore TTL on attempt docs, wipe recoveryPhrase on accept
2026-06-21 09:13:29 -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
57a3e35359
feat(outcomes): add 30/60/90 day check-in flow with baseline + reminders
2026-06-20 23:59:24 -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
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
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
6828be72fc
feat: Cloud Functions — leaveCoupleCallable, onUserDelete cascade (batch v0.2.8)
...
- Add leaveCoupleCallable: HTTPS callable that atomically unlinks couple via Admin SDK (clears both user coupleIds, recursiveDelete couple doc)
- Add onUserDelete: Auth deletion trigger that cascades cleanup — unpairs partner, sends FCM notification, deletes Storage objects, recursiveDelete user doc
- Replace client-side batch leaveCouple with callable invocation (Firestore rules prevent cross-user writes)
- Remove CoupleRepository/UserRepository from DeleteAccountViewModel — cleanup now handled by onUserDelete trigger
- Wire new functions into index.ts exports
2026-06-19 20:04:18 -05:00
null
0e0a33a6dd
feat: add FCM game retention notification functions, messaging service updates, ThisOrThat screen fixes
2026-06-19 02:23:52 -05:00
null
2b8e05b29b
fix: address Neo review — fix cloud function partnerName scope, WheelCompleteScreen session ID, polling isActive, navigateTo reset
2026-06-18 01:28:43 -05:00
null
c0696cfb80
feat: partner leave notification, real-time couple state sync, in-app unpair alerts
2026-06-18 00:25:52 -05:00
null
eaac8ffcc9
feat: couple-scoped daily question, answer sync, partner notifications, and answer review
2026-06-18 00:18:05 -05:00
null
c816033e74
feat: cloud function for date match cleanup, ViewModel and repo improvements
2026-06-17 20:26:24 -05:00
null
ec315c63e0
feat: add App Integrity + device attestation modules
2026-06-17 19:37:19 -05:00
null
534bb076c7
feat: implement Ed25519 RevenueCat webhook signature verification
2026-06-17 19:08:53 -05:00
null
f3bad90ec6
feat(notifications): FCM token registration, quiet hours, notification permission helper, reminder Cloud Functions (batch 11)
2026-06-17 01:30:04 -05:00
null
b9ad713ddb
feat(billing): server-side entitlement sync — RevenueCat webhook handler, entitlement logic, Firestore EntitlementChecker, Hilt DI, callable sync function (batch 10)
2026-06-17 01:25:51 -05:00