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
null
c1f7e6f7f9
feat: daily question date key uses local timezone instead of UTC (batch v0.2.15)
...
- Replace SimpleDateFormat/Calendar UTC date key with java.time LocalDate in device timezone
- FirestoreAnswerDataSource: todayLocalDateString() with injectable Clock, localDateString() helper
- DailyQuestionViewModel: pass date through submit flow so sync uses same date key
- AnswerRevealViewModel: use todayLocalDateString() for partner answer lookup
- Add FirestoreAnswerDataSourceTest: verifies timezone-aware date boundaries (Chicago vs Tokyo, LA vs London)
2026-06-19 21:24:53 -05:00
null
70bb0a346c
fix: normalize crypto files to plain ASCII (batch v0.2.14)
...
- Replace smart quotes, em dash, prime, right arrow in comments with ASCII equivalents
- Affected: CoupleEncryptionManager.kt, FieldEncryptor.kt, RecoveryKeyManager.kt
2026-06-19 21:22:27 -05:00
null
85b4eb589b
feat: add 3 stronger privacy slogans to BrandMessageRotator (batch v0.2.13)
...
- Add to CloserBrandCopy: 'Not even Closer can read your answers.', 'End to end encrypted private responses.', 'Built for trust, not tracking.'
- Update visual-identity.md: add new slogans to approved rotation, remove migration gating note (all legacy couples migrated)
2026-06-19 21:17:59 -05:00
null
55ca3dce27
fix: Firestore rules hardening, recovery phrase strength, test cleanup (batch v0.2.12)
...
- Firestore rules: add isCouplesMember(coupleId) to question thread answer writes (prevents outsider writes)
- Firestore rules: allow currentIndex increment on same-status session updates (fixes thread progression)
- RecoveryKeyManager: PHRASE_WORD_COUNT 6→10 (~80 bits entropy)
- build.gradle.kts: exclude META-INF/versions/9/OSGI-INF/MANIFEST.MF (packaging conflict)
- .gitignore: add firebase-debug.log, firestore-debug.log
- firestore-tests: configurable emulator port via FIRESTORE_EMULATOR_PORT env var
- firestore-tests: fix invite outsider test (seed with different coupleId), fix non-starter session test (active→completed allowed), remove redundant beforeEach(seedThread), add outsider-write-denied test for thread answers
- visual-identity.md: update encryption claim gating note
2026-06-19 21:08:55 -05:00
null
3233c54ab2
feat: strict E2EE — encryption migration, Firestore rules enforcement, version 2 protocol (batch v0.2.11)
...
- Add CoupleAnswerMigrationDataSource: one-time per-user rewrite of all historical answer-bearing fields (daily answers, thread answers/messages, ThisOrThat, DesireSync, HowWell, Wheel) to ciphertext
- Add EncryptionUpgradeScreen + ViewModel: handles version-0→1→2 migration, recovery phrase display, partner coordination
- Add FieldEncryptorTest: round-trip, cross-couple binding, null-key, plaintext-not-leaked
- CoupleEncryptionManager: STRICT_ENCRYPTION_VERSION=2, requireAead() throws on missing key, setupLegacyCouple, pendingRecoveryPhrase/acknowledge
- CoupleKeyStore: pending recovery phrase storage/clear
- FieldEncryptor: switch from android.util.Base64 to java.util.Base64
- All data sources: use requireAead() (throws instead of silent plaintext fallback), encrypt all answer-bearing writes
- FirestoreCoupleDataSource: beginEncryptionMigration (atomic version-0→1 claim), markEncryptionMigrationComplete (per-user + version-2 promotion)
- CoupleRepositoryImpl: require wrappedKey on invite acceptance (no more optional)
- HomeScreen/ViewModel: route to EncryptionUpgradeScreen for version-0 or unmigrated version-1 couples
- Firestore rules: isCiphertext validator, isEncryptedAnswerPayload, isStartingEncryptionMigration, isCompletingOwnEncryptionMigration, isUpdatingRecoveryWrap, isUpdatingCoupleRhythm; enforce ciphertext on all answer/message writes; game collection rules (this_or_that, desire_sync, how_well, wheel) with per-user answer ownership; couple doc update split into 4 mutually exclusive paths; invite doc requires createdAt + wrappedKey fields; isImmutable uses diff().hasAny() instead of field equality
- Firestore rules tests: encryption migration scenarios, plaintext rejection, per-user answer ownership, game collection ciphertext enforcement
- firebase.json: emulator port 8180
- .gitignore: firestore-tests/node_modules
2026-06-19 20:53:52 -05:00
null
e7b45cc84f
fix: profile photo temp dir, Firestore rules field-level lockdown (batch v0.2.10)
...
- Move temp profile photos to filesDir/photos/ subdirectory with mkdirs
- Update file_paths.xml to scope FileProvider to photos/ subdirectory
- Firestore rules: restrict couple doc updates to only mutable fields (streakCount, lastAnsweredAt, wrappedCoupleKey, kdfSalt, kdfParams, encryptionVersion) — prevents client from overwriting currentQuestionId, activePackId, id
2026-06-19 20:33:08 -05:00
null
9a0b2b6a3d
feat: BrandMessageRotator — rotating privacy copy across screens (batch v0.2.9)
...
- Add CloserBrandCopy with 6 approved privacy messages
- Add BrandMessageRotator composable: animated fade rotation every 4.5s, reduced-motion support
- Integrate rotator into: OnboardingScreen (CTA + auth check), LoginScreen, LoadingState, AnswerRevealScreen (waiting card), WaitingForPartnerScreen, DesireSync/HowWell/ThisOrThat waiting screens
- Add CloserBrandCopyTest for uniqueness and length validation
- Update visual-identity.md with approved rotation and security-claim publishing rules
2026-06-19 20:24:50 -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
cbaa68ef2e
feat: account deletion with re-authentication flow (batch v0.2.7)
...
- Add reauthenticateWithEmail to AuthRepository + FirebaseAuthDataSource
- DeleteAccountScreen: re-auth dialog for email users (password prompt), Google user guidance
- DeleteAccountViewModel: handle FirebaseAuthRecentLoginRequiredException, re-auth submission
- Reorder delete flow: auth account deleted first, then couple leave + user data cleanup
2026-06-19 19:57:07 -05:00
null
30fddcc2df
feat: E2EE — Tink AEAD, Argon2id KDF, recovery phrase, encrypted Firestore fields (batch v0.2.6)
...
- Add crypto module: CoupleKeyStore (EncryptedSharedPreferences), RecoveryKeyManager (Argon2id + AES-256-GCM key wrap), FieldEncryptor (AEAD per-field), CoupleEncryptionManager (orchestration)
- Add Tink + Bouncy Castle dependencies to build.gradle.kts, register AeadConfig in CloserApp
- Encrypt answer fields (writtenText, selectedOptionIds, scaleValue) on write, decrypt on read
- Encrypt DesireSync, HowWell, WheelAnswer, QuestionThread fields via CoupleEncryptionManager
- Generate recovery phrase during invite creation, display in CreateInviteScreen
- Add recovery phrase input to InviteConfirmScreen for encrypted invites
- Add RecoveryScreen + RecoveryViewModel for post-pairing key recovery
- Update Couple model with encryptionVersion, wrappedCoupleKey, kdfSalt, kdfParams
- Update Firestore rules: allow couple doc creation by members, fcmTokens path, encryptionVersion monotonic check, invite doc extended fields
2026-06-19 19:52:35 -05:00
null
5caae523e7
feat: app icon redesign, store assets, brand identity docs (batch v0.2.5)
...
- Redraw adaptive icon layers (background + foreground) with Closer palette colors
- Add monochrome icon layer for Android 13+ themed icons
- Add mipmap-anydpi-v33 adaptive icon configs (round + standard)
- Add store assets: 512px app icon, 1024x500 feature graphic, source SVGs
- Add docs/brand/visual-identity.md with brand mark, color palette, store voice, asset rules
- Update store-assets.md checklist to reflect completed items
2026-06-19 19:10:03 -05:00
null
7256a71bdf
feat: dark mode support — ThemeMode setting, dynamic colors, status bar sync (batch v0.2.4)
...
- Add ThemeMode enum (DEVICE/LIGHT/DARK) with DataStore persistence
- SettingsScreen: appearance section with radio buttons for Device/Light/Dark
- SettingsViewModel: observe and persist theme mode
- MainActivity: read theme setting, apply dark theme, sync status bar icons
- Replace hardcoded Color.White references with MaterialTheme.colorScheme.surface across auth, onboarding, settings, and theme
- Convert AuthVisuals, SettingsVisuals, CloserPalette brushes to @Composable getters using dynamic scheme colors
- Add values-night/themes.xml for dark theme manifest entry
- Add ThemeModeTest unit test for fromStorageValue parsing
2026-06-19 19:00:37 -05:00
null
7552c451db
feat: notification copy, error messages, animations, reduced-motion support (batch v0.2.2)
...
- Rewrite all notification titles/bodies + channel descriptions to warmer, partner-centric tone
- Update error messages across all screens for clarity and consistency
- Add AnimatedVisibility + reduced-motion detection (Settings.Global.ANIMATOR_DURATION_SCALE) to AnswerRevealScreen and LocalQuestionContent
- Polish settings copy (quiet hours, partner activity labels, info footer)
- Update all game error states with actionable language ('Go back and try again')
- Refresh docs screenshots
2026-06-19 04:20:08 -05:00
null
79a63629f1
refactor: CloserPrimitives design system, PairPromptScreen, state component overhauls (batch v0.2.1)
...
- Add CloserPrimitives (CloserCard, CloserActionButton, CloserSpacing, CloserButtonStyle, SkeletonLine)
- Refactor EmptyState, ErrorState, LoadingState to use primitives with closer design tokens
- Add PairPromptScreen + nav route for post-signup partner invitation
- Update SignUpScreen onboarding copy to mention partner invite flow
- HomeScreen and PlayHubScreen layout/structure refinements
2026-06-19 04:04:52 -05:00
null
164e0e47ca
feat: update AnswerHistory, BucketList, DateMatches, Onboarding, LocalQuestionContent, WheelHistory screens
2026-06-19 03:53:43 -05:00
null
803b681d06
feat: update PrivacyScreen, add Firestore test scripts, gitleaks audit artifacts
2026-06-19 03:45:53 -05:00
null
9e587a23dd
feat: update question thread data source, repository, ViewModel, and Firestore security rules
2026-06-19 03:19:58 -05:00
null
927e930b79
feat: add SessionLength model, update game screens with session length awareness
2026-06-19 02:50:58 -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
70e7c66cd6
feat: add game history screen, shared session state, updated navigation + PlayHub
2026-06-19 01:43:06 -05:00
null
3ba6c659dd
feat: add partner-waiting flow across all game screens with QuestionSession model updates
2026-06-19 01:14:04 -05:00
null
733c0967c2
fix: Q2 grammar quality pass on emotional_intimacy, parenting, stress questions + app.db rebuild
2026-06-19 00:50:23 -05:00
null
a13167dc3e
feat: Q1 question variety improvement across all categories, app.db rebuild
2026-06-19 00:35:00 -05:00
null
93813255fd
chore: Q3 asset DB cleanup (remove 300 dead rows), Q5 grammar fix for depth-5 questions in emotional_intimacy + stress
2026-06-18 22:03:52 -05:00
null
5ad1456adb
feat: update desire sync question bank, degender scripts, app.db rebuild
2026-06-18 21:41:14 -05:00
null
473feb78a9
feat: add DesireSync + HowWell Firestore data sources, update screens with cloud-backed answering
2026-06-18 20:47:18 -05:00
null
97cc334136
feat: add Firestore wheel answer data source, update wheel screens with logging + answer history
2026-06-18 20:10:08 -05:00
null
408a2f24ba
feat: add ThisOrThat Firestore data source, updated screen with question answering flow
2026-06-18 19:53:17 -05:00
null
af06cb2123
feat: add Time Capsule feature with Firestore data source, model, and MemoryLane UI screens
2026-06-18 04:14:12 -05:00
null
4e871f8e4f
feat: add Connection Challenge system with game routing, Firestore data source, ChallengeGameScreen in PlayHub
2026-06-18 04:03:57 -05:00
null
574fed27f7
refactor: replace raw string game types with GameType constants, remove unused feature flag module
2026-06-18 03:51:12 -05:00
null
debc6aed02
fix: handle partner_active_session error in SpinWheelViewModel, navigate to waiting screen
2026-06-18 03:46:34 -05:00
null
1b344e7220
fix: filter out empty-text/unknown-category questions from all DAO queries, regenerate app.db, handle deleted cloud question by falling back to random
2026-06-18 03:43:24 -05:00
null
606d724f12
feat: add answer history filter pills with reveal/private badges, DesireSync progress meter and reveal UI, HowWell ring progress and privacy tiles, Paywall feature scavenger hunt, category screen grid polish
2026-06-18 03:26:12 -05:00
null
15c1fbdda0
feat: replace PlaceholderScreen with FinishedEmptyStateScreen across PartnerHome, EmailInvite, QuestionComposer, Subscription
2026-06-18 03:20:13 -05:00
null
8b394ab40f
fix: use UTC dates for daily question keys across all date consumers
2026-06-18 03:11:22 -05:00
null
fb0e8fbaab
refactor: extract startGameWithCouple, remove duplicate partner notification from leaveCouple
2026-06-18 03:08:48 -05:00
null
2521e91db4
fix: simplify hasPremium with first(), leave couple before deleting account
2026-06-18 02:56:34 -05:00
null
dfd9974683
fix: use real-time session observation in WaitingForPartnerScreen, add credential type check in Google sign-in
2026-06-18 02:50:21 -05:00
null
c894dd8c67
fix: simplify finishGame to not require userId — first caller wins
2026-06-18 02:47:57 -05:00
null
21df900bc7
fix: add contentDescription to icon buttons for accessibility
2026-06-18 02:46:10 -05:00
null
df961e8d94
fix: enforce multi-choice maxSelections limit across all answer UIs, pass questionIds to startGame
2026-06-18 02:41:33 -05:00
null
4134c4570d
fix: integrate game session lifecycle into DesireSync, HowWell, and ThisOrThat
2026-06-18 02:29:14 -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
7926289153
fix: clamp scale midpoint and handle edge case in wheel session answer UI
2026-06-18 01:17:47 -05:00
null
c6df885e1e
fix: add answer options to wheel session screen so partners can answer questions
2026-06-18 01:09:08 -05:00
null
7fb913db99
fix: add camera hardware feature flag, fix WaitingForPartnerScreen layout
2026-06-18 01:05:04 -05:00
null
c58b1c6326
feat: enforce one active game per couple with partner notifications
2026-06-18 00:56:21 -05:00
null
2677e38514
fix: use sex column for Desire Sync question filtering instead of fragile ID pattern
2026-06-18 00:32:39 -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
92a257b3eb
feat: add sex field to user profile, Google profile extraction, multi-step onboarding, profile editing
2026-06-17 23:59:46 -05:00
null
f7b95fc9ba
feat: add Google sign-in icon, update login screen and auth visuals
2026-06-17 23:07:19 -05:00
null
8217a3385d
fix: extract Firebase auth calls into AuthRepository — LoginViewModel no longer depends on Firebase directly
2026-06-17 23:02:25 -05:00
null
370a56069f
refactor: comprehensive UI polish across 26 files — components, screens, theme consistency
2026-06-17 22:44:14 -05:00
null
d135b306aa
feat: add CategoryGlyph component, DesireSync polish, UI refinements across screens
2026-06-17 22:31:34 -05:00
null
85bb8d9f69
feat: add DesireSync module with sexual_preferences questions and Room integration
2026-06-17 22:23:04 -05:00
null
d21763ac41
feat: add sexual_preferences seed data (question_v2 schema)
2026-06-17 22:10:50 -05:00
null
a530064ddb
fix: refine shell back routes — remove full-screen screens from shellBackRoutes set
2026-06-17 22:03:36 -05:00
null
45058fdd5f
feat: couple intimacy seed data, "How Well" screen, ThisOrThat + wheel polish
2026-06-17 21:57:40 -05:00
null
254652cb86
feat: add "This or That" screen with navigation, DB query, and Play Hub card
2026-06-17 21:34:07 -05:00
null
84390a48fc
fix: test infrastructure and entitlement logic updates
2026-06-17 21:08:13 -05:00
null
827cfd2e2d
fix: UI polish across auth, play hub, settings, wheel screens
2026-06-17 20:59:21 -05:00
null
d6f5eb6b0f
fix: inject FirebaseFirestore via constructor instead of getInstance()
2026-06-17 20:53:42 -05:00
null
e5c734d3b2
fix: ViewModel and repository error handling improvements
2026-06-17 20:51:18 -05:00
null
c89e4f6bba
fix: answer reveal and question category UI/state fixes
2026-06-17 20:41:37 -05:00
null
a0fd1d56f6
feat: category picker redesign, bucket list wiring, settings + nav updates
2026-06-17 20:38:06 -05:00
null
c816033e74
feat: cloud function for date match cleanup, ViewModel and repo improvements
2026-06-17 20:26:24 -05:00
null
fb87fe149a
docs: rewrite README with product clarity, add screenshots, register Room DAOs in DI
2026-06-17 19:59:07 -05:00
null
662a49df9d
refactor: centralize all Firestore collection paths in FirestoreCollections constants
2026-06-17 19:47:58 -05:00
null
19c6b4a6cb
fix: real uid in bucket list, Firestore rules hardening for date plans & bucket list
2026-06-17 19:41:27 -05:00
null
ec315c63e0
feat: add App Integrity + device attestation modules
2026-06-17 19:37:19 -05:00
null
0095151bd9
fix: add input sanitization across date plan forms and repository
2026-06-17 19:23:53 -05:00
null
ede7c70ea7
fix(release): date/time pickers, debug logging guards, RC_API_KEY comment, ExternalLinks TODOs (gap fixes)
2026-06-17 02:00:39 -05:00
null
4ede77f067
feat(legal): ExternalLinks utility, Privacy/Terms links in Settings + Paywall screens (batch 12)
2026-06-17 01:32:05 -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
null
681cf7fb32
feat(billing): RevenueCat SDK integration, BillingRepository, PaywallScreen + ViewModel, Hilt DI, navigation route (batch 9)
2026-06-17 01:22:24 -05:00
null
c9ff160bf3
fix(ui): responsive visual QA pass — text ellipsis, navigationBarsPadding, touch targets, spacing fixes (batch 8)
2026-06-17 01:17:47 -05:00
null
d109f7fcd0
fix(ui): partner invite flow polish — compact layout, share button, back affordances, secondary route styling (batch 7)
2026-06-17 00:16:42 -05:00