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,147 @@
|
|
|
1
|
+
# Animations Recipe
|
|
2
|
+
|
|
3
|
+
This recipe shows how to override the default animations at the `NavDisplay` level, and at the individual destination level.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
The `NavDisplay` composable takes `transitionSpec`, `popTransitionSpec`, and `predictivePopTransitionSpec` parameters to define the animations for forward, backward, and predictive back navigation respectively. These animations will be applied to all destinations by default.
|
|
8
|
+
|
|
9
|
+
In this example, we use `slideInHorizontally` and `slideOutHorizontally` to create a sliding animation for forward and backward navigation.
|
|
10
|
+
|
|
11
|
+
It is also possible to override these animations for a specific destination by providing a different `transitionSpec` and `popTransitionSpec` to the `entry` composable. In this recipe, `ScreenC` has a custom vertical slide animation.
|
|
12
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/animations)
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
package com.example.nav3recipes.animations
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
import android.os.Bundle
|
|
19
|
+
import androidx.activity.ComponentActivity
|
|
20
|
+
import androidx.activity.compose.setContent
|
|
21
|
+
import androidx.compose.animation.EnterTransition
|
|
22
|
+
import androidx.compose.animation.ExitTransition
|
|
23
|
+
import androidx.compose.animation.core.tween
|
|
24
|
+
import androidx.compose.animation.slideInHorizontally
|
|
25
|
+
import androidx.compose.animation.slideInVertically
|
|
26
|
+
import androidx.compose.animation.slideOutHorizontally
|
|
27
|
+
import androidx.compose.animation.slideOutVertically
|
|
28
|
+
import androidx.compose.animation.togetherWith
|
|
29
|
+
import androidx.compose.material3.Button
|
|
30
|
+
import androidx.compose.material3.Text
|
|
31
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
32
|
+
import androidx.navigation3.runtime.NavKey
|
|
33
|
+
import androidx.navigation3.runtime.entryProvider
|
|
34
|
+
import androidx.navigation3.runtime.metadata
|
|
35
|
+
import androidx.navigation3.runtime.rememberNavBackStack
|
|
36
|
+
import androidx.navigation3.ui.NavDisplay
|
|
37
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
38
|
+
import com.example.nav3recipes.content.ContentMauve
|
|
39
|
+
import com.example.nav3recipes.content.ContentOrange
|
|
40
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
41
|
+
import kotlinx.serialization.Serializable
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@Serializable
|
|
45
|
+
private data object ScreenA : NavKey
|
|
46
|
+
|
|
47
|
+
@Serializable
|
|
48
|
+
private data object ScreenB : NavKey
|
|
49
|
+
|
|
50
|
+
@Serializable
|
|
51
|
+
private data object ScreenC : NavKey
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class AnimatedActivity : ComponentActivity() {
|
|
55
|
+
|
|
56
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
57
|
+
setEdgeToEdgeConfig()
|
|
58
|
+
super.onCreate(savedInstanceState)
|
|
59
|
+
setContent {
|
|
60
|
+
|
|
61
|
+
val backStack = rememberNavBackStack(ScreenA)
|
|
62
|
+
|
|
63
|
+
NavDisplay(
|
|
64
|
+
backStack = backStack,
|
|
65
|
+
onBack = { backStack.removeLastOrNull() },
|
|
66
|
+
entryProvider = entryProvider {
|
|
67
|
+
entry<ScreenA> {
|
|
68
|
+
ContentOrange("This is Screen A") {
|
|
69
|
+
Button(onClick = dropUnlessResumed { backStack.add(ScreenB) }) {
|
|
70
|
+
Text("Go to Screen B")
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
entry<ScreenB> {
|
|
75
|
+
ContentMauve("This is Screen B") {
|
|
76
|
+
Button(onClick = dropUnlessResumed { backStack.add(ScreenC) }) {
|
|
77
|
+
Text("Go to Screen C")
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
entry<ScreenC>(
|
|
82
|
+
metadata = metadata {
|
|
83
|
+
// Slide new content up, keeping the old content in place underneath
|
|
84
|
+
put(NavDisplay.TransitionKey) {
|
|
85
|
+
slideInVertically(
|
|
86
|
+
initialOffsetY = { it },
|
|
87
|
+
animationSpec = tween(1000)
|
|
88
|
+
) togetherWith ExitTransition.KeepUntilTransitionsFinished
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Slide old content down, revealing the new content in place underneath
|
|
92
|
+
put(NavDisplay.PopTransitionKey) {
|
|
93
|
+
EnterTransition.None togetherWith
|
|
94
|
+
slideOutVertically(
|
|
95
|
+
targetOffsetY = { it },
|
|
96
|
+
animationSpec = tween(1000)
|
|
97
|
+
)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Slide old content down, revealing the new content in place underneath
|
|
101
|
+
put(NavDisplay.PredictivePopTransitionKey) {
|
|
102
|
+
EnterTransition.None togetherWith
|
|
103
|
+
slideOutVertically(
|
|
104
|
+
targetOffsetY = { it },
|
|
105
|
+
animationSpec = tween(1000)
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
) {
|
|
110
|
+
ContentGreen("This is Screen C")
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
transitionSpec = {
|
|
114
|
+
// Slide in from right when navigating forward
|
|
115
|
+
slideInHorizontally(
|
|
116
|
+
initialOffsetX = { it },
|
|
117
|
+
animationSpec = tween(1000)
|
|
118
|
+
) togetherWith slideOutHorizontally(
|
|
119
|
+
targetOffsetX = { -it },
|
|
120
|
+
animationSpec = tween(1000)
|
|
121
|
+
)
|
|
122
|
+
},
|
|
123
|
+
popTransitionSpec = {
|
|
124
|
+
// Slide in from left when navigating back
|
|
125
|
+
slideInHorizontally(
|
|
126
|
+
initialOffsetX = { -it },
|
|
127
|
+
animationSpec = tween(1000)
|
|
128
|
+
) togetherWith slideOutHorizontally(
|
|
129
|
+
targetOffsetX = { it },
|
|
130
|
+
animationSpec = tween(1000)
|
|
131
|
+
)
|
|
132
|
+
},
|
|
133
|
+
predictivePopTransitionSpec = {
|
|
134
|
+
// Slide in from left when navigating back
|
|
135
|
+
slideInHorizontally(
|
|
136
|
+
initialOffsetX = { -it },
|
|
137
|
+
animationSpec = tween(1000)
|
|
138
|
+
) togetherWith slideOutHorizontally(
|
|
139
|
+
targetOffsetX = { it },
|
|
140
|
+
animationSpec = tween(1000)
|
|
141
|
+
)
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
```
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# Basic Recipe
|
|
2
|
+
|
|
3
|
+
This recipe shows a basic example of how to use the Navigation 3 API with two screens.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
This example defines two routes: `RouteA` and `RouteB`. `RouteA` is a `data object` representing a simple screen, while `RouteB` is a `data class` that takes an `id` as a parameter.
|
|
8
|
+
|
|
9
|
+
A `mutableStateListOf<Any>` is used to manage the navigation back stack.
|
|
10
|
+
|
|
11
|
+
The `NavDisplay` composable is used to display the current screen. Its `entryProvider` parameter is a lambda that takes a route from the back stack and returns a `NavEntry`. Inside the `entryProvider`, a `when` statement is used to determine which composable to display based on the route.
|
|
12
|
+
|
|
13
|
+
To navigate from `RouteA` to `RouteB`, we simply add a `RouteB` instance to the back stack. The `id` is passed as an argument to the `RouteB` data class.
|
|
14
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/basic)
|
|
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.basic
|
|
34
|
+
|
|
35
|
+
import android.os.Bundle
|
|
36
|
+
import androidx.activity.ComponentActivity
|
|
37
|
+
import androidx.activity.compose.setContent
|
|
38
|
+
import androidx.compose.material3.Button
|
|
39
|
+
import androidx.compose.material3.Text
|
|
40
|
+
import androidx.compose.runtime.mutableStateListOf
|
|
41
|
+
import androidx.compose.runtime.remember
|
|
42
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
43
|
+
import androidx.navigation3.runtime.NavEntry
|
|
44
|
+
import androidx.navigation3.ui.NavDisplay
|
|
45
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
46
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
47
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
48
|
+
|
|
49
|
+
private data object RouteA
|
|
50
|
+
|
|
51
|
+
private data class RouteB(val id: String)
|
|
52
|
+
|
|
53
|
+
class BasicActivity : ComponentActivity() {
|
|
54
|
+
|
|
55
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
56
|
+
setEdgeToEdgeConfig()
|
|
57
|
+
super.onCreate(savedInstanceState)
|
|
58
|
+
setContent {
|
|
59
|
+
val backStack = remember { mutableStateListOf<Any>(RouteA) }
|
|
60
|
+
|
|
61
|
+
NavDisplay(
|
|
62
|
+
backStack = backStack,
|
|
63
|
+
onBack = { backStack.removeLastOrNull() },
|
|
64
|
+
entryProvider = { key ->
|
|
65
|
+
when (key) {
|
|
66
|
+
is RouteA -> NavEntry(key) {
|
|
67
|
+
ContentGreen("Welcome to Nav3") {
|
|
68
|
+
Button(onClick = dropUnlessResumed {
|
|
69
|
+
backStack.add(RouteB("123"))
|
|
70
|
+
}) {
|
|
71
|
+
Text("Click to navigate")
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
is RouteB -> NavEntry(key) {
|
|
77
|
+
ContentBlue("Route id: ${key.id} ")
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
else -> {
|
|
81
|
+
error("Unknown route: $key")
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
```
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Basic DSL Recipe
|
|
2
|
+
|
|
3
|
+
This recipe shows a basic example of how to use the Navigation 3 API with two screens, using the `entryProvider` DSL and a persistent back stack.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
This example is similar to the basic recipe, but with a few key differences:
|
|
8
|
+
|
|
9
|
+
1. **Persistent Back Stack** : It uses `rememberNavBackStack(RouteA)` to create and remember the back stack. This makes the back stack persistent across configuration changes (e.g., screen rotation). To use `rememberNavBackStack`, the navigation keys must be serializable, which is why `RouteA` and `RouteB` are annotated with `@Serializable` and implement the `NavKey` interface.
|
|
10
|
+
|
|
11
|
+
2. **`entryProvider` DSL** : Instead of a `when` statement, this example uses the `entryProvider` DSL to define the content for each route. The `entry<RouteType>` function is used to associate a route type with its composable content.
|
|
12
|
+
|
|
13
|
+
The navigation logic remains the same: to navigate from `RouteA` to `RouteB`, we add a `RouteB` instance to the back stack.
|
|
14
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/basicdsl)
|
|
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.basicdsl
|
|
34
|
+
|
|
35
|
+
import android.os.Bundle
|
|
36
|
+
import androidx.activity.ComponentActivity
|
|
37
|
+
import androidx.activity.compose.setContent
|
|
38
|
+
import androidx.compose.material3.Button
|
|
39
|
+
import androidx.compose.material3.Text
|
|
40
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
41
|
+
import androidx.navigation3.runtime.NavKey
|
|
42
|
+
import androidx.navigation3.runtime.entryProvider
|
|
43
|
+
import androidx.navigation3.runtime.rememberNavBackStack
|
|
44
|
+
import androidx.navigation3.ui.NavDisplay
|
|
45
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
46
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
47
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
48
|
+
import kotlinx.serialization.Serializable
|
|
49
|
+
|
|
50
|
+
@Serializable
|
|
51
|
+
private data object RouteA : NavKey
|
|
52
|
+
|
|
53
|
+
@Serializable
|
|
54
|
+
private data class RouteB(val id: String) : NavKey
|
|
55
|
+
|
|
56
|
+
class BasicDslActivity : ComponentActivity() {
|
|
57
|
+
|
|
58
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
59
|
+
setEdgeToEdgeConfig()
|
|
60
|
+
super.onCreate(savedInstanceState)
|
|
61
|
+
setContent {
|
|
62
|
+
val backStack = rememberNavBackStack(RouteA)
|
|
63
|
+
|
|
64
|
+
NavDisplay(
|
|
65
|
+
backStack = backStack,
|
|
66
|
+
onBack = { backStack.removeLastOrNull() },
|
|
67
|
+
entryProvider = entryProvider {
|
|
68
|
+
entry<RouteA> {
|
|
69
|
+
ContentGreen("Welcome to Nav3") {
|
|
70
|
+
Button(onClick = dropUnlessResumed {
|
|
71
|
+
backStack.add(RouteB("123"))
|
|
72
|
+
}) {
|
|
73
|
+
Text("Click to navigate")
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
entry<RouteB> { key ->
|
|
78
|
+
ContentBlue("Route id: ${key.id} ")
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Basic Saveable Recipe
|
|
2
|
+
|
|
3
|
+
This recipe shows a basic example of how to create a persistent back stack that survives configuration changes.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
To make the back stack persistent, we use the `rememberNavBackStack` function. This function creates and remembers the back stack across configuration changes (e.g., screen rotation).
|
|
8
|
+
|
|
9
|
+
A requirement for using `rememberNavBackStack` is that the navigation keys (routes) must be serializable. In this example, `RouteA` and `RouteB` are annotated with `@Serializable` and implement the `NavKey` interface.
|
|
10
|
+
|
|
11
|
+
This example uses a `when` statement within the `entryProvider` to map routes to their corresponding composables, but it could also be used with the `entryProvider` DSL.
|
|
12
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/basicsaveable)
|
|
13
|
+
|
|
14
|
+
```
|
|
15
|
+
/*
|
|
16
|
+
* Copyright 2025 The Android Open Source Project
|
|
17
|
+
*
|
|
18
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
19
|
+
* you may not use this file except in compliance with the License.
|
|
20
|
+
* You may obtain a copy of the License at
|
|
21
|
+
*
|
|
22
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
23
|
+
*
|
|
24
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
25
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
26
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
27
|
+
* See the License for the specific language governing permissions and
|
|
28
|
+
* limitations under the License.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
package com.example.nav3recipes.basicsaveable
|
|
32
|
+
|
|
33
|
+
import android.os.Bundle
|
|
34
|
+
import androidx.activity.ComponentActivity
|
|
35
|
+
import androidx.activity.compose.setContent
|
|
36
|
+
import androidx.compose.material3.Button
|
|
37
|
+
import androidx.compose.material3.Text
|
|
38
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
39
|
+
import androidx.navigation3.runtime.NavEntry
|
|
40
|
+
import androidx.navigation3.runtime.NavKey
|
|
41
|
+
import androidx.navigation3.runtime.rememberNavBackStack
|
|
42
|
+
import androidx.navigation3.ui.NavDisplay
|
|
43
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
44
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
45
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
46
|
+
import kotlinx.serialization.Serializable
|
|
47
|
+
|
|
48
|
+
@Serializable
|
|
49
|
+
private data object RouteA : NavKey
|
|
50
|
+
|
|
51
|
+
@Serializable
|
|
52
|
+
private data class RouteB(val id: String) : NavKey
|
|
53
|
+
|
|
54
|
+
class BasicSaveableActivity : ComponentActivity() {
|
|
55
|
+
|
|
56
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
57
|
+
setEdgeToEdgeConfig()
|
|
58
|
+
super.onCreate(savedInstanceState)
|
|
59
|
+
setContent {
|
|
60
|
+
val backStack = rememberNavBackStack(RouteA)
|
|
61
|
+
|
|
62
|
+
NavDisplay(
|
|
63
|
+
backStack = backStack,
|
|
64
|
+
onBack = { backStack.removeLastOrNull() },
|
|
65
|
+
entryProvider = { key ->
|
|
66
|
+
when (key) {
|
|
67
|
+
is RouteA -> NavEntry(key) {
|
|
68
|
+
ContentGreen("Welcome to Nav3") {
|
|
69
|
+
Button(onClick = dropUnlessResumed {
|
|
70
|
+
backStack.add(RouteB("123"))
|
|
71
|
+
}) {
|
|
72
|
+
Text("Click to navigate")
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
is RouteB -> NavEntry(key) {
|
|
78
|
+
ContentBlue("Route id: ${key.id} ")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
else -> {
|
|
82
|
+
error("Unknown route: $key")
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
```
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Bottom Sheet Recipe
|
|
2
|
+
|
|
3
|
+
This recipe demonstrates how to display a destination as a modal bottom sheet.
|
|
4
|
+
|
|
5
|
+
## How it works
|
|
6
|
+
|
|
7
|
+
To show a destination as a bottom sheet, you need to do two things:
|
|
8
|
+
|
|
9
|
+
1. **Use `BottomSheetSceneStrategy`** : Create an instance of `BottomSheetSceneStrategy` and pass it to the `sceneStrategy` parameter of the `NavDisplay` composable.
|
|
10
|
+
|
|
11
|
+
2. **Add metadata to the destination** : For the destination that you want to display as a bottom sheet, add `BottomSheetSceneStrategy.bottomSheet()` to its metadata. This is done in the `entry` function.
|
|
12
|
+
|
|
13
|
+
In this example, `RouteB` is configured to be a bottom sheet. When you navigate from `RouteA` to `RouteB`, `RouteB` will be displayed in a modal bottom sheet that slides up from the bottom of the screen.
|
|
14
|
+
|
|
15
|
+
The content of the bottom sheet can be styled as needed. In this recipe, the content is clipped to have rounded corners.
|
|
16
|
+
|
|
17
|
+
For more information, see the official documentation on [custom layouts](https://developer.android.com/guide/navigation/navigation-3/custom-layouts).
|
|
18
|
+
[ Explore View the full recipe on GitHub.](https://github.com/android/nav3-recipes/tree/main/app/src/main/java/com/example/nav3recipes/bottomsheet)
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
/*
|
|
22
|
+
* Copyright 2025 The Android Open Source Project
|
|
23
|
+
*
|
|
24
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
25
|
+
* you may not use this file except in compliance with the License.
|
|
26
|
+
* You may obtain a copy of the License at
|
|
27
|
+
*
|
|
28
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
29
|
+
*
|
|
30
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
31
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
32
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
33
|
+
* See the License for the specific language governing permissions and
|
|
34
|
+
* limitations under the License.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
package com.example.nav3recipes.bottomsheet
|
|
38
|
+
|
|
39
|
+
import android.os.Bundle
|
|
40
|
+
import androidx.activity.ComponentActivity
|
|
41
|
+
import androidx.activity.compose.setContent
|
|
42
|
+
import androidx.compose.foundation.shape.RoundedCornerShape
|
|
43
|
+
import androidx.compose.material3.Button
|
|
44
|
+
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
45
|
+
import androidx.compose.material3.Text
|
|
46
|
+
import androidx.compose.runtime.remember
|
|
47
|
+
import androidx.compose.ui.Modifier
|
|
48
|
+
import androidx.compose.ui.draw.clip
|
|
49
|
+
import androidx.compose.ui.unit.dp
|
|
50
|
+
import androidx.lifecycle.compose.dropUnlessResumed
|
|
51
|
+
import androidx.navigation3.runtime.NavKey
|
|
52
|
+
import androidx.navigation3.runtime.entryProvider
|
|
53
|
+
import androidx.navigation3.runtime.rememberNavBackStack
|
|
54
|
+
import androidx.navigation3.ui.NavDisplay
|
|
55
|
+
import com.example.nav3recipes.content.ContentBlue
|
|
56
|
+
import com.example.nav3recipes.content.ContentGreen
|
|
57
|
+
import com.example.nav3recipes.ui.setEdgeToEdgeConfig
|
|
58
|
+
import kotlinx.serialization.Serializable
|
|
59
|
+
|
|
60
|
+
@Serializable
|
|
61
|
+
private data object RouteA : NavKey
|
|
62
|
+
|
|
63
|
+
@Serializable
|
|
64
|
+
private data class RouteB(val id: String) : NavKey
|
|
65
|
+
|
|
66
|
+
class BottomSheetActivity : ComponentActivity() {
|
|
67
|
+
|
|
68
|
+
@OptIn(ExperimentalMaterial3Api::class)
|
|
69
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
70
|
+
setEdgeToEdgeConfig()
|
|
71
|
+
super.onCreate(savedInstanceState)
|
|
72
|
+
setContent {
|
|
73
|
+
val backStack = rememberNavBackStack(RouteA)
|
|
74
|
+
val bottomSheetStrategy = remember { BottomSheetSceneStrategy<NavKey>() }
|
|
75
|
+
|
|
76
|
+
NavDisplay(
|
|
77
|
+
backStack = backStack,
|
|
78
|
+
onBack = { backStack.removeLastOrNull() },
|
|
79
|
+
sceneStrategies = listOf(bottomSheetStrategy),
|
|
80
|
+
entryProvider = entryProvider {
|
|
81
|
+
entry<RouteA> {
|
|
82
|
+
ContentGreen("Welcome to Nav3") {
|
|
83
|
+
Button(onClick = dropUnlessResumed {
|
|
84
|
+
backStack.add(RouteB("123"))
|
|
85
|
+
}) {
|
|
86
|
+
Text("Click to open bottom sheet")
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
entry<RouteB>(
|
|
91
|
+
metadata = BottomSheetSceneStrategy.bottomSheet()
|
|
92
|
+
) { key ->
|
|
93
|
+
ContentBlue(
|
|
94
|
+
title = "Route id: ${key.id}",
|
|
95
|
+
modifier = Modifier.clip(
|
|
96
|
+
shape = RoundedCornerShape(16.dp)
|
|
97
|
+
)
|
|
98
|
+
)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
)
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
package com.example.nav3recipes.bottomsheet
|
|
109
|
+
|
|
110
|
+
import androidx.compose.material3.ExperimentalMaterial3Api
|
|
111
|
+
import androidx.compose.material3.ModalBottomSheet
|
|
112
|
+
import androidx.compose.material3.ModalBottomSheetProperties
|
|
113
|
+
import androidx.compose.runtime.Composable
|
|
114
|
+
import androidx.compose.runtime.CompositionLocalProvider
|
|
115
|
+
import androidx.lifecycle.compose.LocalLifecycleOwner
|
|
116
|
+
import androidx.lifecycle.compose.rememberLifecycleOwner
|
|
117
|
+
import androidx.navigation3.runtime.NavEntry
|
|
118
|
+
import androidx.navigation3.runtime.NavMetadataKey
|
|
119
|
+
import androidx.navigation3.runtime.get
|
|
120
|
+
import androidx.navigation3.runtime.metadata
|
|
121
|
+
import androidx.navigation3.scene.OverlayScene
|
|
122
|
+
import androidx.navigation3.scene.Scene
|
|
123
|
+
import androidx.navigation3.scene.SceneStrategy
|
|
124
|
+
import androidx.navigation3.scene.SceneStrategyScope
|
|
125
|
+
import com.example.nav3recipes.bottomsheet.BottomSheetSceneStrategy.Companion.bottomSheet
|
|
126
|
+
|
|
127
|
+
/** An [OverlayScene] that renders an [entry] within a [ModalBottomSheet]. */
|
|
128
|
+
@OptIn(ExperimentalMaterial3Api::class)
|
|
129
|
+
internal data class BottomSheetScene<T : Any>(
|
|
130
|
+
override val key: T,
|
|
131
|
+
override val previousEntries: List<NavEntry<T>>,
|
|
132
|
+
override val overlaidEntries: List<NavEntry<T>>,
|
|
133
|
+
private val entry: NavEntry<T>,
|
|
134
|
+
private val modalBottomSheetProperties: ModalBottomSheetProperties,
|
|
135
|
+
private val onBack: () -> Unit,
|
|
136
|
+
) : OverlayScene<T> {
|
|
137
|
+
|
|
138
|
+
override val entries: List<NavEntry<T>> = listOf(entry)
|
|
139
|
+
|
|
140
|
+
override val content: @Composable (() -> Unit) = {
|
|
141
|
+
val lifecycleOwner = rememberLifecycleOwner()
|
|
142
|
+
ModalBottomSheet(
|
|
143
|
+
onDismissRequest = onBack,
|
|
144
|
+
properties = modalBottomSheetProperties,
|
|
145
|
+
) {
|
|
146
|
+
CompositionLocalProvider(LocalLifecycleOwner provides lifecycleOwner) {
|
|
147
|
+
entry.Content()
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* A [SceneStrategy] that displays entries that have added [bottomSheet] to their [NavEntry.metadata]
|
|
155
|
+
* within a [ModalBottomSheet] instance.
|
|
156
|
+
*
|
|
157
|
+
* This strategy should always be added before any non-overlay scene strategies.
|
|
158
|
+
*/
|
|
159
|
+
@OptIn(ExperimentalMaterial3Api::class)
|
|
160
|
+
class BottomSheetSceneStrategy<T : Any> : SceneStrategy<T> {
|
|
161
|
+
|
|
162
|
+
override fun SceneStrategyScope<T>.calculateScene(entries: List<NavEntry<T>>): Scene<T>? {
|
|
163
|
+
val lastEntry = entries.lastOrNull() ?: return null
|
|
164
|
+
val bottomSheetProperties = lastEntry.metadata[BottomSheetKey] ?: return null
|
|
165
|
+
return bottomSheetProperties.let { properties ->
|
|
166
|
+
@Suppress("UNCHECKED_CAST")
|
|
167
|
+
BottomSheetScene(
|
|
168
|
+
key = lastEntry.contentKey as T,
|
|
169
|
+
previousEntries = entries.dropLast(1),
|
|
170
|
+
overlaidEntries = entries.dropLast(1),
|
|
171
|
+
entry = lastEntry,
|
|
172
|
+
modalBottomSheetProperties = properties,
|
|
173
|
+
onBack = onBack
|
|
174
|
+
)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
companion object {
|
|
179
|
+
/**
|
|
180
|
+
* Function to be called on the [NavEntry.metadata] to mark this entry as something that
|
|
181
|
+
* should be displayed within a [ModalBottomSheet].
|
|
182
|
+
*
|
|
183
|
+
* @param modalBottomSheetProperties properties that should be passed to the containing
|
|
184
|
+
* [ModalBottomSheet].
|
|
185
|
+
*/
|
|
186
|
+
fun bottomSheet(modalBottomSheetProperties: ModalBottomSheetProperties = ModalBottomSheetProperties()) =
|
|
187
|
+
metadata {
|
|
188
|
+
put(BottomSheetKey, modalBottomSheetProperties)
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
object BottomSheetKey : NavMetadataKey<ModalBottomSheetProperties>
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
```
|