diff --git a/README.md b/README.md index a24741fb..a3c35b41 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Closer gives couples a shared space for guided connection: - **Daily question**: one prompt at a time, with written, scale, choice, and this-or-that answer modes. - **Private-first answers**: each person can answer privately before deciding whether to reveal or discuss. -- **Question packs**: 20 curated categories across 2,500+ bundled prompts, including communication, conflict, trust, money, stress, intimacy, marriage, parenting, and date night. +- **Question packs**: 22 curated categories across 6,000+ bundled prompts, including communication, conflict, trust, money, stress, intimacy, marriage, parenting, and date night. - **Answer history**: local answer storage, review flows, delete controls, and partner reveal support. - **Discussion threads**: question-specific conversation threads and reactions for follow-up. - **Partner pairing**: invite-code pairing, email invite flow, and partner-aware home states. diff --git a/app/src/main/assets/database/app.db b/app/src/main/assets/database/app.db index 2335471c..a3639e3f 100644 Binary files a/app/src/main/assets/database/app.db and b/app/src/main/assets/database/app.db differ diff --git a/app/src/main/java/app/closer/data/local/QuestionDao.kt b/app/src/main/java/app/closer/data/local/QuestionDao.kt index ac385898..9fddb037 100644 --- a/app/src/main/java/app/closer/data/local/QuestionDao.kt +++ b/app/src/main/java/app/closer/data/local/QuestionDao.kt @@ -9,31 +9,31 @@ import app.closer.data.local.entity.QuestionEntity @Dao interface QuestionDao { - @Query("SELECT * FROM question WHERE id = :id LIMIT 1") + @Query("SELECT * FROM question WHERE id = :id AND status = 'active' AND TRIM(text) <> '' LIMIT 1") suspend fun getQuestionById(id: String): QuestionEntity? - @Query("SELECT * FROM question WHERE status = 'active' AND is_premium = 0 ORDER BY RANDOM() LIMIT 1") + @Query("SELECT * FROM question WHERE status = 'active' AND is_premium = 0 AND TRIM(text) <> '' AND category_id <> 'unknown' ORDER BY RANDOM() LIMIT 1") suspend fun getDailyQuestion(): QuestionEntity? - @Query("SELECT * FROM question WHERE category_id = :categoryId AND status = 'active' ORDER BY depth_level ASC, id ASC") + @Query("SELECT * FROM question WHERE category_id = :categoryId AND status = 'active' AND TRIM(text) <> '' ORDER BY depth_level ASC, id ASC") suspend fun getQuestionsByCategory(categoryId: String): List - @Query("SELECT COUNT(*) FROM question WHERE category_id = :categoryId AND status = 'active'") + @Query("SELECT COUNT(*) FROM question WHERE category_id = :categoryId AND status = 'active' AND TRIM(text) <> ''") suspend fun getQuestionCountByCategory(categoryId: String): Int - @Query("SELECT * FROM question WHERE type = :type AND status = 'active'") + @Query("SELECT * FROM question WHERE type = :type AND status = 'active' AND TRIM(text) <> ''") suspend fun getQuestionsByType(type: String): List - @Query("SELECT * FROM question WHERE type IN ('single_choice', 'this_or_that', 'scale') AND status = 'active'") + @Query("SELECT * FROM question WHERE type IN ('single_choice', 'this_or_that', 'scale') AND status = 'active' AND TRIM(text) <> ''") suspend fun getQuestionsForPrediction(): List - @Query("SELECT * FROM question WHERE sex = :sex AND status = 'active'") + @Query("SELECT * FROM question WHERE sex = :sex AND status = 'active' AND TRIM(text) <> ''") suspend fun getDesireSyncQuestions(sex: String): List - @Query("SELECT * FROM question WHERE is_premium = 0 AND status = 'active'") + @Query("SELECT * FROM question WHERE is_premium = 0 AND status = 'active' AND TRIM(text) <> ''") suspend fun getFreeQuestions(): List - @Query("SELECT * FROM question WHERE is_premium = 1 AND status = 'active'") + @Query("SELECT * FROM question WHERE is_premium = 1 AND status = 'active' AND TRIM(text) <> ''") suspend fun getPremiumQuestions(): List @Insert(onConflict = OnConflictStrategy.REPLACE) diff --git a/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt b/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt index 926227e6..a7de528e 100644 --- a/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt +++ b/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt @@ -173,7 +173,9 @@ private fun ThisOrThatCard( ) { Card( onClick = onClick, - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .heightIn(min = 132.dp), shape = RoundedCornerShape(24.dp), colors = CardDefaults.cardColors(containerColor = MaterialTheme.colorScheme.surface), elevation = CardDefaults.cardElevation(defaultElevation = 6.dp) @@ -364,7 +366,7 @@ private fun HowWellCard( text = "How Well Do You Know Me", style = MaterialTheme.typography.titleMedium.copy(fontWeight = FontWeight.SemiBold), color = MaterialTheme.colorScheme.onSurface, - maxLines = 1, + maxLines = 2, overflow = TextOverflow.Ellipsis, modifier = Modifier.weight(1f) ) diff --git a/app/src/main/java/app/closer/ui/questions/DailyQuestionViewModel.kt b/app/src/main/java/app/closer/ui/questions/DailyQuestionViewModel.kt index bbbf7474..44d76107 100644 --- a/app/src/main/java/app/closer/ui/questions/DailyQuestionViewModel.kt +++ b/app/src/main/java/app/closer/ui/questions/DailyQuestionViewModel.kt @@ -97,7 +97,7 @@ class DailyQuestionViewModel @Inject constructor( }.onFailure { crashReporter.recordException(it) }.getOrNull() val question = if (assignment != null) { - repository.getQuestionById(assignment.questionId) + repository.getQuestionById(assignment.questionId) ?: repository.getDailyQuestion() } else { // No assignment yet. Request immediate assignment, but keep the app // usable with a local random question in case the call fails.