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,371 @@
|
|
|
1
|
+
# Passing Arguments to ViewModels (Hilt)
|
|
2
|
+
|
|
3
|
+
This recipe demonstrates how to pass navigation arguments (keys) to a `ViewModel` using Hilt for dependency injection.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
This example uses Dagger/Hilt's assisted injection feature:
|
|
8
|
+
|
|
9
|
+
1. The `ViewModel` is annotated with `@HiltViewModel` and its constructor uses `@AssistedInject` to receive the navigation key (which is annotated with `@Assisted`).
|
|
10
|
+
2. An `@AssistedFactory` interface is defined to create the `ViewModel`.
|
|
11
|
+
3. The `hiltViewModel` composable function is used to obtain the `ViewModel` instance. A `creationCallback` is provided to pass the navigation key to the factory, making it available to the `ViewModel`.
|
|
12
|
+
|
|
13
|
+
**Note** : The `rememberViewModelStoreNavEntryDecorator` is added to the `NavDisplay`'s `entryDecorators`. This ensures that `ViewModel`s are correctly scoped to their corresponding `NavEntry`, so that a new `ViewModel` instance is created for each unique navigation key.
|
|
14
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/passingarguments/viewmodels/hilt)
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/*
|
|
18
|
+
* Copyright 2025 The Android Open Source Project
|
|
19
|
+
*
|
|
20
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
21
|
+
* you may not use this file except in compliance with the License.
|
|
22
|
+
* You may obtain a copy of the License at
|
|
23
|
+
*
|
|
24
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
25
|
+
*
|
|
26
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
27
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
28
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
29
|
+
* See the License for the specific language governing permissions and
|
|
30
|
+
* limitations under the License.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
package com.example.nav3recipes.passingarguments.viewmodels.hilt
|
|
34
|
+
|
|
35
|
+
import android.os.Bundle
|
|
36
|
+
import androidx.activity.ComponentActivity
|
|
37
|
+
import androidx.activity.compose.setContent
|
|
38
|
+
import androidx.compose.foundation.lazy.LazyColumn
|
|
39
|
+
import androidx.compose.material3.Button
|
|
40
|
+
import androidx.compose.material3.Text
|
|
41
|
+
import androidx.compose.runtime.Composable
|
|
42
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
43
|
+
import androidx.compose.runtime.remember
|
|
44
|
+
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
|
|
45
|
+
import androidx.lifecycle.ViewModel
|
|
46
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
47
|
+
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
|
|
48
|
+
import androidx.navigation3.runtime.entryProvider
|
|
49
|
+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
|
|
50
|
+
import androidx.navigation3.ui.NavDisplay
|
|
51
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
52
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
53
|
+
import com.example.nav3recipes.passingarguments.viewmodels.basic.RouteB
|
|
54
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
55
|
+
import dagger.assisted.Assisted
|
|
56
|
+
import dagger.assisted.AssistedFactory
|
|
57
|
+
import dagger.assisted.AssistedInject
|
|
58
|
+
import dagger.hilt.android.AndroidEntryPoint
|
|
59
|
+
import dagger.hilt.android.lifecycle.HiltViewModel
|
|
60
|
+
|
|
61
|
+
data object RouteA
|
|
62
|
+
data class RouteB(val id: String)
|
|
63
|
+
|
|
64
|
+
@AndroidEntryPoint
|
|
65
|
+
class HiltViewModelsActivity : ComponentActivity() {
|
|
66
|
+
|
|
67
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
68
|
+
setEdgeToEdgeConfig()
|
|
69
|
+
super.onCreate(savedInstanceState)
|
|
70
|
+
setContent {
|
|
71
|
+
val backStack = remember { mutableStateListOf<Any>(RouteA) }
|
|
72
|
+
|
|
73
|
+
NavDisplay(
|
|
74
|
+
backStack = backStack,
|
|
75
|
+
onBack = { backStack.removeLastOrNull() },
|
|
76
|
+
|
|
77
|
+
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
|
|
78
|
+
// we also need to add the default `NavEntryDecorator`s as well. These provide
|
|
79
|
+
// extra information to the entry's content to enable it to display correctly
|
|
80
|
+
// and save its state.
|
|
81
|
+
entryDecorators = listOf(
|
|
82
|
+
rememberSaveableStateHolderNavEntryDecorator(),
|
|
83
|
+
rememberViewModelStoreNavEntryDecorator()
|
|
84
|
+
),
|
|
85
|
+
entryProvider = entryProvider {
|
|
86
|
+
entry<RouteA> {
|
|
87
|
+
ContentGreen("Welcome to Nav3") {
|
|
88
|
+
LazyColumn {
|
|
89
|
+
items(10) { i ->
|
|
90
|
+
Button(onClick = dropUnlessResumed {
|
|
91
|
+
backStack.add(RouteB("$i"))
|
|
92
|
+
}) {
|
|
93
|
+
Text("$i")
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
entry<RouteB> { key ->
|
|
100
|
+
val viewModel = hiltViewModel<RouteBViewModel, RouteBViewModel.Factory>(
|
|
101
|
+
// Note: We need a new ViewModel for every new RouteB instance. Usually
|
|
102
|
+
// we would need to supply a `key` String that is unique to the
|
|
103
|
+
// instance, however, the ViewModelStoreNavEntryDecorator (supplied
|
|
104
|
+
// above) does this for us, using `NavEntry.contentKey` to uniquely
|
|
105
|
+
// identify the viewModel.
|
|
106
|
+
//
|
|
107
|
+
// tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
|
|
108
|
+
// if you want a new ViewModel for each new navigation key instance.
|
|
109
|
+
creationCallback = { factory ->
|
|
110
|
+
factory.create(key)
|
|
111
|
+
}
|
|
112
|
+
)
|
|
113
|
+
ScreenB(viewModel = viewModel)
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
@Composable
|
|
122
|
+
fun ScreenB(viewModel: RouteBViewModel) {
|
|
123
|
+
ContentBlue("Route id: ${viewModel.navKey.id} ")
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@HiltViewModel(assistedFactory = RouteBViewModel.Factory::class)
|
|
127
|
+
class RouteBViewModel @AssistedInject constructor(
|
|
128
|
+
@Assisted val navKey: RouteB
|
|
129
|
+
) : ViewModel() {
|
|
130
|
+
|
|
131
|
+
@AssistedFactory
|
|
132
|
+
interface Factory {
|
|
133
|
+
fun create(navKey: RouteB): RouteBViewModel
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
# Passing Arguments to ViewModels (Basic)
|
|
139
|
+
|
|
140
|
+
This recipe demonstrates how to pass navigation arguments (keys) to a `ViewModel` using a custom `ViewModelProvider.Factory`.
|
|
141
|
+
|
|
142
|
+
## How it works
|
|
143
|
+
|
|
144
|
+
1. A custom `ViewModelProvider.Factory` is created that takes the navigation key as a constructor parameter.
|
|
145
|
+
2. Inside the `entry` composable, `viewModel(factory = ...)` is used to create the `ViewModel` instance, passing the current navigation key to the factory. This makes the navigation key available to the `ViewModel`.
|
|
146
|
+
|
|
147
|
+
**Note** : The `rememberViewModelStoreNavEntryDecorator` is added to the `NavDisplay`'s `entryDecorators`. This ensures that `ViewModel`s are correctly scoped to their corresponding `NavEntry`, so that a new `ViewModel` instance is created for each unique navigation key.
|
|
148
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/passingarguments/viewmodels/basic)
|
|
149
|
+
|
|
150
|
+
```
|
|
151
|
+
/*
|
|
152
|
+
* Copyright 2025 The Android Open Source Project
|
|
153
|
+
*
|
|
154
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
155
|
+
* you may not use this file except in compliance with the License.
|
|
156
|
+
* You may obtain a copy of the License at
|
|
157
|
+
*
|
|
158
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
159
|
+
*
|
|
160
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
161
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
162
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
163
|
+
* See the License for the specific language governing permissions and
|
|
164
|
+
* limitations under the License.
|
|
165
|
+
*/
|
|
166
|
+
|
|
167
|
+
package com.example.nav3recipes.passingarguments.viewmodels.basic
|
|
168
|
+
|
|
169
|
+
import android.os.Bundle
|
|
170
|
+
import androidx.activity.ComponentActivity
|
|
171
|
+
import androidx.activity.compose.setContent
|
|
172
|
+
import androidx.compose.foundation.lazy.LazyColumn
|
|
173
|
+
import androidx.compose.material3.Button
|
|
174
|
+
import androidx.compose.material3.Text
|
|
175
|
+
import androidx.compose.runtime.Composable
|
|
176
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
177
|
+
import androidx.compose.runtime.remember
|
|
178
|
+
import androidx.lifecycle.ViewModel
|
|
179
|
+
import androidx.lifecycle.ViewModelProvider
|
|
180
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
181
|
+
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
182
|
+
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
|
|
183
|
+
import androidx.navigation3.runtime.entryProvider
|
|
184
|
+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
|
|
185
|
+
import androidx.navigation3.ui.NavDisplay
|
|
186
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
187
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
188
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
189
|
+
|
|
190
|
+
data object RouteA
|
|
191
|
+
|
|
192
|
+
data class RouteB(val id: String)
|
|
193
|
+
|
|
194
|
+
class BasicViewModelsActivity : ComponentActivity() {
|
|
195
|
+
|
|
196
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
197
|
+
setEdgeToEdgeConfig()
|
|
198
|
+
super.onCreate(savedInstanceState)
|
|
199
|
+
setContent {
|
|
200
|
+
val backStack = remember { mutableStateListOf<Any>(RouteA) }
|
|
201
|
+
|
|
202
|
+
NavDisplay(
|
|
203
|
+
backStack = backStack,
|
|
204
|
+
onBack = { backStack.removeLastOrNull() },
|
|
205
|
+
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
|
|
206
|
+
// we also need to add the default `NavEntryDecorator`s as well. These provide
|
|
207
|
+
// extra information to the entry's content to enable it to display correctly
|
|
208
|
+
// and save its state.
|
|
209
|
+
entryDecorators = listOf(
|
|
210
|
+
rememberSaveableStateHolderNavEntryDecorator(),
|
|
211
|
+
rememberViewModelStoreNavEntryDecorator()
|
|
212
|
+
),
|
|
213
|
+
entryProvider = entryProvider {
|
|
214
|
+
entry<RouteA> {
|
|
215
|
+
ContentGreen("Welcome to Nav3") {
|
|
216
|
+
LazyColumn {
|
|
217
|
+
items(10) { i ->
|
|
218
|
+
Button(onClick = dropUnlessResumed {
|
|
219
|
+
backStack.add(RouteB("$i"))
|
|
220
|
+
}) {
|
|
221
|
+
Text("$i")
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
entry<RouteB> { key ->
|
|
228
|
+
// Note: We need a new ViewModel for every new RouteB instance. Usually
|
|
229
|
+
// we would need to supply a `key` String that is unique to the
|
|
230
|
+
// instance, however, the ViewModelStoreNavEntryDecorator (supplied
|
|
231
|
+
// above) does this for us, using `NavEntry.contentKey` to uniquely
|
|
232
|
+
// identify the viewModel.
|
|
233
|
+
//
|
|
234
|
+
// tl;dr: Make sure you use rememberViewModelStoreNavEntryDecorator()
|
|
235
|
+
// if you want a new ViewModel for each new navigation key instance.
|
|
236
|
+
ScreenB(viewModel = viewModel(factory = RouteBViewModel.Factory(key)))
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
@Composable
|
|
245
|
+
fun ScreenB(viewModel: RouteBViewModel = viewModel()) {
|
|
246
|
+
ContentBlue("Route id: ${viewModel.key.id} ")
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
class RouteBViewModel(
|
|
250
|
+
val key: RouteB
|
|
251
|
+
) : ViewModel() {
|
|
252
|
+
class Factory(
|
|
253
|
+
private val key: RouteB,
|
|
254
|
+
) : ViewModelProvider.Factory {
|
|
255
|
+
override fun <T : ViewModel> create(modelClass: Class<T>): T {
|
|
256
|
+
return RouteBViewModel(key) as T
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
# Passing Arguments to ViewModels (Koin)
|
|
263
|
+
|
|
264
|
+
This recipe demonstrates how to pass navigation arguments (keys) to a `ViewModel` using Koin for dependency injection.
|
|
265
|
+
|
|
266
|
+
## How it works
|
|
267
|
+
|
|
268
|
+
1. A Koin module is defined that provides the `ViewModel`.
|
|
269
|
+
2. The `koinViewModel` composable function is used to get the `ViewModel` instance.
|
|
270
|
+
3. The navigation key is passed to the `ViewModel`'s constructor using `parametersOf(key)`. This makes the navigation key available to the `ViewModel`.
|
|
271
|
+
|
|
272
|
+
**Note** : The `rememberViewModelStoreNavEntryDecorator` is added to the `NavDisplay`'s `entryDecorators`. This ensures that `ViewModel`s are correctly scoped to their corresponding `NavEntry`, so that a new `ViewModel` instance is created for each unique navigation key.
|
|
273
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/passingarguments/viewmodels/koin)
|
|
274
|
+
|
|
275
|
+
```
|
|
276
|
+
package com.example.nav3recipes.passingarguments.viewmodels.koin
|
|
277
|
+
|
|
278
|
+
import android.os.Bundle
|
|
279
|
+
import androidx.activity.ComponentActivity
|
|
280
|
+
import androidx.activity.compose.setContent
|
|
281
|
+
import androidx.compose.foundation.lazy.LazyColumn
|
|
282
|
+
import androidx.compose.material3.Button
|
|
283
|
+
import androidx.compose.material3.Text
|
|
284
|
+
import androidx.compose.runtime.Composable
|
|
285
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
286
|
+
import androidx.compose.runtime.remember
|
|
287
|
+
import androidx.lifecycle.ViewModel
|
|
288
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
289
|
+
import androidx.lifecycle.viewmodel.navigation3.rememberViewModelStoreNavEntryDecorator
|
|
290
|
+
import androidx.navigation3.runtime.entryProvider
|
|
291
|
+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
|
|
292
|
+
import androidx.navigation3.ui.NavDisplay
|
|
293
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
294
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
295
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
296
|
+
import org.koin.compose.KoinApplication
|
|
297
|
+
import org.koin.compose.viewmodel.koinViewModel
|
|
298
|
+
import org.koin.core.module.dsl.viewModelOf
|
|
299
|
+
import org.koin.core.parameter.parametersOf
|
|
300
|
+
import org.koin.dsl.koinConfiguration
|
|
301
|
+
import org.koin.dsl.module
|
|
302
|
+
|
|
303
|
+
data object RouteA
|
|
304
|
+
data class RouteB(val id: String)
|
|
305
|
+
|
|
306
|
+
class KoinViewModelsActivity : ComponentActivity() {
|
|
307
|
+
|
|
308
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
309
|
+
|
|
310
|
+
setEdgeToEdgeConfig()
|
|
311
|
+
super.onCreate(savedInstanceState)
|
|
312
|
+
setContent {
|
|
313
|
+
val backStack = remember { mutableStateListOf<Any>(RouteA) }
|
|
314
|
+
|
|
315
|
+
// Koin Compose Entry point
|
|
316
|
+
KoinApplication(
|
|
317
|
+
configuration = koinConfiguration {
|
|
318
|
+
modules(appModule)
|
|
319
|
+
}
|
|
320
|
+
) {
|
|
321
|
+
NavDisplay(
|
|
322
|
+
backStack = backStack,
|
|
323
|
+
onBack = { backStack.removeLastOrNull() },
|
|
324
|
+
|
|
325
|
+
// In order to add the `ViewModelStoreNavEntryDecorator` (see comment below for why)
|
|
326
|
+
// we also need to add the default `NavEntryDecorator`s as well. These provide
|
|
327
|
+
// extra information to the entry's content to enable it to display correctly
|
|
328
|
+
// and save its state.
|
|
329
|
+
entryDecorators = listOf(
|
|
330
|
+
rememberSaveableStateHolderNavEntryDecorator(),
|
|
331
|
+
rememberViewModelStoreNavEntryDecorator()
|
|
332
|
+
),
|
|
333
|
+
entryProvider = entryProvider {
|
|
334
|
+
entry<RouteA> {
|
|
335
|
+
ContentGreen("Welcome to Nav3") {
|
|
336
|
+
LazyColumn {
|
|
337
|
+
items(10) { i ->
|
|
338
|
+
Button(onClick = dropUnlessResumed {
|
|
339
|
+
backStack.add(RouteB("$i"))
|
|
340
|
+
}) {
|
|
341
|
+
Text("$i")
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
entry<RouteB> { key ->
|
|
348
|
+
val viewModel = koinViewModel<RouteBViewModel> {
|
|
349
|
+
parametersOf(key)
|
|
350
|
+
}
|
|
351
|
+
ScreenB(viewModel = viewModel)
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
)
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Local Koin Module
|
|
361
|
+
private val appModule = module {
|
|
362
|
+
viewModelOf(::RouteBViewModel)
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
@Composable
|
|
366
|
+
fun ScreenB(viewModel: RouteBViewModel) {
|
|
367
|
+
ContentBlue("Route id: ${viewModel.navKey.id} ")
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
class RouteBViewModel(val navKey: RouteB) : ViewModel()
|
|
371
|
+
```
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
# Returning a Result (Event-Based)
|
|
2
|
+
|
|
3
|
+
This recipe demonstrates how to return a result from one screen to a previous screen using an event-based approach.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
This example uses a `ResultEventBus` to facilitate communication between the screens.
|
|
8
|
+
|
|
9
|
+
1. **ResultEventBusNavEntryDecorator** : A `NavEntryDecorator` that provides a `ResultEventBus` via `LocalResultEventBus`.
|
|
10
|
+
2. **`ResultEventBus`** : A `ResultEventBus` is created and made available to the composables via `LocalResultEventBus`. This EventBus sends and receives the results.
|
|
11
|
+
3. **Sending the result** : The screen that produces the result calls `resultBus.sendResult(person)` to send the data back as a one-time event.
|
|
12
|
+
4. **Receiving the result** : The screen that needs the result uses a `ResultEffect` composable to listen for results of a specific type. When a result is received, the effect's lambda is triggered.
|
|
13
|
+
|
|
14
|
+
This approach is useful for results that are transient and should be handled as one-time events.
|
|
15
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/results/event)
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
/*
|
|
19
|
+
* Copyright 2025 The Android Open Source Project
|
|
20
|
+
*
|
|
21
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
22
|
+
* you may not use this file except in compliance with the License.
|
|
23
|
+
* You may obtain a copy of the License at
|
|
24
|
+
*
|
|
25
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
26
|
+
*
|
|
27
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
28
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
29
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
30
|
+
* See the License for the specific language governing permissions and
|
|
31
|
+
* limitations under the License.
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
package com.example.nav3recipes.results.common
|
|
35
|
+
|
|
36
|
+
import androidx.compose.runtime.getValue
|
|
37
|
+
import androidx.compose.runtime.mutableStateOf
|
|
38
|
+
import androidx.compose.runtime.setValue
|
|
39
|
+
import androidx.lifecycle.ViewModel
|
|
40
|
+
|
|
41
|
+
class HomeViewModel : ViewModel() {
|
|
42
|
+
var person by mutableStateOf<Person?>(null)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
/*
|
|
48
|
+
* Copyright 2025 The Android Open Source Project
|
|
49
|
+
*
|
|
50
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
51
|
+
* you may not use this file except in compliance with the License.
|
|
52
|
+
* You may obtain a copy of the License at
|
|
53
|
+
*
|
|
54
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
55
|
+
*
|
|
56
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
57
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
58
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
59
|
+
* See the License for the specific language governing permissions and
|
|
60
|
+
* limitations under the License.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
package com.example.nav3recipes.results.common
|
|
64
|
+
|
|
65
|
+
import androidx.navigation3.runtime.NavKey
|
|
66
|
+
import kotlinx.serialization.Serializable
|
|
67
|
+
|
|
68
|
+
@Serializable
|
|
69
|
+
data object Home : NavKey
|
|
70
|
+
|
|
71
|
+
@Serializable
|
|
72
|
+
class PersonDetailsForm : NavKey
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
/*
|
|
77
|
+
* Copyright 2025 The Android Open Source Project
|
|
78
|
+
*
|
|
79
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
80
|
+
* you may not use this file except in compliance with the License.
|
|
81
|
+
* You may obtain a copy of the License at
|
|
82
|
+
*
|
|
83
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
84
|
+
*
|
|
85
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
86
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
87
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
88
|
+
* See the License for the specific language governing permissions and
|
|
89
|
+
* limitations under the License.
|
|
90
|
+
*/
|
|
91
|
+
|
|
92
|
+
package com.example.nav3recipes.results.common
|
|
93
|
+
|
|
94
|
+
import kotlinx.serialization.Serializable
|
|
95
|
+
|
|
96
|
+
@Serializable
|
|
97
|
+
data class Person(val name: String, val favoriteColor: String)
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
/*
|
|
102
|
+
* Copyright 2025 The Android Open Source Project
|
|
103
|
+
*
|
|
104
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
105
|
+
* you may not use this file except in compliance with the License.
|
|
106
|
+
* You may obtain a copy of the License at
|
|
107
|
+
*
|
|
108
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
109
|
+
*
|
|
110
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
111
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
112
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
113
|
+
* See the License for the specific language governing permissions and
|
|
114
|
+
* limitations under the License.
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
package com.example.nav3recipes.results.common
|
|
118
|
+
|
|
119
|
+
import androidx.compose.foundation.layout.Spacer
|
|
120
|
+
import androidx.compose.foundation.layout.height
|
|
121
|
+
import androidx.compose.foundation.text.input.rememberTextFieldState
|
|
122
|
+
import androidx.compose.material3.Button
|
|
123
|
+
import androidx.compose.material3.OutlinedTextField
|
|
124
|
+
import androidx.compose.material3.Text
|
|
125
|
+
import androidx.compose.runtime.Composable
|
|
126
|
+
import androidx.compose.ui.Modifier
|
|
127
|
+
import androidx.compose.ui.unit.dp
|
|
128
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
129
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
130
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
131
|
+
|
|
132
|
+
@Composable
|
|
133
|
+
fun HomeScreen(
|
|
134
|
+
person: Person?,
|
|
135
|
+
onNext: () -> Unit
|
|
136
|
+
) {
|
|
137
|
+
ContentBlue("Hello ${person?.name ?: "unknown person"}") {
|
|
138
|
+
|
|
139
|
+
if (person != null) {
|
|
140
|
+
Text("Your favorite color is ${person.favoriteColor}")
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
Spacer(Modifier.height(16.dp))
|
|
144
|
+
Button(onClick = dropUnlessResumed(block = onNext)) {
|
|
145
|
+
Text("Tell us about yourself")
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@Composable
|
|
151
|
+
fun PersonDetailsScreen(
|
|
152
|
+
onSubmit: (Person) -> Unit
|
|
153
|
+
) {
|
|
154
|
+
ContentGreen("About you") {
|
|
155
|
+
|
|
156
|
+
val nameTextState = rememberTextFieldState()
|
|
157
|
+
OutlinedTextField(
|
|
158
|
+
state = nameTextState,
|
|
159
|
+
label = { Text("Please enter your name") }
|
|
160
|
+
)
|
|
161
|
+
|
|
162
|
+
val favoriteColorTextState = rememberTextFieldState()
|
|
163
|
+
OutlinedTextField(
|
|
164
|
+
state = favoriteColorTextState,
|
|
165
|
+
label = { Text("Please enter your favorite color") }
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
Button(
|
|
169
|
+
onClick = dropUnlessResumed {
|
|
170
|
+
val person = Person(
|
|
171
|
+
name = nameTextState.text.toString(),
|
|
172
|
+
favoriteColor = favoriteColorTextState.text.toString()
|
|
173
|
+
)
|
|
174
|
+
onSubmit(person)
|
|
175
|
+
},
|
|
176
|
+
enabled = nameTextState.text.isNotBlank() &&
|
|
177
|
+
favoriteColorTextState.text.isNotBlank()
|
|
178
|
+
) {
|
|
179
|
+
Text("Submit")
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```
|
|
186
|
+
/*
|
|
187
|
+
* Copyright 2025 The Android Open Source Project
|
|
188
|
+
*
|
|
189
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
190
|
+
* you may not use this file except in compliance with the License.
|
|
191
|
+
* You may obtain a copy of the License at
|
|
192
|
+
*
|
|
193
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
194
|
+
*
|
|
195
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
196
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
197
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
198
|
+
* See the License for the specific language governing permissions and
|
|
199
|
+
* limitations under the License.
|
|
200
|
+
*/
|
|
201
|
+
|
|
202
|
+
package com.example.nav3recipes.results.event
|
|
203
|
+
|
|
204
|
+
import android.os.Bundle
|
|
205
|
+
import androidx.activity.ComponentActivity
|
|
206
|
+
import androidx.activity.compose.setContent
|
|
207
|
+
import androidx.compose.foundation.layout.padding
|
|
208
|
+
import androidx.compose.material3.Scaffold
|
|
209
|
+
import androidx.compose.ui.Modifier
|
|
210
|
+
import androidx.lifecycle.viewmodel.compose.viewModel
|
|
211
|
+
import androidx.navigation3.runtime.entryProvider
|
|
212
|
+
import androidx.navigation3.runtime.rememberNavBackStack
|
|
213
|
+
import androidx.navigation3.runtime.rememberSaveableStateHolderNavEntryDecorator
|
|
214
|
+
import androidx.navigation3.runtime.result.LocalResultEventBus
|
|
215
|
+
import androidx.navigation3.runtime.result.ResultEffect
|
|
216
|
+
import androidx.navigation3.runtime.result.rememberResultEventBusNavEntryDecorator
|
|
217
|
+
import androidx.navigation3.ui.NavDisplay
|
|
218
|
+
import com.example.nav3recipes.results.common.Home
|
|
219
|
+
import com.example.nav3recipes.results.common.HomeScreen
|
|
220
|
+
import com.example.nav3recipes.results.common.HomeViewModel
|
|
221
|
+
import com.example.nav3recipes.results.common.Person
|
|
222
|
+
import com.example.nav3recipes.results.common.PersonDetailsForm
|
|
223
|
+
import com.example.nav3recipes.results.common.PersonDetailsScreen
|
|
224
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
225
|
+
|
|
226
|
+
class ResultEventActivity : ComponentActivity() {
|
|
227
|
+
|
|
228
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
229
|
+
setEdgeToEdgeConfig()
|
|
230
|
+
super.onCreate(savedInstanceState)
|
|
231
|
+
|
|
232
|
+
setContent {
|
|
233
|
+
Scaffold { paddingValues ->
|
|
234
|
+
|
|
235
|
+
val backStack = rememberNavBackStack(Home)
|
|
236
|
+
|
|
237
|
+
NavDisplay(
|
|
238
|
+
backStack = backStack,
|
|
239
|
+
modifier = Modifier.padding(paddingValues),
|
|
240
|
+
onBack = { backStack.removeLastOrNull() },
|
|
241
|
+
entryDecorators = listOf(
|
|
242
|
+
rememberSaveableStateHolderNavEntryDecorator(),
|
|
243
|
+
rememberResultEventBusNavEntryDecorator()
|
|
244
|
+
),
|
|
245
|
+
entryProvider = entryProvider {
|
|
246
|
+
entry<Home> {
|
|
247
|
+
val viewModel = viewModel<HomeViewModel>(key = Home.toString())
|
|
248
|
+
ResultEffect<Person> { person ->
|
|
249
|
+
viewModel.person = person
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
val person = viewModel.person
|
|
253
|
+
HomeScreen(
|
|
254
|
+
person = person,
|
|
255
|
+
onNext = { backStack.add(PersonDetailsForm()) }
|
|
256
|
+
)
|
|
257
|
+
}
|
|
258
|
+
entry<PersonDetailsForm> {
|
|
259
|
+
val resultBus = LocalResultEventBus.current
|
|
260
|
+
PersonDetailsScreen(
|
|
261
|
+
onSubmit = { person ->
|
|
262
|
+
resultBus.sendResult<Person>(result = person)
|
|
263
|
+
backStack.removeLastOrNull()
|
|
264
|
+
}
|
|
265
|
+
)
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
)
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
```
|