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,213 @@
|
|
|
1
|
+
Applicable XR devices This guidance helps you build experiences for these types of XR devices. [Learn about XR device types →](https://developer.android.com/develop/xr/devices)  Audio \&
|
|
2
|
+
Display Glasses [](https://developer.android.com/develop/xr/devices#audio-display) [Learn about XR device types →](https://developer.android.com/develop/xr/devices)
|
|
3
|
+
|
|
4
|
+
<br />
|
|
5
|
+
|
|
6
|
+
Just like on a phone, accessing sensitive hardware like the camera and
|
|
7
|
+
microphone on audio glasses and display glasses requires explicit user consent.
|
|
8
|
+
These are considered
|
|
9
|
+
**glasses-specific permissions**, and your app must request them at runtime,
|
|
10
|
+
even if it already has the corresponding permissions on the phone.
|
|
11
|
+
|
|
12
|
+
## Declare the permissions in your app's manifest
|
|
13
|
+
|
|
14
|
+
Before requesting permissions, you must [declare them in your app's manifest](https://developer.android.com/training/permissions/declaring)
|
|
15
|
+
file using the [`<uses-permission>`](https://developer.android.com/guide/topics/manifest/uses-permission-element) element. This declaration remains the
|
|
16
|
+
same whether the permission is for a phone or a glasses-specific feature, but
|
|
17
|
+
you must still explicitly request it for glasses-specific hardware or
|
|
18
|
+
functionality.
|
|
19
|
+
|
|
20
|
+
<manifest ...>
|
|
21
|
+
<!-- Only declare permissions that your app actually needs. In this example,
|
|
22
|
+
we declare permissions for the camera. -->
|
|
23
|
+
<uses-permission android:name="android.permission.CAMERA"/>
|
|
24
|
+
<application ...>
|
|
25
|
+
...
|
|
26
|
+
</application>
|
|
27
|
+
</manifest>
|
|
28
|
+
|
|
29
|
+
## Before requesting glasses permissions
|
|
30
|
+
|
|
31
|
+
Review the [permission principles and workflows](https://developer.android.com/training/permissions/requesting#principles) to make sure you provide the
|
|
32
|
+
best experience for your users, like [checking whether the user has already
|
|
33
|
+
granted the runtime permissions](https://developer.android.com/training/permissions/requesting#already-granted) your app requires and [whether your app
|
|
34
|
+
should show a rationale](https://developer.android.com/training/permissions/requesting#explain) to the user before requesting glasses-specific
|
|
35
|
+
permissions.
|
|
36
|
+
|
|
37
|
+
## Permission scenarios
|
|
38
|
+
|
|
39
|
+
There are different scenarios you might encounter when requesting [dangerous
|
|
40
|
+
runtime permissions](https://developer.android.com/guide/topics/permissions/requesting#normal-dangerous) on audio and display glasses:
|
|
41
|
+
|
|
42
|
+
- Request runtime permissions from a projected activity
|
|
43
|
+
- Request runtime permissions from a phone activity
|
|
44
|
+
|
|
45
|
+
See the following sections in this guide for details about each scenario.
|
|
46
|
+
|
|
47
|
+
### Request and handle runtime permissions from a projected activity
|
|
48
|
+
|
|
49
|
+
To request permissions for audio glasses and display glasses, first use the
|
|
50
|
+
[`ActivityResultLauncher`](https://developer.android.com/reference/kotlin/androidx/activity/result/ActivityResultLauncher) with the
|
|
51
|
+
[`ProjectedPermissionsResultContract`](https://developer.android.com/reference/kotlin/androidx/xr/projected/permissions/ProjectedPermissionsResultContract#ProjectedPermissionsResultContract()) method to register the permissions
|
|
52
|
+
launcher. When the user has acted on the permission request, the callback
|
|
53
|
+
receives a map of permission names to their granted status.
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
```kotlin
|
|
57
|
+
// Register the permissions launcher using the ProjectedPermissionsResultContract.
|
|
58
|
+
private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
|
|
59
|
+
registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
|
|
60
|
+
if (results[Manifest.permission.CAMERA] == true) {
|
|
61
|
+
isPermissionDenied = false
|
|
62
|
+
initializeGlassesFeatures()
|
|
63
|
+
} else {
|
|
64
|
+
// Handle permission denial.
|
|
65
|
+
isPermissionDenied = true
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
<br />
|
|
71
|
+
|
|
72
|
+
#### Key points about the code
|
|
73
|
+
|
|
74
|
+
- You need to specify which permissions your app requires, such as [`Manifest.permission.CAMERA`](https://developer.android.com/reference/kotlin/android/Manifest.permission#camera) or [`Manifest.permission.RECORD_AUDIO`](https://developer.android.com/reference/kotlin/android/Manifest.permission#record_audio).
|
|
75
|
+
- Your app should handle both granted and denied results gracefully in the launcher's callback.
|
|
76
|
+
|
|
77
|
+
To trigger the permission request flow, pass a list of
|
|
78
|
+
[`ProjectedPermissionsRequestParams`](https://developer.android.com/reference/kotlin/androidx/xr/projected/permissions/ProjectedPermissionsRequestParams) to your registered permission
|
|
79
|
+
launcher's `launch` method. The `ProjectedPermissionsRequestParams` object
|
|
80
|
+
bundles the requested manifest permissions together with a custom `rationale`
|
|
81
|
+
string. The `rationale` string must clearly and concisely explain why the app
|
|
82
|
+
requires access to the glasses' hardware features (such as the camera or
|
|
83
|
+
microphone).
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
```kotlin
|
|
87
|
+
private fun requestHardwarePermissions() {
|
|
88
|
+
val params = ProjectedPermissionsRequestParams(
|
|
89
|
+
permissions = listOf(Manifest.permission.CAMERA),
|
|
90
|
+
rationale = "Camera access is required to overlay digital content on your physical environment."
|
|
91
|
+
)
|
|
92
|
+
requestPermissionLauncher.launch(listOf(params))
|
|
93
|
+
}
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
<br />
|
|
97
|
+
|
|
98
|
+
#### Key points about the code
|
|
99
|
+
|
|
100
|
+
- Calling `launch` on the launcher triggers the [permission request user
|
|
101
|
+
flow](https://developer.android.com/develop/xr/jetpack-xr-sdk/request-hardware-permissions#permissions-user-flow).
|
|
102
|
+
|
|
103
|
+
#### Understand the permission request user flow
|
|
104
|
+
|
|
105
|
+
When you launch a permission request using the
|
|
106
|
+
[`ProjectedPermissionsResultContract`](https://developer.android.com/reference/kotlin/androidx/xr/projected/permissions/ProjectedPermissionsResultContract#ProjectedPermissionsResultContract()) method, the system initiates a
|
|
107
|
+
coordinated user flow across both the glasses and the phone.
|
|
108
|
+
|
|
109
|
+
During the permissions user flow, here is what your app and the user can expect:
|
|
110
|
+
|
|
111
|
+
1. **On the glasses** : An activity appears on the **projected device
|
|
112
|
+
(glasses)**, instructing the user to look at their phone to continue.
|
|
113
|
+
|
|
114
|
+
<br />
|
|
115
|
+
|
|
116
|
+
> [!WARNING]
|
|
117
|
+
> **Preview:** Currently, the instructions and rationale provided by the system are not audible to the user. To provide an audible rationale to the user, we recommend using [Text to Speech
|
|
118
|
+
> (TTS)](https://developer.android.com/develop/xr/jetpack-xr-sdk/tts). For example:
|
|
119
|
+
>
|
|
120
|
+
> <br />
|
|
121
|
+
>
|
|
122
|
+
> tts?.speak("Please review the permission request on your host device",
|
|
123
|
+
> TextToSpeech.QUEUE_ADD,
|
|
124
|
+
> null,
|
|
125
|
+
> "permission_request")
|
|
126
|
+
>
|
|
127
|
+
> <br />
|
|
128
|
+
>
|
|
129
|
+
<br />
|
|
130
|
+
|
|
131
|
+
2. **On the phone** : Concurrently, an activity launches on the **host device
|
|
132
|
+
(phone)**. This screen displays the rationale string you provided and gives
|
|
133
|
+
the user the option to proceed or cancel.
|
|
134
|
+
|
|
135
|
+
3. **On the phone** : If the user accepts the rationale, a modified Android
|
|
136
|
+
system permission dialog appears on the phone telling the user that they are
|
|
137
|
+
granting the permission **for the glasses** (not the phone), and the user
|
|
138
|
+
can formally grant or deny the permission.
|
|
139
|
+
|
|
140
|
+
4. **Receiving the result** : After the user makes their final choice, the
|
|
141
|
+
activities on both the phone and glasses are dismissed. Your
|
|
142
|
+
[`ActivityResultLauncher`](https://developer.android.com/reference/kotlin/androidx/activity/result/ActivityResultLauncher) callback is then invoked with a map
|
|
143
|
+
containing the granted status for each requested permission.
|
|
144
|
+
|
|
145
|
+
### Request runtime permissions in a phone activity
|
|
146
|
+
|
|
147
|
+
If your app is running in a phone activity but requires permissions for audio or
|
|
148
|
+
display glasses---for example, to let a user switch a video stream to the glasses'
|
|
149
|
+
camera for a first-person point of view---request the permissions using the
|
|
150
|
+
device-specific [`Activity#requestPermissions(permissions, requestCode,
|
|
151
|
+
deviceId)`](https://developer.android.com/reference/kotlin/android/app/Activity#requestpermissions_1) method.
|
|
152
|
+
|
|
153
|
+
To target audio and display glasses, obtain the appropriate device ID by calling
|
|
154
|
+
[`getDeviceId`](https://developer.android.com/reference/kotlin/android/content/Context#getdeviceid) on a projected device context. Pass this ID when requesting
|
|
155
|
+
permissions from your phone activity, as shown in the following example:
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
```kotlin
|
|
159
|
+
// Request the projected permission from phone activity
|
|
160
|
+
requestPermissions(
|
|
161
|
+
arrayOf(Manifest.permission.CAMERA),
|
|
162
|
+
// REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant
|
|
163
|
+
REQUEST_CODE_GLASSES_CAMERA,
|
|
164
|
+
projectedDeviceId
|
|
165
|
+
)
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
<br />
|
|
169
|
+
|
|
170
|
+
#### Handle the permission results
|
|
171
|
+
|
|
172
|
+
Once the user responds to the permission dialog on the phone, their decision is
|
|
173
|
+
delivered to your app by invoking the onRequestPermissionsResult callback.
|
|
174
|
+
|
|
175
|
+
To handle the response, override [`onRequestPermissionsResult`](https://developer.android.com/reference/kotlin/androidx/core/app/ActivityCompat.OnRequestPermissionsResultCallback#onRequestPermissionsResult(int,java.lang.String%5B%5D,int%5B%5D)) within the
|
|
176
|
+
`Activity` instance that initiated the permission request.
|
|
177
|
+
|
|
178
|
+
The following code snippet shows how to handle the callback and verify whether
|
|
179
|
+
the user granted the requested permissions:
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
```kotlin
|
|
183
|
+
private companion object {
|
|
184
|
+
// REQUEST_CODE_GLASSES_CAMERA is a developer-defined constant.
|
|
185
|
+
const val REQUEST_CODE_GLASSES_CAMERA = 1001
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
@RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM)
|
|
189
|
+
override fun onRequestPermissionsResult(
|
|
190
|
+
requestCode: Int,
|
|
191
|
+
permissions: Array<out String>,
|
|
192
|
+
grantResults: IntArray,
|
|
193
|
+
deviceId: Int
|
|
194
|
+
) {
|
|
195
|
+
super.onRequestPermissionsResult(requestCode, permissions, grantResults, deviceId)
|
|
196
|
+
|
|
197
|
+
// Handle the result of the permission request
|
|
198
|
+
if (requestCode == REQUEST_CODE_GLASSES_CAMERA && deviceId == projectedDeviceId) {
|
|
199
|
+
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
|
|
200
|
+
// Proceed with glasses camera features
|
|
201
|
+
} else {
|
|
202
|
+
// Handle glasses permission denied
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
<br />
|
|
209
|
+
|
|
210
|
+
##### Key points about the code
|
|
211
|
+
|
|
212
|
+
- Use the `deviceId` overload with the `onRequestPermissionsResult` callback to ensure the permission status is correctly mapped to the specific context, such as the audio or display glasses rather than the host phone.
|
|
213
|
+
- Your app should handle both granted and denied results gracefully.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
When creating a Glimmer Button component, refer to the following implementation
|
|
2
|
+
samples in `ButtonSamples.kt`:
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
```kotlin
|
|
6
|
+
/*
|
|
7
|
+
* Copyright 2025 The Android Open Source Project
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
package androidx.xr.glimmer.samples
|
|
23
|
+
|
|
24
|
+
import androidx.annotation.Sampled
|
|
25
|
+
import androidx.compose.foundation.layout.fillMaxSize
|
|
26
|
+
import androidx.compose.foundation.layout.wrapContentSize
|
|
27
|
+
import androidx.compose.runtime.Composable
|
|
28
|
+
import androidx.compose.ui.Alignment
|
|
29
|
+
import androidx.compose.ui.Modifier
|
|
30
|
+
import androidx.compose.ui.tooling.preview.Preview
|
|
31
|
+
import androidx.xr.glimmer.Button
|
|
32
|
+
import androidx.xr.glimmer.ButtonSize
|
|
33
|
+
import androidx.xr.glimmer.GlimmerTheme
|
|
34
|
+
import androidx.xr.glimmer.Icon
|
|
35
|
+
import androidx.xr.glimmer.Text
|
|
36
|
+
import androidx.xr.glimmer.list.GlimmerLazyColumn
|
|
37
|
+
|
|
38
|
+
@Composable
|
|
39
|
+
fun ButtonSampleUsage() {
|
|
40
|
+
GlimmerLazyColumn(
|
|
41
|
+
horizontalAlignment = Alignment.CenterHorizontally,
|
|
42
|
+
modifier = Modifier.fillMaxSize().wrapContentSize(Alignment.Center),
|
|
43
|
+
) {
|
|
44
|
+
item { ButtonSample() }
|
|
45
|
+
item { ButtonWithLeadingIconSample() }
|
|
46
|
+
item { ButtonWithTrailingIconSample() }
|
|
47
|
+
item { ButtonWithLeadingAndTrailingIconSample() }
|
|
48
|
+
item { LargeButtonSample() }
|
|
49
|
+
item { LargeButtonWithLeadingIconSample() }
|
|
50
|
+
item { LargeButtonWithTrailingIconSample() }
|
|
51
|
+
item { LargeButtonWithLeadingAndTrailingIconSample() }
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@Sampled
|
|
56
|
+
@Composable
|
|
57
|
+
fun ButtonSample() {
|
|
58
|
+
Button(onClick = {}) { Text("Send") }
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@Sampled
|
|
62
|
+
@Composable
|
|
63
|
+
fun ButtonWithLeadingIconSample() {
|
|
64
|
+
Button(onClick = {}, leadingIcon = { Icon(FavoriteIcon, "Localized description") }) {
|
|
65
|
+
Text("Send")
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Composable
|
|
70
|
+
private fun ButtonWithTrailingIconSample() {
|
|
71
|
+
Button(onClick = {}, trailingIcon = { Icon(FavoriteIcon, "Localized description") }) {
|
|
72
|
+
Text("Send")
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@Composable
|
|
77
|
+
private fun ButtonWithLeadingAndTrailingIconSample() {
|
|
78
|
+
Button(
|
|
79
|
+
onClick = {},
|
|
80
|
+
leadingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
81
|
+
trailingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
82
|
+
) {
|
|
83
|
+
Text("Send")
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@Sampled
|
|
88
|
+
@Composable
|
|
89
|
+
fun LargeButtonSample() {
|
|
90
|
+
Button(onClick = {}, buttonSize = ButtonSize.Large) { Text("Send") }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
@Composable
|
|
94
|
+
private fun LargeButtonWithLeadingIconSample() {
|
|
95
|
+
Button(
|
|
96
|
+
onClick = {},
|
|
97
|
+
buttonSize = ButtonSize.Large,
|
|
98
|
+
leadingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
99
|
+
) {
|
|
100
|
+
Text("Send")
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
@Composable
|
|
105
|
+
private fun LargeButtonWithTrailingIconSample() {
|
|
106
|
+
Button(
|
|
107
|
+
onClick = {},
|
|
108
|
+
buttonSize = ButtonSize.Large,
|
|
109
|
+
trailingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
110
|
+
) {
|
|
111
|
+
Text("Send")
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@Composable
|
|
116
|
+
private fun LargeButtonWithLeadingAndTrailingIconSample() {
|
|
117
|
+
Button(
|
|
118
|
+
onClick = {},
|
|
119
|
+
buttonSize = ButtonSize.Large,
|
|
120
|
+
leadingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
121
|
+
trailingIcon = { Icon(FavoriteIcon, "Localized description") },
|
|
122
|
+
) {
|
|
123
|
+
Text("Send")
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@Preview
|
|
128
|
+
@Composable
|
|
129
|
+
private fun ButtonPreview() {
|
|
130
|
+
GlimmerTheme { ButtonSample() }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
@Preview
|
|
134
|
+
@Composable
|
|
135
|
+
private fun ButtonWithLeadingIconPreview() {
|
|
136
|
+
GlimmerTheme { ButtonWithLeadingIconSample() }
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@Preview
|
|
140
|
+
@Composable
|
|
141
|
+
private fun ButtonWithTrailingIconPreview() {
|
|
142
|
+
GlimmerTheme { ButtonWithTrailingIconSample() }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@Preview
|
|
146
|
+
@Composable
|
|
147
|
+
private fun ButtonWithLeadingAndTrailingIconPreview() {
|
|
148
|
+
GlimmerTheme { ButtonWithLeadingAndTrailingIconSample() }
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
@Preview
|
|
152
|
+
@Composable
|
|
153
|
+
private fun LargeButtonPreview() {
|
|
154
|
+
GlimmerTheme { LargeButtonSample() }
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@Preview
|
|
158
|
+
@Composable
|
|
159
|
+
private fun LargeButtonWithLeadingIconPreview() {
|
|
160
|
+
GlimmerTheme { LargeButtonWithLeadingIconSample() }
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@Preview
|
|
164
|
+
@Composable
|
|
165
|
+
private fun LargeButtonWithTrailingIconPreview() {
|
|
166
|
+
GlimmerTheme { LargeButtonWithTrailingIconSample() }
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@Preview
|
|
170
|
+
@Composable
|
|
171
|
+
private fun LargeButtonWithLeadingAndTrailingIconPreview() {
|
|
172
|
+
GlimmerTheme { LargeButtonWithLeadingAndTrailingIconSample() }
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
<br />
|
package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
When creating a Glimmer Button component, refer to the following source code in
|
|
2
|
+
`Button.kt`:
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
```kotlin
|
|
6
|
+
/*
|
|
7
|
+
* Copyright 2025 The Android Open Source Project
|
|
8
|
+
*
|
|
9
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
* you may not use this file except in compliance with the License.
|
|
11
|
+
* You may obtain a copy of the License at
|
|
12
|
+
*
|
|
13
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
*
|
|
15
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
* See the License for the specific language governing permissions and
|
|
19
|
+
* limitations under the License.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
package androidx.xr.glimmer
|
|
23
|
+
|
|
24
|
+
import androidx.compose.foundation.clickable
|
|
25
|
+
import androidx.compose.foundation.interaction.MutableInteractionSource
|
|
26
|
+
import androidx.compose.foundation.layout.Arrangement
|
|
27
|
+
import androidx.compose.foundation.layout.Box
|
|
28
|
+
import androidx.compose.foundation.layout.PaddingValues
|
|
29
|
+
import androidx.compose.foundation.layout.Row
|
|
30
|
+
import androidx.compose.foundation.layout.RowScope
|
|
31
|
+
import androidx.compose.foundation.layout.defaultMinSize
|
|
32
|
+
import androidx.compose.foundation.layout.padding
|
|
33
|
+
import androidx.compose.runtime.Composable
|
|
34
|
+
import androidx.compose.runtime.CompositionLocalProvider
|
|
35
|
+
import androidx.compose.runtime.Immutable
|
|
36
|
+
import androidx.compose.runtime.remember
|
|
37
|
+
import androidx.compose.ui.Alignment
|
|
38
|
+
import androidx.compose.ui.Modifier
|
|
39
|
+
import androidx.compose.ui.graphics.Color
|
|
40
|
+
import androidx.compose.ui.graphics.Shape
|
|
41
|
+
import androidx.compose.ui.semantics.Role
|
|
42
|
+
import androidx.compose.ui.semantics.role
|
|
43
|
+
import androidx.compose.ui.semantics.semantics
|
|
44
|
+
import androidx.compose.ui.unit.Dp
|
|
45
|
+
import androidx.compose.ui.unit.dp
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Button is a component used for exposing actions to a user.
|
|
49
|
+
*
|
|
50
|
+
* @sample androidx.xr.glimmer.samples.ButtonSample
|
|
51
|
+
*
|
|
52
|
+
* Buttons can use icons to provide more context about the action:
|
|
53
|
+
*
|
|
54
|
+
* @sample androidx.xr.glimmer.samples.ButtonWithLeadingIconSample
|
|
55
|
+
*
|
|
56
|
+
* There are multiple button size variants - providing a different [ButtonSize] will affect default
|
|
57
|
+
* values used inside this button, such as the minimum height. Note that you can still provide a
|
|
58
|
+
* size modifier such as [androidx.compose.foundation.layout.size] to change the layout size of this
|
|
59
|
+
* button, [buttonSize] affects default values and values internal to the button.
|
|
60
|
+
*
|
|
61
|
+
* @sample androidx.xr.glimmer.samples.LargeButtonSample
|
|
62
|
+
* @param onClick called when this button is clicked
|
|
63
|
+
* @param modifier the [Modifier] to be applied to this button
|
|
64
|
+
* @param enabled controls the enabled state of this button. When `false`, this button will not
|
|
65
|
+
* respond to user input
|
|
66
|
+
* @param buttonSize the size variant of this button, represented as a [ButtonSize]. Changing
|
|
67
|
+
* [buttonSize] will affect some default values used by this button - but the final resulting size
|
|
68
|
+
* of the button will still be calculated based on the content of the button, and any provided
|
|
69
|
+
* size modifiers such as [androidx.compose.foundation.layout.size]. For example, setting a 100.dp
|
|
70
|
+
* size using a size modifier will result in the same layout size regardless of [buttonSize], but
|
|
71
|
+
* the provided [buttonSize] will affect other properties such as padding values and the size of
|
|
72
|
+
* icons.
|
|
73
|
+
* @param leadingIcon optional leading icon to be placed before the [content]. This is typically an
|
|
74
|
+
* [Icon] tinted with [contentColor] by default.
|
|
75
|
+
* @param trailingIcon optional trailing icon to be placed after the [content]. This is typically an
|
|
76
|
+
* [Icon] tinted with [contentColor] by default.
|
|
77
|
+
* @param shape the [Shape] used to clip this button, and also used to draw the background and
|
|
78
|
+
* border
|
|
79
|
+
* @param color background color of this button
|
|
80
|
+
* @param contentColor content color used by components inside [content], [leadingIcon], and
|
|
81
|
+
* [trailingIcon].
|
|
82
|
+
* @param contentPadding the spacing values to apply internally between the container and the
|
|
83
|
+
* content
|
|
84
|
+
* @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
|
|
85
|
+
* emitting Interactions for this button. You can use this to change the button's appearance or
|
|
86
|
+
* preview the button in different states. Note that if `null` is provided, interactions will
|
|
87
|
+
* still happen internally.
|
|
88
|
+
* @param content the main content, typically [Text], to display inside this button
|
|
89
|
+
*/
|
|
90
|
+
@Composable
|
|
91
|
+
public fun Button(
|
|
92
|
+
onClick: () -> Unit,
|
|
93
|
+
modifier: Modifier = Modifier,
|
|
94
|
+
enabled: Boolean = true,
|
|
95
|
+
buttonSize: ButtonSize = ButtonSize.Medium,
|
|
96
|
+
leadingIcon: @Composable (() -> Unit)? = null,
|
|
97
|
+
trailingIcon: @Composable (() -> Unit)? = null,
|
|
98
|
+
shape: Shape = GlimmerTheme.shapes.large,
|
|
99
|
+
color: Color = GlimmerTheme.colors.surface,
|
|
100
|
+
contentColor: Color = calculateContentColor(color),
|
|
101
|
+
contentPadding: PaddingValues = ButtonDefaults.contentPadding(buttonSize),
|
|
102
|
+
interactionSource: MutableInteractionSource? = null,
|
|
103
|
+
content: @Composable RowScope.() -> Unit,
|
|
104
|
+
) {
|
|
105
|
+
val iconSize = ButtonDefaults.iconSize
|
|
106
|
+
val iconSpacing = ButtonDefaults.iconSpacing
|
|
107
|
+
val minHeight = ButtonDefaults.minimumHeight(buttonSize)
|
|
108
|
+
|
|
109
|
+
val internalInteractionSource = interactionSource ?: remember { MutableInteractionSource() }
|
|
110
|
+
|
|
111
|
+
CompositionLocalProvider(LocalTextStyle provides GlimmerTheme.typography.bodySmall) {
|
|
112
|
+
Row(
|
|
113
|
+
modifier
|
|
114
|
+
.semantics { role = Role.Button }
|
|
115
|
+
.surface(
|
|
116
|
+
enabled = enabled,
|
|
117
|
+
shape = shape,
|
|
118
|
+
color = color,
|
|
119
|
+
contentColor = contentColor,
|
|
120
|
+
depthEffect = null,
|
|
121
|
+
interactionSource = internalInteractionSource,
|
|
122
|
+
)
|
|
123
|
+
.clickable(
|
|
124
|
+
enabled = enabled,
|
|
125
|
+
interactionSource = internalInteractionSource,
|
|
126
|
+
onClick = onClick,
|
|
127
|
+
)
|
|
128
|
+
.defaultMinSize(minHeight = minHeight)
|
|
129
|
+
.padding(contentPadding),
|
|
130
|
+
horizontalArrangement = Arrangement.Center,
|
|
131
|
+
verticalAlignment = Alignment.CenterVertically,
|
|
132
|
+
) {
|
|
133
|
+
if (leadingIcon != null) {
|
|
134
|
+
Box(Modifier.padding(end = iconSpacing)) {
|
|
135
|
+
CompositionLocalProvider(LocalIconSize provides iconSize, content = leadingIcon)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
content()
|
|
139
|
+
if (trailingIcon != null) {
|
|
140
|
+
Box(Modifier.padding(start = iconSpacing)) {
|
|
141
|
+
CompositionLocalProvider(
|
|
142
|
+
LocalIconSize provides iconSize,
|
|
143
|
+
content = trailingIcon,
|
|
144
|
+
)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* ButtonSize represents the different size variants of a [Button]. ButtonSize will affect default
|
|
153
|
+
* values used inside a [Button], such as the minimum height and the size of icons.
|
|
154
|
+
*/
|
|
155
|
+
@Immutable
|
|
156
|
+
@JvmInline
|
|
157
|
+
public value class ButtonSize internal constructor(private val value: Int) {
|
|
158
|
+
public companion object {
|
|
159
|
+
/** ButtonSize representing a medium [Button]. This is the default size. */
|
|
160
|
+
public val Medium: ButtonSize = ButtonSize(1)
|
|
161
|
+
/** ButtonSize representing a large [Button]. */
|
|
162
|
+
public val Large: ButtonSize = ButtonSize(2)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/** Default values used for [Button]. */
|
|
167
|
+
public object ButtonDefaults {
|
|
168
|
+
/** Default content padding used for a [Button] with the specified [buttonSize]. */
|
|
169
|
+
@Composable
|
|
170
|
+
public fun contentPadding(buttonSize: ButtonSize): PaddingValues {
|
|
171
|
+
val componentSpacingValues = GlimmerTheme.componentSpacingValues
|
|
172
|
+
return if (buttonSize == ButtonSize.Medium) {
|
|
173
|
+
PaddingValues(
|
|
174
|
+
horizontal = componentSpacingValues.large,
|
|
175
|
+
vertical = componentSpacingValues.small,
|
|
176
|
+
)
|
|
177
|
+
} else {
|
|
178
|
+
PaddingValues(componentSpacingValues.large)
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/** Default minimum height for [Button] and [ToggleButton] with the specified [buttonSize]. */
|
|
183
|
+
internal fun minimumHeight(buttonSize: ButtonSize): Dp {
|
|
184
|
+
return when (buttonSize) {
|
|
185
|
+
ButtonSize.Medium -> 48.dp
|
|
186
|
+
ButtonSize.Large -> 72.dp
|
|
187
|
+
else -> throw IllegalArgumentException("Unknown size $buttonSize.")
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Default icon size for buttons with non-icon content: [Button], [ToggleButton]. */
|
|
192
|
+
@get:Composable
|
|
193
|
+
internal val iconSize: Dp
|
|
194
|
+
get() = GlimmerTheme.iconSizes.small
|
|
195
|
+
|
|
196
|
+
/** Default spacing between icon and content for [Button] and [ToggleButton]. */
|
|
197
|
+
@get:Composable
|
|
198
|
+
internal val iconSpacing: Dp
|
|
199
|
+
get() = GlimmerTheme.componentSpacingValues.extraSmall
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
<br />
|