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
package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
> [!NOTE]
|
|
2
|
+
> **Note:** `Grid` is an experimental API and is subject to change. File any issues on the [issue tracker](https://issuetracker.google.com/issues/new?component=1876021&template=1424126).
|
|
3
|
+
|
|
4
|
+
[`Grid`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/Grid.composable#Grid(kotlin.Function1,androidx.compose.ui.Modifier,kotlin.Function1)) is a Jetpack Compose API
|
|
5
|
+
that lets you flexibly implement a two-dimensional layout.
|
|
6
|
+
With this API, you can display items in multi-column
|
|
7
|
+
or multi-row layouts that adapt to the available container size.
|
|
8
|
+
 **Figure 1.** A flexible and adaptive two-dimensional layout with `Grid`.
|
|
9
|
+
|
|
10
|
+
## How is Grid different from similar composables?
|
|
11
|
+
|
|
12
|
+
Compose already offers similar components, such as [`LazyVerticalGrid`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/lazy/grid/LazyVerticalGrid.composable#LazyVerticalGrid(androidx.compose.foundation.lazy.grid.GridCells,androidx.compose.ui.Modifier,androidx.compose.foundation.lazy.grid.LazyGridState,androidx.compose.foundation.layout.PaddingValues,kotlin.Boolean,androidx.compose.foundation.layout.Arrangement.Vertical,androidx.compose.foundation.layout.Arrangement.Horizontal,androidx.compose.foundation.gestures.FlingBehavior,kotlin.Boolean,androidx.compose.foundation.OverscrollEffect,kotlin.Function1)).
|
|
13
|
+
These components are mainly for visualization of large, homogeneous data sets---
|
|
14
|
+
for example, displaying a content catalog in a video streaming app.
|
|
15
|
+
These components are NOT designed
|
|
16
|
+
for the structural layout of a screen or complex component.
|
|
17
|
+
|
|
18
|
+
You can also implement a two-dimensional layout
|
|
19
|
+
by combining multiple `Row` and `Column` composables.
|
|
20
|
+
However, this approach has some downsides,
|
|
21
|
+
such as deep hierarchies and difficulties in adaptability.
|
|
22
|
+
|
|
23
|
+
The following table provides an overview
|
|
24
|
+
of which layouts are suitable for each API:
|
|
25
|
+
|
|
26
|
+
| Component | Purpose |
|
|
27
|
+
|---|---|
|
|
28
|
+
| `LazyVerticalGrid`, `LazyStaggeredGrid`, `LazyHorizontalGrid` | Visualization of large, homogeneous data sets that require lazy loading. |
|
|
29
|
+
| `Row`, `Column`, `FlexBox` | One-dimensional layout |
|
|
30
|
+
| `Grid` | Two-dimensional layout |
|
|
31
|
+
|
|
32
|
+
> [!NOTE]
|
|
33
|
+
> **Note:** `Grid` doesn't support lazy loading.
|
|
34
|
+
|
|
35
|
+
## Terminology
|
|
36
|
+
|
|
37
|
+
Familiarize yourself with the following terminology
|
|
38
|
+
to understand how `Grid` works.
|
|
39
|
+
|
|
40
|
+
### Grid line
|
|
41
|
+
|
|
42
|
+
A grid is made up of lines, which run horizontally and vertically.
|
|
43
|
+
If your grid has three rows, it has four horizontal lines,
|
|
44
|
+
including the one after the last row.
|
|
45
|
+
In the following image, each dotted line represents a grid line:
|
|
46
|
+
 **Figure 2**. The grid consists of four horizontal lines and three vertical lines.
|
|
47
|
+
|
|
48
|
+
### Grid track
|
|
49
|
+
|
|
50
|
+
A grid track is the space between two grid lines.
|
|
51
|
+
A row track is between two horizontal lines,
|
|
52
|
+
and a column track is between two vertical lines.
|
|
53
|
+
To define the size of these tracks,
|
|
54
|
+
assign a size to them when you create the grid.
|
|
55
|
+
 **Figure 3**. A grid track for the first row.
|
|
56
|
+
|
|
57
|
+
### Grid cell
|
|
58
|
+
|
|
59
|
+
A grid cell is the intersection of a row and column track.
|
|
60
|
+
 **Figure 4**. A grid cell that is an intersection of the second row and the second column.
|
|
61
|
+
|
|
62
|
+
### Grid area
|
|
63
|
+
|
|
64
|
+
A grid area consists of several grid cells.
|
|
65
|
+
You can define a grid area by making an item span multiple tracks.
|
|
66
|
+
 **Figure 5**. A grid area that consists of four grid cells.
|
|
67
|
+
|
|
68
|
+
### Grid gap
|
|
69
|
+
|
|
70
|
+
A grid gap is the gutter between grid tracks.
|
|
71
|
+
You can't place a UI element into a gap,
|
|
72
|
+
but you can span a UI element across it.
|
|
73
|
+
 **Figure 6**. A grid gap between the first column and the second column.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
While the `Grid` config defines the overall structure,
|
|
2
|
+
you use the [`gridItem`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridScope#(androidx.compose.ui.Modifier).gridItem(kotlin.Int,kotlin.Int,kotlin.Int,kotlin.Int,androidx.compose.ui.Alignment)) modifier to control the position, spanning,
|
|
3
|
+
and alignment of items within that structure.
|
|
4
|
+
|
|
5
|
+
## Set the item position
|
|
6
|
+
|
|
7
|
+
Place an item into a specific track or cell
|
|
8
|
+
with the `row` and `column` parameters.
|
|
9
|
+
Coordinate indexes work best for straightforward grid layouts.
|
|
10
|
+
For larger or more complex layouts, define [named areas](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid/container-properties#named-area) instead.
|
|
11
|
+
|
|
12
|
+
The `row` and `column` parameters specify the row and column track indexes
|
|
13
|
+
that the item is placed in.
|
|
14
|
+
Track indexes are 1-based---they start at one.
|
|
15
|
+
Specifying only `row` or `column` (not both) places the item
|
|
16
|
+
in the next available space in that track.
|
|
17
|
+
Specifying both places the item into that cell.
|
|
18
|
+
|
|
19
|
+
Use a positive integer to specify the track index from the start.
|
|
20
|
+
For example, to place an item in the first row and column,
|
|
21
|
+
use `gridItem(row = 1, column = 1)`.
|
|
22
|
+
|
|
23
|
+
Use a negative integer to specify the track relative to the end.
|
|
24
|
+
For example, to place an item in the second-to-last row and column, use
|
|
25
|
+
`gridItem(row = -2, column = -2)`.
|
|
26
|
+
|
|
27
|
+
In the following example, Card **#2** is placed
|
|
28
|
+
in the second row and the second column.
|
|
29
|
+
Card **#3** is assigned to the last row (indexed by -1),
|
|
30
|
+
where it automatically occupies
|
|
31
|
+
the first available column in that track (Figure 1).
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
Grid(
|
|
36
|
+
config = {
|
|
37
|
+
repeat(2) {
|
|
38
|
+
column(160.dp)
|
|
39
|
+
}
|
|
40
|
+
repeat(3) {
|
|
41
|
+
row(90.dp)
|
|
42
|
+
}
|
|
43
|
+
gap(8.dp)
|
|
44
|
+
}
|
|
45
|
+
) {
|
|
46
|
+
Card1()
|
|
47
|
+
Card2(modifier = Modifier.gridItem(row = 2, column = 2))
|
|
48
|
+
Card3(modifier = Modifier.gridItem(row = -1, column = -2))
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
<br />
|
|
53
|
+
|
|
54
|
+
 **Figure 1** . Card **#2** is placed in the grid cell in the second row and the second column, and Card **#3** is placed in the first column in the third row.
|
|
57
|
+
|
|
58
|
+
## Span rows and columns
|
|
59
|
+
|
|
60
|
+
Use the `rowSpan` and `columnSpan` parameters
|
|
61
|
+
to span an item over multiple cells.
|
|
62
|
+
You can place a UI element into a [grid area](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid#grid-area),
|
|
63
|
+
which is the area consisting of several [grid cells](https://developer.android.com/develop/ui/compose/layouts/adaptive/grid#grid-cell).
|
|
64
|
+
The `gridItem` modifier lets you specify the grid area
|
|
65
|
+
with the `rowSpan` and `columnSpan` parameters.
|
|
66
|
+
In the following example,
|
|
67
|
+
Card **#1** is placed in the area consisting of two rows and two columns
|
|
68
|
+
(Figure 2).
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
```kotlin
|
|
72
|
+
Grid(
|
|
73
|
+
config = {
|
|
74
|
+
repeat(3) {
|
|
75
|
+
column(160.dp)
|
|
76
|
+
}
|
|
77
|
+
repeat(3) {
|
|
78
|
+
row(90.dp)
|
|
79
|
+
}
|
|
80
|
+
rowGap(8.dp)
|
|
81
|
+
columnGap(8.dp)
|
|
82
|
+
}
|
|
83
|
+
) {
|
|
84
|
+
Card1(modifier = Modifier.gridItem(rowSpan = 2, columnSpan = 2))
|
|
85
|
+
Card2()
|
|
86
|
+
Card3()
|
|
87
|
+
Card4(modifier = Modifier.gridItem(columnSpan = 3))
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
<br />
|
|
92
|
+
|
|
93
|
+
 **Figure 2** . Card **#4** spans three columns.
|
|
94
|
+
|
|
95
|
+
## Set the alignment in a grid area
|
|
96
|
+
|
|
97
|
+
You can set the alignment of the UI element in a grid area
|
|
98
|
+
by specifying it in the `alignment` parameter of the [`gridItem`](https://developer.android.com/reference/kotlin/androidx/compose/foundation/layout/GridScope#(androidx.compose.ui.Modifier).gridItem(kotlin.Int,kotlin.Int,kotlin.Int,kotlin.Int,androidx.compose.ui.Alignment)) modifier.
|
|
99
|
+
In the following example, **#1** is placed in the center of the grid area
|
|
100
|
+
consisting of two columns and two rows.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
```kotlin
|
|
104
|
+
Grid(
|
|
105
|
+
config = {
|
|
106
|
+
repeat(3) {
|
|
107
|
+
column(160.dp)
|
|
108
|
+
}
|
|
109
|
+
repeat(3) {
|
|
110
|
+
row(90.dp)
|
|
111
|
+
}
|
|
112
|
+
rowGap(8.dp)
|
|
113
|
+
columnGap(8.dp)
|
|
114
|
+
},
|
|
115
|
+
) {
|
|
116
|
+
Text(
|
|
117
|
+
text = "#1",
|
|
118
|
+
modifier = Modifier
|
|
119
|
+
.gridItem(
|
|
120
|
+
rowSpan = 2,
|
|
121
|
+
columnSpan = 2,
|
|
122
|
+
alignment = Alignment.Center
|
|
123
|
+
),
|
|
124
|
+
)
|
|
125
|
+
Card2()
|
|
126
|
+
Card3()
|
|
127
|
+
Card4(modifier = Modifier.gridItem(columnSpan = 3))
|
|
128
|
+
}
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
<br />
|
|
132
|
+
|
|
133
|
+
 **Figure 3** . The Text with **#1** is placed in the center of the grid area consisting of two rows and two columns.
|
|
135
|
+
|
|
136
|
+
## Auto-placement mixed with placed items
|
|
137
|
+
|
|
138
|
+
A UI element in `Grid`
|
|
139
|
+
that has no position specification undergoes auto-placement.
|
|
140
|
+
This example shows how you can mix auto-placed elements
|
|
141
|
+
and the UI elements with specified grid cells.
|
|
142
|
+
Card **#2** and Card **#4** are placed in specified grid cells,
|
|
143
|
+
and the other items are auto-placed.
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
```kotlin
|
|
147
|
+
Grid(
|
|
148
|
+
config = {
|
|
149
|
+
repeat(2) {
|
|
150
|
+
column(160.dp)
|
|
151
|
+
}
|
|
152
|
+
repeat(3) {
|
|
153
|
+
row(90.dp)
|
|
154
|
+
}
|
|
155
|
+
rowGap(16.dp)
|
|
156
|
+
columnGap(8.dp)
|
|
157
|
+
}
|
|
158
|
+
) {
|
|
159
|
+
Card1()
|
|
160
|
+
Card2(modifier = Modifier.gridItem(row = 2, column = 2))
|
|
161
|
+
Card3()
|
|
162
|
+
Card4(modifier = Modifier.gridItem(row = 3, column = 1))
|
|
163
|
+
Card5()
|
|
164
|
+
Card6()
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
<br />
|
|
169
|
+
|
|
170
|
+
 **Figure 4** . Card **#3** is placed next to Card **#1**, as it is an auto-placement.
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
> [!NOTE]
|
|
2
|
+
> **Note:** The `mediaQuery` function and the related data types are experimental and subject to change. File any issues on the [issue tracker](https://issuetracker.google.com/issues?q=componentid:1876021).
|
|
3
|
+
|
|
4
|
+
You need various types of information, such as device capability
|
|
5
|
+
and app status, to update your app layout.
|
|
6
|
+
Window width and height are the most commonly used information.
|
|
7
|
+
In addition to that, you can refer to the following information:
|
|
8
|
+
|
|
9
|
+
- Window posture
|
|
10
|
+
- Pointing devices precision
|
|
11
|
+
- Keyboard type
|
|
12
|
+
- Whether the camera and microphone are supported by the device
|
|
13
|
+
- The distance between a user and the device display
|
|
14
|
+
|
|
15
|
+
Because the information is updated dynamically,
|
|
16
|
+
you need to monitor it and trigger recomposition when any update happens.
|
|
17
|
+
The [`mediaQuery`](https://developer.android.com/reference/kotlin/androidx/compose/ui/mediaQuery.composable#mediaQuery(kotlin.Function1)) function abstracts the details of the information retrieval
|
|
18
|
+
and lets you focus on defining the condition to trigger the layout updates.
|
|
19
|
+
|
|
20
|
+
> [!NOTE]
|
|
21
|
+
> **Note:** "media" refers to the presentation medium that the UI is rendered on. The term "media" originates from [CSS media queries](https://www.w3.org/TR/mediaqueries-3/) which inspired the `mediaQuery` API.
|
|
22
|
+
|
|
23
|
+
The following example switches the layout to `TabletopLayout`
|
|
24
|
+
when the foldable posture is tabletop:
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
```kotlin
|
|
28
|
+
@Composable
|
|
29
|
+
fun VideoPlayer(
|
|
30
|
+
// ...
|
|
31
|
+
) {
|
|
32
|
+
// ...
|
|
33
|
+
if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
|
|
34
|
+
TabletopLayout()
|
|
35
|
+
} else {
|
|
36
|
+
FlatLayout()
|
|
37
|
+
}
|
|
38
|
+
// ...
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
<br />
|
|
43
|
+
|
|
44
|
+
## Enable the `mediaQuery` function
|
|
45
|
+
|
|
46
|
+
To enable the `mediaQuery` function,
|
|
47
|
+
set the `isMediaQueryIntegrationEnabled` attribute of
|
|
48
|
+
the [`ComposeUiFlags`](https://developer.android.com/reference/kotlin/androidx/compose/ui/ComposeUiFlags) object to `true`:
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
```kotlin
|
|
52
|
+
class MyApplication : Application() {
|
|
53
|
+
override fun onCreate() {
|
|
54
|
+
ComposeUiFlags.isMediaQueryIntegrationEnabled = true
|
|
55
|
+
super.onCreate()
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
<br />
|
|
61
|
+
|
|
62
|
+
## Define a condition with parameters
|
|
63
|
+
|
|
64
|
+
You can define a condition as a lambda
|
|
65
|
+
that is evaluated within [`UiMediaScope`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope).
|
|
66
|
+
The `mediaQuery` function evaluates the condition according to
|
|
67
|
+
the current status and the device capabilities.
|
|
68
|
+
The function returns a boolean value,
|
|
69
|
+
so you can determine the layout with conditional branches
|
|
70
|
+
like an `if` expression.
|
|
71
|
+
Table 1 describes the parameters available in `UiMediaScope`.
|
|
72
|
+
|
|
73
|
+
| Parameter | Value type | Description |
|
|
74
|
+
|---|---|---|
|
|
75
|
+
| `windowWidth` | [`Dp`](https://developer.android.com/reference/kotlin/androidx/compose/ui/unit/Dp) | The current window width in dp. |
|
|
76
|
+
| `windowHeight` | `Dp` | The current window height in dp. |
|
|
77
|
+
| `windowPosture` | [`UiMediaScope.Posture`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.Posture) | The current posture of the application window. |
|
|
78
|
+
| `pointerPrecision` | [`UiMediaScope.PointerPrecision`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.PointerPrecision) | The highest precision of the available pointing devices. |
|
|
79
|
+
| `keyboardKind` | [`UiMediaScope.KeyboardKind`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.KeyboardKind) | The type of keyboard available or connected. |
|
|
80
|
+
| `hasCamera` | `Boolean` | Whether the camera is supported on the device. |
|
|
81
|
+
| `hasMicrophone` | `Boolean` | Whether the microphone is supported on the device. |
|
|
82
|
+
| `viewingDistance` | [`UiMediaScope.ViewingDistance`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.ViewingDistance) | The typical distance between the user and the device screen. |
|
|
83
|
+
|
|
84
|
+
A `UiMediaScope` object resolves the values of the parameters.
|
|
85
|
+
The `mediaQuery` function uses [`LocalUiMediaScope.current`](https://developer.android.com/reference/kotlin/androidx/compose/ui/package-summary#LocalUiMediaScope())
|
|
86
|
+
to access the `UiMediaScope` object,
|
|
87
|
+
which represents the current device capabilities and context.
|
|
88
|
+
This object is dynamically updated when any changes are made,
|
|
89
|
+
such as when the user changes the device posture.
|
|
90
|
+
The `mediaQuery` function then evaluates the `query` lambda
|
|
91
|
+
with the updated `UiMediaScope` object and returns a boolean value.
|
|
92
|
+
For example, the following snippet chooses between `TabletopLayout`
|
|
93
|
+
and `FlatLayout` based on the `windowPosture` parameter value.
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
```kotlin
|
|
97
|
+
@Composable
|
|
98
|
+
fun VideoPlayer(
|
|
99
|
+
// ...
|
|
100
|
+
) {
|
|
101
|
+
// ...
|
|
102
|
+
if (mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop }) {
|
|
103
|
+
TabletopLayout()
|
|
104
|
+
} else {
|
|
105
|
+
FlatLayout()
|
|
106
|
+
}
|
|
107
|
+
// ...
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
<br />
|
|
112
|
+
|
|
113
|
+
### Make a decision based on the window size
|
|
114
|
+
|
|
115
|
+
[Window size classes](https://developer.android.com/develop/ui/compose/layouts/adaptive/use-window-size-classes) are a set of opinionated viewport breakpoints
|
|
116
|
+
that help you design, develop, and test adaptive layouts.
|
|
117
|
+
You can compare the two parameters representing the current window size
|
|
118
|
+
with the threshold defined in the window size classes.
|
|
119
|
+
The following example changes the number of panes according to the window width.
|
|
120
|
+
[`WindowSizeClass`](https://developer.android.com/reference/androidx/window/core/layout/WindowSizeClass) class has constants for the thresholds
|
|
121
|
+
of window size classes (Figure 1).
|
|
122
|
+
|
|
123
|
+
The [`derivedMediaQuery`](https://developer.android.com/reference/kotlin/androidx/compose/ui/derivedMediaQuery.composable#derivedMediaQuery(kotlin.Function1)) function evaluates the `query` lambda
|
|
124
|
+
and wraps the result in a [`derivedStateOf`](https://developer.android.com/develop/ui/compose/side-effects#derivedstateof).
|
|
125
|
+
Because `windowWidth` and `windowHeight` can update frequently,
|
|
126
|
+
call the `derivedMediaQuery` function instead of the `mediaQuery` function
|
|
127
|
+
when you refer to those parameters in the `query` lambda.
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
```kotlin
|
|
131
|
+
val narrowerThanMedium by derivedMediaQuery {
|
|
132
|
+
windowWidth < WindowSizeClass.WIDTH_DP_MEDIUM_LOWER_BOUND.dp
|
|
133
|
+
}
|
|
134
|
+
val narrowerThanExpanded by derivedMediaQuery {
|
|
135
|
+
windowWidth < WindowSizeClass.WIDTH_DP_EXPANDED_LOWER_BOUND.dp
|
|
136
|
+
}
|
|
137
|
+
when {
|
|
138
|
+
narrowerThanMedium -> SinglePaneLayout()
|
|
139
|
+
narrowerThanExpanded -> TwoPaneLayout()
|
|
140
|
+
else -> ThreePaneLayout()
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
<br />
|
|
145
|
+
|
|
146
|
+
**Figure 1**. Layout is updated according to the window width.
|
|
147
|
+
|
|
148
|
+
### Update layout according to the window posture
|
|
149
|
+
|
|
150
|
+
The `windowPosture` parameter describes the current window posture
|
|
151
|
+
as a `UiMediaScope.Posture` object.
|
|
152
|
+
You can check the current [posture](https://developer.android.com/develop/ui/compose/layouts/adaptive/foldables/learn-about-foldables) by comparing the parameter
|
|
153
|
+
with the values defined in the `UiMediaScope.Posture` class.
|
|
154
|
+
The following example switches layout according to the window posture:
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
```kotlin
|
|
158
|
+
when {
|
|
159
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop } -> TabletopLayout()
|
|
160
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Book } -> BookLayout()
|
|
161
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Flat } -> FlatLayout()
|
|
162
|
+
}
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
<br />
|
|
166
|
+
|
|
167
|
+
### Check the precision of the available pointing device
|
|
168
|
+
|
|
169
|
+
A high precision pointing device helps users to point a UI element precisely.
|
|
170
|
+
The precision of a pointing device depends on the device type.
|
|
171
|
+
|
|
172
|
+
The `pointerPrecision` parameter describes the precision
|
|
173
|
+
of the available pointing devices, such as a mouse and touchscreen.
|
|
174
|
+
There are four values defined in the `UiMediaScope.PointerPrecision` class:
|
|
175
|
+
[`Fine`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.PointerPrecision#Fine()), [`Coarse`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.PointerPrecision#Coarse()), [`Blunt`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.PointerPrecision#Blunt()), and [`None`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.PointerPrecision#None()).
|
|
176
|
+
`None` means that no pointing device is available.
|
|
177
|
+
The precision ranges from highest to lowest in this order:
|
|
178
|
+
`Fine`, `Coarse`, and `Blunt`.
|
|
179
|
+
|
|
180
|
+
If multiple pointing devices are available and their precisions are different,
|
|
181
|
+
the parameter is resolved with the highest one.
|
|
182
|
+
For example, if there are two pointing devices --- a `Fine` precision device and
|
|
183
|
+
a `Blunt` precision device ---
|
|
184
|
+
`Fine` is the value of the `pointerPrecision` parameter.
|
|
185
|
+
|
|
186
|
+
The following example shows a larger button
|
|
187
|
+
when the user is using a pointing device with low precision:
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
```kotlin
|
|
191
|
+
if (mediaQuery { pointerPrecision == UiMediaScope.PointerPrecision.Blunt }) {
|
|
192
|
+
LargeSizeButton()
|
|
193
|
+
} else {
|
|
194
|
+
NormalSizeButton()
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
<br />
|
|
199
|
+
|
|
200
|
+
### Check the available keyboard type
|
|
201
|
+
|
|
202
|
+
The `keyboardKind` parameter represents the type of the available keyboards:
|
|
203
|
+
[`Physical`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.KeyboardKind#Physical()), [`Virtual`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.KeyboardKind#Virtual()), and [`None`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.KeyboardKind#None()).
|
|
204
|
+
If an on-screen keyboard is displayed and
|
|
205
|
+
a hardware keyboard is available at the same time,
|
|
206
|
+
the parameter is resolved as `Physical`.
|
|
207
|
+
If neither is detected, `None` is the value of the parameter.
|
|
208
|
+
The following example shows a message suggesting that users connect a keyboard
|
|
209
|
+
when no keyboard is detected:
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
```kotlin
|
|
213
|
+
if (mediaQuery { keyboardKind == UiMediaScope.KeyboardKind.None }) {
|
|
214
|
+
SuggestKeyboardConnect()
|
|
215
|
+
}
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
<br />
|
|
219
|
+
|
|
220
|
+
### Check if the device supports camera and microphone
|
|
221
|
+
|
|
222
|
+
Some devices don't support cameras or microphones.
|
|
223
|
+
You can check if the device supports a camera and a microphone
|
|
224
|
+
with the `hasCamera` parameter and the `hasMicrophone` parameter.
|
|
225
|
+
The following example shows buttons to use with camera and microphone
|
|
226
|
+
when the device supports them:
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
```kotlin
|
|
230
|
+
Row {
|
|
231
|
+
OutlinedTextField(state = rememberTextFieldState())
|
|
232
|
+
// Show the MicButton when the device supports a microphone.
|
|
233
|
+
if (mediaQuery { hasMicrophone }) {
|
|
234
|
+
MicButton()
|
|
235
|
+
}
|
|
236
|
+
// Show the CameraButton when the device supports a camera.
|
|
237
|
+
if (mediaQuery { hasCamera }) {
|
|
238
|
+
CameraButton()
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
<br />
|
|
244
|
+
|
|
245
|
+
### Adjust UI with the estimated viewing distance
|
|
246
|
+
|
|
247
|
+
Viewing distance is a factor that helps determine layout.
|
|
248
|
+
If the user is using the app from a distance,
|
|
249
|
+
they would expect the text and UI elements to be bigger.
|
|
250
|
+
The `viewingDistance` parameter provides an estimate of the viewing distance
|
|
251
|
+
based on the device type and its typical usage context.
|
|
252
|
+
|
|
253
|
+
There are three values defined in the `UiMediaScope.ViewingDistance` class:
|
|
254
|
+
[`Near`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.ViewingDistance#Near()), [`Medium`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.ViewingDistance#Medium()), and [`Far`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.ViewingDistance#Far()).
|
|
255
|
+
`Near` means that the screen is in close range,
|
|
256
|
+
and `Far` means that the device is viewed from a distance.
|
|
257
|
+
The following example increases the font size when the viewing distance is
|
|
258
|
+
`Far` or `Medium`:
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
```kotlin
|
|
262
|
+
val fontSize = when {
|
|
263
|
+
mediaQuery { viewingDistance == UiMediaScope.ViewingDistance.Far } -> 20.sp
|
|
264
|
+
mediaQuery { viewingDistance == UiMediaScope.ViewingDistance.Medium } -> 18.sp
|
|
265
|
+
else -> 16.sp
|
|
266
|
+
}
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
<br />
|
|
270
|
+
|
|
271
|
+
## Preview a UI component
|
|
272
|
+
|
|
273
|
+
You can call the `mediaQuery` and `derivedMediaQuery` functions in the
|
|
274
|
+
composable functions to preview UI components.
|
|
275
|
+
The following snippet chooses between `TabletopLayout`
|
|
276
|
+
and `FlatLayout` based on the `windowPosture` parameter value.
|
|
277
|
+
To preview the `TabletopLayout`, the `windowPosture` parameter should be
|
|
278
|
+
[`UiMediaScope.Posture.Tabletop`](https://developer.android.com/reference/kotlin/androidx/compose/ui/UiMediaScope.Posture#Tabletop()).
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
```kotlin
|
|
282
|
+
when {
|
|
283
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop } -> TabletopLayout()
|
|
284
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Book } -> BookLayout()
|
|
285
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Flat } -> FlatLayout()
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
<br />
|
|
290
|
+
|
|
291
|
+
The `mediaQuery` and `derivedMediaQuery` functions evaluate
|
|
292
|
+
the given `query` lambda within a `UiMediaScope` object,
|
|
293
|
+
which is provided as `LocalUiMediaScope.current`.
|
|
294
|
+
You can override it with the following steps:
|
|
295
|
+
|
|
296
|
+
1. Enable the `mediaQuery` function.
|
|
297
|
+
2. Define a custom object that implements the `UiMediaScope` interface.
|
|
298
|
+
3. Set the custom object to the `LocalUiMediaScope` with the [`CompositionLocalProvider`](https://developer.android.com/reference/kotlin/androidx/compose/runtime/CompositionLocalProvider.composable#CompositionLocalProvider(androidx.compose.runtime.CompositionLocalContext,kotlin.Function0)) function.
|
|
299
|
+
4. Call the composable to preview in the content lambda of the `CompositionLocalProvider` function.
|
|
300
|
+
|
|
301
|
+
You can preview the `TabletopLayout` with the following example:
|
|
302
|
+
|
|
303
|
+
|
|
304
|
+
```kotlin
|
|
305
|
+
@Preview
|
|
306
|
+
@Composable
|
|
307
|
+
fun PreviewLayoutForTabletop() {
|
|
308
|
+
// Step 1: Enable the mediaQuery function
|
|
309
|
+
ComposeUiFlags.isMediaQueryIntegrationEnabled = true
|
|
310
|
+
|
|
311
|
+
val currentUiMediaScope = LocalUiMediaScope.current
|
|
312
|
+
// Step 2: Define a custom object implementing the UiMediaScope interface.
|
|
313
|
+
// The object overrides the windowPosture parameter.
|
|
314
|
+
// The resolution of the remaining parameters is deferred to the currentUiMediaScope object.
|
|
315
|
+
val uiMediaScope = remember(currentUiMediaScope) {
|
|
316
|
+
object : UiMediaScope by currentUiMediaScope {
|
|
317
|
+
override val windowPosture: UiMediaScope.Posture = UiMediaScope.Posture.Tabletop
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Step 3: Set the object to the LocalUiMediaScope.
|
|
322
|
+
CompositionLocalProvider(LocalUiMediaScope provides uiMediaScope) {
|
|
323
|
+
// Step 4: Call the composable to preview.
|
|
324
|
+
when {
|
|
325
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Tabletop } -> TabletopLayout()
|
|
326
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Book } -> BookLayout()
|
|
327
|
+
mediaQuery { windowPosture == UiMediaScope.Posture.Flat } -> FlatLayout()
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
<br />
|