Integration: wire 3 new P2 screens into App.kt nav + HapticsInit bootstrap

Navigation wiring (per follow-ups flagged by Streams G/H/I):
- Add TaskTemplatesBrowserRoute (new) + App.kt composable<TaskTemplatesBrowserRoute>
- Wire composable<TaskSuggestionsRoute> (declared by Stream H but unwired)
- Wire composable<AddTaskWithResidenceRoute> (declared by Stream I but unwired)

MainActivity.onCreate now calls HapticsInit.install(applicationContext) so the
Vibrator fallback path works on non-View call-sites (flagged by Stream S).

Deferred cleanup (tracked, not done here):
- Port push-token registration from legacy MyFirebaseMessagingService.kt to
  new FcmService (Stream N TODO).
- Remove legacy WidgetTaskActionReceiver + manifest entry (Stream M flag).
- Residence invite accept/decline APILayer methods (Stream O TODO).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Trey T
2026-04-18 13:28:06 -05:00
parent 65af40ed73
commit 1ba95db629
3 changed files with 45 additions and 0 deletions

View File

@@ -68,6 +68,9 @@ class MainActivity : FragmentActivity(), SingletonImageLoader.Factory {
// Initialize BiometricPreference storage
BiometricPreference.initialize(BiometricPreferenceManager.getInstance(applicationContext))
// Initialize cross-platform Haptics backend (P5 Stream S)
com.tt.honeyDue.ui.haptics.HapticsInit.install(applicationContext)
// Initialize DataManager with platform-specific managers
// This loads cached lookup data from disk for faster startup
DataManager.initialize(

View File

@@ -31,6 +31,9 @@ import com.tt.honeyDue.ui.screens.VerifyEmailScreen
import com.tt.honeyDue.ui.screens.VerifyResetCodeScreen
import com.tt.honeyDue.ui.screens.onboarding.OnboardingScreen
import com.tt.honeyDue.ui.screens.subscription.FeatureComparisonScreen
import com.tt.honeyDue.ui.screens.task.AddTaskWithResidenceScreen
import com.tt.honeyDue.ui.screens.task.TaskSuggestionsScreen
import com.tt.honeyDue.ui.screens.task.TaskTemplatesBrowserScreen
import com.tt.honeyDue.ui.screens.theme.ThemeSelectionScreen
import com.tt.honeyDue.viewmodel.OnboardingViewModel
import com.tt.honeyDue.viewmodel.PasswordResetViewModel
@@ -678,6 +681,35 @@ fun App(
)
}
composable<TaskSuggestionsRoute> { backStackEntry ->
// P2 Stream H — standalone personalized-task suggestions.
val route = backStackEntry.toRoute<TaskSuggestionsRoute>()
TaskSuggestionsScreen(
residenceId = route.residenceId,
onNavigateBack = { navController.popBackStack() },
)
}
composable<AddTaskWithResidenceRoute> { backStackEntry ->
// P2 Stream I — Android port of iOS AddTaskWithResidenceView.
val route = backStackEntry.toRoute<AddTaskWithResidenceRoute>()
AddTaskWithResidenceScreen(
residenceId = route.residenceId,
onNavigateBack = { navController.popBackStack() },
onCreated = { navController.popBackStack() },
)
}
composable<TaskTemplatesBrowserRoute> { backStackEntry ->
// P2 Stream G — full-screen template catalog browse.
val route = backStackEntry.toRoute<TaskTemplatesBrowserRoute>()
TaskTemplatesBrowserScreen(
residenceId = route.residenceId,
fromOnboarding = route.fromOnboarding,
onNavigateBack = { navController.popBackStack() },
)
}
composable<EditTaskRoute> { backStackEntry ->
val route = backStackEntry.toRoute<EditTaskRoute>()
EditTaskScreen(

View File

@@ -172,3 +172,13 @@ data class TaskSuggestionsRoute(val residenceId: Int)
// AddTaskWithResidenceView). Residence is pre-selected via residenceId.
@Serializable
data class AddTaskWithResidenceRoute(val residenceId: Int)
// Task Templates Browser Route (P2 Stream G — full-screen browse/preview/
// bulk-apply of the server-driven template catalog). residenceId scopes
// which residence tasks get created against; fromOnboarding switches
// analytics event names.
@Serializable
data class TaskTemplatesBrowserRoute(
val residenceId: Int,
val fromOnboarding: Boolean = false,
)