reis-mobile 0.3.6 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +24 -0
- package/README.md +175 -168
- package/THIRD_PARTY_NOTICES.md +224 -4
- package/agents/android-architect.md +89 -0
- package/agents/android-performance-engineer.md +92 -0
- package/agents/android-test-engineer.md +97 -0
- package/agents/flutter-test-engineer.md +2 -0
- package/agents/ios-architect.md +93 -0
- package/agents/ios-performance-engineer.md +92 -0
- package/agents/ios-test-engineer.md +95 -0
- package/agents/lead-mobile.md +10 -1
- package/agents/mobile-staff-engineer.md +1 -1
- package/agents/rn-architect.md +94 -0
- package/agents/rn-performance-engineer.md +92 -0
- package/agents/rn-test-engineer.md +98 -0
- package/bin/reis-mobile.mjs +59 -17
- package/commands/debate.md +10 -1
- package/commands/debug.md +60 -0
- package/commands/reis-mobile.md +7 -2
- package/core/config/project.mjs +59 -0
- package/core/registry/frontmatter.mjs +15 -4
- package/core/registry/registry.mjs +21 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +1 -1
- package/skills/android-adaptive/SKILL.md +304 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-agp-9-upgrade/SKILL.md +106 -0
- package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
- package/skills/android-appfunctions/SKILL.md +74 -0
- package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/android-appfunctions/references/context.md +26 -0
- package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
- package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/android-camerax/SKILL.md +135 -0
- package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
- package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
- package/skills/android-camerax/references/expert-blueprints.md +58 -0
- package/skills/android-camerax/references/foldables.md +83 -0
- package/skills/android-camerax/references/immutability.md +60 -0
- package/skills/android-camerax/references/low-light.md +124 -0
- package/skills/android-camerax/references/mlkit-spatial.md +75 -0
- package/skills/android-camerax/references/modern-apis.md +42 -0
- package/skills/android-camerax/references/testing.md +69 -0
- package/skills/android-camerax/references/thermals.md +85 -0
- package/skills/android-camerax/references/wear-os.md +76 -0
- package/skills/android-camerax/references/xr.md +54 -0
- package/skills/android-cli/SKILL.md +474 -0
- package/skills/android-cli/references/interact.md +113 -0
- package/skills/android-cli/references/journeys.md +120 -0
- package/skills/android-code-review/SKILL.md +58 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/android-edge-to-edge/SKILL.md +429 -0
- package/skills/android-engage-sdk-integration/SKILL.md +130 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
- package/skills/android-engage-sdk-integration/references/common.md +519 -0
- package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
- package/skills/android-engage-sdk-integration/references/requests.md +260 -0
- package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/android-gradle-build-debug/SKILL.md +71 -0
- package/skills/android-intent-security/SKILL.md +550 -0
- package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/android-media3-cast-integration/SKILL.md +236 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
- package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/android-navigation-3/SKILL.md +122 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/android-navigation-event/SKILL.md +312 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
- package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/android-play-policy-insights/SKILL.md +172 -0
- package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/android-play-policy-insights/resources/critic.md +86 -0
- package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/android-play-policy-insights/resources/policies.json +321 -0
- package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
- package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/android-profiler/SKILL.md +60 -0
- package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/android-profiler/references/env_setup.md +15 -0
- package/skills/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/android-r8-analyzer/SKILL.md +72 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/android-restore-credentials/SKILL.md +359 -0
- package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/android-styles/SKILL.md +229 -0
- package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/android-verified-email/SKILL.md +432 -0
- package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/android-wear-compose-m3/SKILL.md +365 -0
- package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
- package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
- package/skills/flutter-build-debug/SKILL.md +66 -0
- package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
- package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
- package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
- package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
- package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
- package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
- package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
- package/skills/{provider → flutter-provider}/SKILL.md +1 -1
- package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
- package/skills/ios-cocoapods-debug/SKILL.md +65 -0
- package/skills/ios-code-review/SKILL.md +56 -0
- package/skills/ios-xcode-build-debug/SKILL.md +66 -0
- package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
- package/skills/mobile-firebase/SKILL.md +54 -0
- package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
- package/skills/mobile-firebase/references/android/analytics.md +33 -0
- package/skills/mobile-firebase/references/android/app-check.md +36 -0
- package/skills/mobile-firebase/references/android/auth.md +44 -0
- package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
- package/skills/mobile-firebase/references/android/firestore.md +44 -0
- package/skills/mobile-firebase/references/android/functions.md +33 -0
- package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
- package/skills/mobile-firebase/references/android/messaging.md +41 -0
- package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
- package/skills/mobile-firebase/references/android/remote-config.md +43 -0
- package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
- package/skills/mobile-firebase/references/android/storage.md +39 -0
- package/skills/mobile-firebase/references/android.md +30 -0
- package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
- package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
- package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
- package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
- package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
- package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
- package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
- package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
- package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
- package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
- package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
- package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
- package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
- package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
- package/skills/mobile-firebase/references/flutter.md +36 -0
- package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
- package/skills/mobile-firebase/references/ios/analytics.md +33 -0
- package/skills/mobile-firebase/references/ios/app-check.md +36 -0
- package/skills/mobile-firebase/references/ios/auth.md +48 -0
- package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
- package/skills/mobile-firebase/references/ios/firestore.md +53 -0
- package/skills/mobile-firebase/references/ios/functions.md +35 -0
- package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
- package/skills/mobile-firebase/references/ios/messaging.md +45 -0
- package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
- package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
- package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
- package/skills/mobile-firebase/references/ios/storage.md +36 -0
- package/skills/mobile-firebase/references/ios.md +28 -0
- package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
- package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
- package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
- package/skills/mobile-firebase/references/react-native/auth.md +50 -0
- package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
- package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
- package/skills/mobile-firebase/references/react-native/functions.md +28 -0
- package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
- package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
- package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
- package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
- package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
- package/skills/mobile-firebase/references/react-native/storage.md +30 -0
- package/skills/mobile-firebase/references/react-native.md +29 -0
- package/skills/mobile-test/SKILL.md +63 -0
- package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
- package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
- package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
- package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
- package/skills/mobile-test/references/android.md +83 -0
- package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
- package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
- package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
- package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
- package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
- package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
- package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
- package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
- package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
- package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
- package/skills/mobile-test/references/flutter.md +44 -0
- package/skills/mobile-test/references/ios.md +79 -0
- package/skills/mobile-test/references/react-native.md +62 -0
- /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
# Modular Navigation Recipe (Hilt)
|
|
2
|
+
|
|
3
|
+
This recipe demonstrates how to structure a multi-module application using Navigation 3 and Dagger/Hilt for dependency injection. The goal is to create a decoupled architecture where navigation is defined and implemented in separate feature modules.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
The application is divided into several modules:
|
|
8
|
+
|
|
9
|
+
- **`app` module** : This is the main application module. It initializes a common `Navigator` and injects a set of `EntryProviderInstaller`s from the feature modules. It then uses these installers to build the final `entryProvider` for the `NavDisplay`.
|
|
10
|
+
|
|
11
|
+
- **`common` module**: This module contains the core navigation logic, including:
|
|
12
|
+
|
|
13
|
+
- A `Navigator` class that manages the back stack.
|
|
14
|
+
- An `EntryProviderInstaller` type, which is a function that feature modules use to contribute their navigation entries to the application's `entryProvider`.
|
|
15
|
+
- **Feature modules (e.g., `conversation`, `profile`)**: Each feature is split into two sub-modules:
|
|
16
|
+
|
|
17
|
+
- **`api` module**: Defines the public API for the feature, including its navigation routes. This allows other modules to navigate to this feature without needing to know about its implementation details.
|
|
18
|
+
- **`impl` module** : Provides the implementation of the feature, including its composables and an `EntryProviderInstaller` that maps the feature's routes to its composables. This installer is then provided to the `app` module using Dagger/Hilt.
|
|
19
|
+
|
|
20
|
+
This modular approach allows for a clean separation of concerns, making the codebase more scalable and maintainable. Each feature is responsible for its own navigation logic, and the `app` module only combines these pieces together.
|
|
21
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/modular/hilt)
|
|
22
|
+
|
|
23
|
+
```
|
|
24
|
+
package com.example.nav3recipes.modular.hilt
|
|
25
|
+
|
|
26
|
+
import androidx.compose.foundation.background
|
|
27
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
28
|
+
import androidx.compose.foundation.layout.Column
|
|
29
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
30
|
+
import androidx.compose.foundation.layout.padding
|
|
31
|
+
import androidx.compose.material3.MaterialTheme
|
|
32
|
+
import androidx.compose.material3.Text
|
|
33
|
+
import androidx.compose.runtime.Composable
|
|
34
|
+
import androidx.compose.ui.Alignment
|
|
35
|
+
import androidx.compose.ui.Modifier
|
|
36
|
+
import androidx.compose.ui.unit.dp
|
|
37
|
+
import dagger.Module
|
|
38
|
+
import dagger.Provides
|
|
39
|
+
import dagger.hilt.InstallIn
|
|
40
|
+
import dagger.hilt.android.components.ActivityRetainedComponent
|
|
41
|
+
import dagger.multibindings.IntoSet
|
|
42
|
+
|
|
43
|
+
// API
|
|
44
|
+
object Profile
|
|
45
|
+
|
|
46
|
+
// IMPLEMENTATION
|
|
47
|
+
@Module
|
|
48
|
+
@InstallIn(ActivityRetainedComponent::class)
|
|
49
|
+
object ProfileModule {
|
|
50
|
+
|
|
51
|
+
@IntoSet
|
|
52
|
+
@Provides
|
|
53
|
+
fun provideEntryProviderInstaller() : EntryProviderInstaller = {
|
|
54
|
+
entry<Profile>{
|
|
55
|
+
ProfileScreen()
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Composable
|
|
61
|
+
private fun ProfileScreen() {
|
|
62
|
+
val profileColor = MaterialTheme.colorScheme.surfaceVariant
|
|
63
|
+
Column(
|
|
64
|
+
modifier = Modifier
|
|
65
|
+
.fillMaxSize()
|
|
66
|
+
.background(profileColor)
|
|
67
|
+
.padding(16.dp),
|
|
68
|
+
horizontalAlignment = Alignment.CenterHorizontally,
|
|
69
|
+
verticalArrangement = Arrangement.Center
|
|
70
|
+
) {
|
|
71
|
+
Text(
|
|
72
|
+
text = "Profile Screen",
|
|
73
|
+
style = MaterialTheme.typography.headlineMedium,
|
|
74
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
75
|
+
)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
package com.example.nav3recipes.modular.hilt
|
|
82
|
+
|
|
83
|
+
import android.os.Bundle
|
|
84
|
+
import androidx.activity.ComponentActivity
|
|
85
|
+
import androidx.activity.compose.setContent
|
|
86
|
+
import androidx.compose.foundation.layout.padding
|
|
87
|
+
import androidx.compose.material3.Scaffold
|
|
88
|
+
import androidx.compose.ui.Modifier
|
|
89
|
+
import androidx.navigation3.runtime.entryProvider
|
|
90
|
+
import androidx.navigation3.ui.NavDisplay
|
|
91
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
92
|
+
import dagger.hilt.android.AndroidEntryPoint
|
|
93
|
+
import javax.inject.Inject
|
|
94
|
+
|
|
95
|
+
@AndroidEntryPoint
|
|
96
|
+
class HiltModularActivity : ComponentActivity() {
|
|
97
|
+
|
|
98
|
+
@Inject
|
|
99
|
+
lateinit var navigator: Navigator
|
|
100
|
+
|
|
101
|
+
@Inject
|
|
102
|
+
lateinit var entryProviderScopes: Set<@JvmSuppressWildcards EntryProviderInstaller>
|
|
103
|
+
|
|
104
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
105
|
+
super.onCreate(savedInstanceState)
|
|
106
|
+
setEdgeToEdgeConfig()
|
|
107
|
+
setContent {
|
|
108
|
+
Scaffold { paddingValues ->
|
|
109
|
+
NavDisplay(
|
|
110
|
+
backStack = navigator.backStack,
|
|
111
|
+
modifier = Modifier.padding(paddingValues),
|
|
112
|
+
onBack = { navigator.goBack() },
|
|
113
|
+
entryProvider = entryProvider {
|
|
114
|
+
entryProviderScopes.forEach { builder -> this.builder() }
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
package com.example.nav3recipes.modular.hilt
|
|
125
|
+
|
|
126
|
+
import androidx.compose.foundation.background
|
|
127
|
+
import androidx.compose.foundation.clickable
|
|
128
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
129
|
+
import androidx.compose.foundation.layout.Column
|
|
130
|
+
import androidx.compose.foundation.layout.Spacer
|
|
131
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
132
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
133
|
+
import androidx.compose.foundation.layout.height
|
|
134
|
+
import androidx.compose.foundation.layout.padding
|
|
135
|
+
import androidx.compose.foundation.lazy.LazyColumn
|
|
136
|
+
import androidx.compose.material3.Button
|
|
137
|
+
import androidx.compose.material3.ListItem
|
|
138
|
+
import androidx.compose.material3.ListItemDefaults
|
|
139
|
+
import androidx.compose.material3.MaterialTheme
|
|
140
|
+
import androidx.compose.material3.Text
|
|
141
|
+
import androidx.compose.runtime.Composable
|
|
142
|
+
import androidx.compose.ui.Alignment
|
|
143
|
+
import androidx.compose.ui.Modifier
|
|
144
|
+
import androidx.compose.ui.graphics.Color
|
|
145
|
+
import androidx.compose.ui.unit.dp
|
|
146
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
147
|
+
import com.example.nav3recipes.ui.theme.colors
|
|
148
|
+
import dagger.Module
|
|
149
|
+
import dagger.Provides
|
|
150
|
+
import dagger.hilt.InstallIn
|
|
151
|
+
import dagger.hilt.android.components.ActivityRetainedComponent
|
|
152
|
+
import dagger.multibindings.IntoSet
|
|
153
|
+
|
|
154
|
+
// API
|
|
155
|
+
object ConversationList
|
|
156
|
+
data class ConversationDetail(val id: Int) {
|
|
157
|
+
val color: Color
|
|
158
|
+
get() = colors[id % colors.size]
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// IMPL
|
|
162
|
+
@Module
|
|
163
|
+
@InstallIn(ActivityRetainedComponent::class)
|
|
164
|
+
object ConversationModule {
|
|
165
|
+
|
|
166
|
+
@IntoSet
|
|
167
|
+
@Provides
|
|
168
|
+
fun provideEntryProviderInstaller(navigator: Navigator): EntryProviderInstaller =
|
|
169
|
+
{
|
|
170
|
+
entry<ConversationList> {
|
|
171
|
+
ConversationListScreen(
|
|
172
|
+
onConversationClicked = { conversationDetail ->
|
|
173
|
+
navigator.goTo(conversationDetail)
|
|
174
|
+
}
|
|
175
|
+
)
|
|
176
|
+
}
|
|
177
|
+
entry<ConversationDetail> { key ->
|
|
178
|
+
ConversationDetailScreen(key) { navigator.goTo(Profile) }
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
@Composable
|
|
184
|
+
private fun ConversationListScreen(
|
|
185
|
+
onConversationClicked: (ConversationDetail) -> Unit
|
|
186
|
+
) {
|
|
187
|
+
LazyColumn(
|
|
188
|
+
modifier = Modifier.fillMaxSize(),
|
|
189
|
+
) {
|
|
190
|
+
items(10) { index ->
|
|
191
|
+
val conversationId = index + 1
|
|
192
|
+
val conversationDetail = ConversationDetail(conversationId)
|
|
193
|
+
val backgroundColor = conversationDetail.color
|
|
194
|
+
ListItem(
|
|
195
|
+
modifier = Modifier
|
|
196
|
+
.fillMaxWidth()
|
|
197
|
+
.clickable(onClick = dropUnlessResumed {
|
|
198
|
+
onConversationClicked(conversationDetail)
|
|
199
|
+
}),
|
|
200
|
+
headlineContent = {
|
|
201
|
+
Text(
|
|
202
|
+
text = "Conversation $conversationId",
|
|
203
|
+
style = MaterialTheme.typography.headlineSmall,
|
|
204
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
205
|
+
)
|
|
206
|
+
},
|
|
207
|
+
colors = ListItemDefaults.colors(
|
|
208
|
+
containerColor = backgroundColor // Set container color directly
|
|
209
|
+
)
|
|
210
|
+
)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
@Composable
|
|
216
|
+
private fun ConversationDetailScreen(
|
|
217
|
+
conversationDetail: ConversationDetail,
|
|
218
|
+
onProfileClicked: () -> Unit
|
|
219
|
+
) {
|
|
220
|
+
Column(
|
|
221
|
+
modifier = Modifier
|
|
222
|
+
.fillMaxSize()
|
|
223
|
+
.background(conversationDetail.color)
|
|
224
|
+
.padding(16.dp),
|
|
225
|
+
horizontalAlignment = Alignment.CenterHorizontally,
|
|
226
|
+
verticalArrangement = Arrangement.Center
|
|
227
|
+
) {
|
|
228
|
+
Text(
|
|
229
|
+
text = "Conversation Detail Screen: ${conversationDetail.id}",
|
|
230
|
+
style = MaterialTheme.typography.headlineMedium,
|
|
231
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
232
|
+
)
|
|
233
|
+
Spacer(modifier = Modifier.height(16.dp))
|
|
234
|
+
Button(onClick = dropUnlessResumed(block = onProfileClicked)) {
|
|
235
|
+
Text("View Profile")
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
package com.example.nav3recipes.modular.hilt
|
|
243
|
+
|
|
244
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
245
|
+
import androidx.compose.runtime.snapshots.SnapshotStateList
|
|
246
|
+
import androidx.navigation3.runtime.EntryProviderScope
|
|
247
|
+
import dagger.hilt.android.scopes.ActivityRetainedScoped
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
typealias EntryProviderInstaller = EntryProviderScope<Any>.() -> Unit
|
|
251
|
+
|
|
252
|
+
@ActivityRetainedScoped
|
|
253
|
+
class Navigator(startDestination: Any) {
|
|
254
|
+
val backStack : SnapshotStateList<Any> = mutableStateListOf(startDestination)
|
|
255
|
+
|
|
256
|
+
fun goTo(destination: Any){
|
|
257
|
+
backStack.add(destination)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
fun goBack(){
|
|
261
|
+
backStack.removeLastOrNull()
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
package com.example.nav3recipes.modular.hilt
|
|
268
|
+
|
|
269
|
+
import dagger.Module
|
|
270
|
+
import dagger.Provides
|
|
271
|
+
import dagger.hilt.InstallIn
|
|
272
|
+
import dagger.hilt.android.components.ActivityRetainedComponent
|
|
273
|
+
import dagger.hilt.android.scopes.ActivityRetainedScoped
|
|
274
|
+
|
|
275
|
+
@Module
|
|
276
|
+
@InstallIn(ActivityRetainedComponent::class)
|
|
277
|
+
object AppModule {
|
|
278
|
+
|
|
279
|
+
@Provides
|
|
280
|
+
@ActivityRetainedScoped
|
|
281
|
+
fun provideNavigator() : Navigator = Navigator(startDestination = ConversationList)
|
|
282
|
+
}
|
|
283
|
+
```
|
|
@@ -0,0 +1,287 @@
|
|
|
1
|
+
# Modular Navigation Recipe (Koin)
|
|
2
|
+
|
|
3
|
+
This recipe demonstrates how to structure a multi-module application using Navigation 3 and Koin for dependency injection. The goal is to create a decoupled architecture where navigation is defined and implemented in separate feature modules. It relies on the [`koin-compose-navigation3`](https://insert-koin.io/docs/reference/koin-compose/navigation3) artifact.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
The application is divided into several Android modules:
|
|
8
|
+
|
|
9
|
+
- **`app` module** : This is the main application module. It `includes()` the feature modules and initializes a common `Navigator`.
|
|
10
|
+
|
|
11
|
+
- **`common` module** : This module contains the core navigation logic used by both the application module and the feature modules. Namely, it defines a `Navigator` class that manages the back stack.
|
|
12
|
+
|
|
13
|
+
- **Feature modules (e.g., `conversation`, `profile`)**: Each feature is split into two sub-modules:
|
|
14
|
+
|
|
15
|
+
- **`api` module**: Defines the public API for the feature, including its navigation routes. This allows other modules to navigate to this feature without needing to know about its implementation details.
|
|
16
|
+
- **`impl` module** : Provides the implementation of the feature, including its composables and Koin `Module`. The Koin module uses the [`navigation`](https://insert-koin.io/docs/reference/koin-compose/navigation3/#declaring-navigation-entries) DSL to define the entry provider installers for the feature module.
|
|
17
|
+
|
|
18
|
+
This modular approach allows for a clean separation of concerns, making the codebase more scalable and maintainable. Each feature is responsible for its own navigation logic, and the `app` module only combines these pieces together.
|
|
19
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/modular/koin)
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
package com.example.nav3recipes.modular.koin
|
|
23
|
+
|
|
24
|
+
import androidx.compose.foundation.background
|
|
25
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
26
|
+
import androidx.compose.foundation.layout.Column
|
|
27
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
28
|
+
import androidx.compose.foundation.layout.padding
|
|
29
|
+
import androidx.compose.material3.MaterialTheme
|
|
30
|
+
import androidx.compose.material3.Text
|
|
31
|
+
import androidx.compose.runtime.Composable
|
|
32
|
+
import androidx.compose.ui.Alignment
|
|
33
|
+
import androidx.compose.ui.Modifier
|
|
34
|
+
import androidx.compose.ui.unit.dp
|
|
35
|
+
import org.koin.androidx.scope.dsl.activityRetainedScope
|
|
36
|
+
import org.koin.core.annotation.KoinExperimentalAPI
|
|
37
|
+
import org.koin.dsl.module
|
|
38
|
+
import org.koin.dsl.navigation3.navigation
|
|
39
|
+
|
|
40
|
+
// API
|
|
41
|
+
object Profile
|
|
42
|
+
|
|
43
|
+
// IMPL
|
|
44
|
+
@OptIn(KoinExperimentalAPI::class)
|
|
45
|
+
val profileModule = module {
|
|
46
|
+
activityRetainedScope {
|
|
47
|
+
navigation<Profile> { ProfileScreen() }
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@Composable
|
|
52
|
+
private fun ProfileScreen() {
|
|
53
|
+
val profileColor = MaterialTheme.colorScheme.surfaceVariant
|
|
54
|
+
Column(
|
|
55
|
+
modifier = Modifier
|
|
56
|
+
.fillMaxSize()
|
|
57
|
+
.background(profileColor)
|
|
58
|
+
.padding(16.dp),
|
|
59
|
+
horizontalAlignment = Alignment.CenterHorizontally,
|
|
60
|
+
verticalArrangement = Arrangement.Center
|
|
61
|
+
) {
|
|
62
|
+
Text(
|
|
63
|
+
text = "Profile Screen",
|
|
64
|
+
style = MaterialTheme.typography.headlineMedium,
|
|
65
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
package com.example.nav3recipes.modular.koin
|
|
73
|
+
|
|
74
|
+
import androidx.compose.foundation.background
|
|
75
|
+
import androidx.compose.foundation.clickable
|
|
76
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
77
|
+
import androidx.compose.foundation.layout.Column
|
|
78
|
+
import androidx.compose.foundation.layout.Spacer
|
|
79
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
80
|
+
import androidx.compose.foundation.layout.fillMaxWidth
|
|
81
|
+
import androidx.compose.foundation.layout.height
|
|
82
|
+
import androidx.compose.foundation.layout.padding
|
|
83
|
+
import androidx.compose.foundation.lazy.LazyColumn
|
|
84
|
+
import androidx.compose.material3.Button
|
|
85
|
+
import androidx.compose.material3.ListItem
|
|
86
|
+
import androidx.compose.material3.ListItemDefaults
|
|
87
|
+
import androidx.compose.material3.MaterialTheme
|
|
88
|
+
import androidx.compose.material3.Text
|
|
89
|
+
import androidx.compose.runtime.Composable
|
|
90
|
+
import androidx.compose.ui.Alignment
|
|
91
|
+
import androidx.compose.ui.Modifier
|
|
92
|
+
import androidx.compose.ui.graphics.Color
|
|
93
|
+
import androidx.compose.ui.unit.dp
|
|
94
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
95
|
+
import com.example.nav3recipes.ui.theme.colors
|
|
96
|
+
import org.koin.androidx.scope.dsl.activityRetainedScope
|
|
97
|
+
import org.koin.core.annotation.KoinExperimentalAPI
|
|
98
|
+
import org.koin.dsl.module
|
|
99
|
+
import org.koin.dsl.navigation3.navigation
|
|
100
|
+
|
|
101
|
+
// API
|
|
102
|
+
object ConversationList
|
|
103
|
+
data class ConversationDetail(val id: Int) {
|
|
104
|
+
val color: Color
|
|
105
|
+
get() = colors[id % colors.size]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// IMPL
|
|
109
|
+
@OptIn(KoinExperimentalAPI::class)
|
|
110
|
+
val conversationModule = module {
|
|
111
|
+
activityRetainedScope {
|
|
112
|
+
navigation<ConversationList> {
|
|
113
|
+
ConversationListScreen(
|
|
114
|
+
onConversationClicked = { conversationDetail ->
|
|
115
|
+
get<Navigator>().goTo(conversationDetail)
|
|
116
|
+
}
|
|
117
|
+
)
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
navigation<ConversationDetail> { key ->
|
|
121
|
+
ConversationDetailScreen(key) {
|
|
122
|
+
get<Navigator>().goTo(Profile)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Composable
|
|
129
|
+
private fun ConversationListScreen(
|
|
130
|
+
onConversationClicked: (ConversationDetail) -> Unit
|
|
131
|
+
) {
|
|
132
|
+
LazyColumn(
|
|
133
|
+
modifier = Modifier.fillMaxSize(),
|
|
134
|
+
) {
|
|
135
|
+
items(10) { index ->
|
|
136
|
+
val conversationId = index + 1
|
|
137
|
+
val conversationDetail = ConversationDetail(conversationId)
|
|
138
|
+
val backgroundColor = conversationDetail.color
|
|
139
|
+
ListItem(
|
|
140
|
+
modifier = Modifier
|
|
141
|
+
.fillMaxWidth()
|
|
142
|
+
.clickable(onClick = dropUnlessResumed {
|
|
143
|
+
onConversationClicked(conversationDetail)
|
|
144
|
+
}),
|
|
145
|
+
headlineContent = {
|
|
146
|
+
Text(
|
|
147
|
+
text = "Conversation $conversationId",
|
|
148
|
+
style = MaterialTheme.typography.headlineSmall,
|
|
149
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
150
|
+
)
|
|
151
|
+
},
|
|
152
|
+
colors = ListItemDefaults.colors(
|
|
153
|
+
containerColor = backgroundColor // Set container color directly
|
|
154
|
+
)
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
@Composable
|
|
161
|
+
private fun ConversationDetailScreen(
|
|
162
|
+
conversationDetail: ConversationDetail,
|
|
163
|
+
onProfileClicked: () -> Unit
|
|
164
|
+
) {
|
|
165
|
+
Column(
|
|
166
|
+
modifier = Modifier
|
|
167
|
+
.fillMaxSize()
|
|
168
|
+
.background(conversationDetail.color)
|
|
169
|
+
.padding(16.dp),
|
|
170
|
+
horizontalAlignment = Alignment.CenterHorizontally,
|
|
171
|
+
verticalArrangement = Arrangement.Center
|
|
172
|
+
) {
|
|
173
|
+
Text(
|
|
174
|
+
text = "Conversation Detail Screen: ${conversationDetail.id}",
|
|
175
|
+
style = MaterialTheme.typography.headlineMedium,
|
|
176
|
+
color = MaterialTheme.colorScheme.onSurface
|
|
177
|
+
)
|
|
178
|
+
Spacer(modifier = Modifier.height(16.dp))
|
|
179
|
+
Button(onClick = dropUnlessResumed(block = onProfileClicked)) {
|
|
180
|
+
Text("View Profile")
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
```
|
|
187
|
+
package com.example.nav3recipes.modular.koin
|
|
188
|
+
|
|
189
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
190
|
+
import androidx.compose.runtime.snapshots.SnapshotStateList
|
|
191
|
+
|
|
192
|
+
class Navigator(startDestination: Any) {
|
|
193
|
+
val backStack : SnapshotStateList<Any> = mutableStateListOf(startDestination)
|
|
194
|
+
|
|
195
|
+
fun goTo(destination: Any){
|
|
196
|
+
backStack.add(destination)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
fun goBack(){
|
|
200
|
+
backStack.removeLastOrNull()
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
package com.example.nav3recipes.modular.koin
|
|
207
|
+
|
|
208
|
+
import org.koin.androidx.scope.dsl.activityRetainedScope
|
|
209
|
+
import org.koin.dsl.module
|
|
210
|
+
|
|
211
|
+
val appModule = module {
|
|
212
|
+
includes(profileModule,conversationModule)
|
|
213
|
+
|
|
214
|
+
activityRetainedScope {
|
|
215
|
+
scoped {
|
|
216
|
+
Navigator(startDestination = ConversationList)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```
|
|
223
|
+
package com.example.nav3recipes.modular.koin
|
|
224
|
+
|
|
225
|
+
import android.os.Bundle
|
|
226
|
+
import androidx.activity.ComponentActivity
|
|
227
|
+
import androidx.activity.compose.setContent
|
|
228
|
+
import androidx.compose.foundation.layout.padding
|
|
229
|
+
import androidx.compose.material3.Scaffold
|
|
230
|
+
import androidx.compose.ui.Modifier
|
|
231
|
+
import androidx.navigation3.ui.NavDisplay
|
|
232
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
233
|
+
import org.koin.android.ext.android.inject
|
|
234
|
+
import org.koin.android.scope.AndroidScopeComponent
|
|
235
|
+
import org.koin.androidx.compose.navigation3.getEntryProvider
|
|
236
|
+
import org.koin.androidx.scope.activityRetainedScope
|
|
237
|
+
import org.koin.core.Koin
|
|
238
|
+
import org.koin.core.annotation.KoinExperimentalAPI
|
|
239
|
+
import org.koin.core.component.KoinComponent
|
|
240
|
+
import org.koin.core.scope.Scope
|
|
241
|
+
import org.koin.dsl.koinApplication
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* This recipe demonstrates how to use a modular approach with Navigation 3,
|
|
245
|
+
* where different parts of the application are defined in separate modules and injected
|
|
246
|
+
* into the main app using Koin.
|
|
247
|
+
*
|
|
248
|
+
* Features (Conversation and Profile) are split into two modules:
|
|
249
|
+
* - api: defines the public facing routes for this feature
|
|
250
|
+
* - impl: defines the entryProviders for this feature, these are injected into the app's main activity
|
|
251
|
+
* The common module defines:
|
|
252
|
+
* - a common navigator class that exposes a back stack and methods to modify that back stack
|
|
253
|
+
* - a type that should be used by feature modules to inject entryProviders into the app's main activity
|
|
254
|
+
* The app module creates the navigator by supplying a start destination and provides this navigator
|
|
255
|
+
* to the rest of the app module (i.e. MainActivity) and the feature modules.
|
|
256
|
+
*/
|
|
257
|
+
@OptIn(KoinExperimentalAPI::class)
|
|
258
|
+
class KoinModularActivity : ComponentActivity(), AndroidScopeComponent, KoinComponent {
|
|
259
|
+
// Local Koin Context Instance
|
|
260
|
+
companion object {
|
|
261
|
+
private val localKoin = koinApplication {
|
|
262
|
+
modules(appModule)
|
|
263
|
+
}.koin
|
|
264
|
+
}
|
|
265
|
+
// Override default Koin context to use the local one
|
|
266
|
+
override fun getKoin(): Koin = localKoin
|
|
267
|
+
override val scope : Scope by activityRetainedScope()
|
|
268
|
+
val navigator: Navigator by inject()
|
|
269
|
+
|
|
270
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
271
|
+
super.onCreate(savedInstanceState)
|
|
272
|
+
|
|
273
|
+
setEdgeToEdgeConfig()
|
|
274
|
+
setContent {
|
|
275
|
+
Scaffold { paddingValues ->
|
|
276
|
+
NavDisplay(
|
|
277
|
+
backStack = navigator.backStack,
|
|
278
|
+
modifier = Modifier.padding(paddingValues),
|
|
279
|
+
onBack = { navigator.goBack() },
|
|
280
|
+
entryProvider = getEntryProvider()
|
|
281
|
+
)
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
}
|
|
287
|
+
```
|