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,120 @@
|
|
|
1
|
+
A journey is an XML-specified test of an Android app's behavior. It consists of
|
|
2
|
+
a list of `<action>` elements. For example:
|
|
3
|
+
`xml
|
|
4
|
+
<journey name="My Journey">
|
|
5
|
+
<description>
|
|
6
|
+
A sample journey to illustrate the format
|
|
7
|
+
</description>
|
|
8
|
+
<actions>
|
|
9
|
+
<action>
|
|
10
|
+
Tap the "Home" icon
|
|
11
|
+
</action>
|
|
12
|
+
<action>
|
|
13
|
+
Verify that the app is on its Home screen
|
|
14
|
+
</action>
|
|
15
|
+
</actions>
|
|
16
|
+
</journey>`
|
|
17
|
+
|
|
18
|
+
Evaluate a journey by proceeding through the `<actions>` list in sequential
|
|
19
|
+
order. Evaluate each `<action>` block individually.
|
|
20
|
+
A journey succeeds if all elements in the `<actions>` list succeed.
|
|
21
|
+
|
|
22
|
+
A journey is a test case for an app. The journey XML is the source of truth; if
|
|
23
|
+
the app disagrees with the journey, the app has failed.
|
|
24
|
+
Additionally, if the app exits, crashes, or freezes, journey evaluation stops
|
|
25
|
+
and the journey fails.
|
|
26
|
+
|
|
27
|
+
**IMPORTANT** - Execute each step EXACTLY as written, and independently of other
|
|
28
|
+
steps! If an action says to `"tap the first search result"`,
|
|
29
|
+
you MUST find the search results and tap the first one. Do this even if you
|
|
30
|
+
believe you know the intent behind the action.
|
|
31
|
+
|
|
32
|
+
## Taking Actions
|
|
33
|
+
|
|
34
|
+
Some `<action>` elements specify UI interactions to perform on the running
|
|
35
|
+
Android app. Perform the interaction and verify that the app does
|
|
36
|
+
not crash or behave in an unexpected manner. This is the *only* verification
|
|
37
|
+
you should perform for an `<action>`.
|
|
38
|
+
|
|
39
|
+
If the interaction cannot be performed as specified, the journey fails.
|
|
40
|
+
Example:
|
|
41
|
+
`<action>Click the red button</action>`
|
|
42
|
+
If you determine a red button is not present in the UI, the journey fails.
|
|
43
|
+
|
|
44
|
+
If the text of an `<action>` specifies a list of actions, break it into
|
|
45
|
+
sub-actions and evaluate them individually:
|
|
46
|
+
Example:
|
|
47
|
+
`<action>Search for soda and add the first result to the cart</action>`
|
|
48
|
+
This should be evaluated as:
|
|
49
|
+
`<action>Search for soda</action>
|
|
50
|
+
<action>Add the first result to the cart</action>`
|
|
51
|
+
|
|
52
|
+
If an `<action>` contains something that is not a specification for a UI
|
|
53
|
+
interaction, alert the user that the journey is malformed and exit
|
|
54
|
+
early, specifying the error in question.
|
|
55
|
+
|
|
56
|
+
## Verifying Expectations
|
|
57
|
+
|
|
58
|
+
`<action>` elements that begin with "check" or "verify" specify expectations
|
|
59
|
+
for the current state of the Android app. Determine the current
|
|
60
|
+
state of the app and check if the expectations are met.
|
|
61
|
+
|
|
62
|
+
Determine the current state of the app by inspecting the current screen of the
|
|
63
|
+
device without interacting with it.
|
|
64
|
+
Example:
|
|
65
|
+
`<action>Check if "Switch 2" is visible on the screen</action>`
|
|
66
|
+
This requires only inspecting the current screen, not scrolling or interacting.
|
|
67
|
+
If "Switch 2" is not currently visible, the action fails.
|
|
68
|
+
|
|
69
|
+
If the expectations are not met, mark the `<action>` as a failure and the
|
|
70
|
+
journey evaluation ends. A single `<action>` may contain
|
|
71
|
+
multiple expectations.
|
|
72
|
+
Example:
|
|
73
|
+
`<action>Verify that the app is on the Home screen, the Home icon is blue, and the temperature is displayed</action>`
|
|
74
|
+
This `<action>` fails if ANY of the following are false:
|
|
75
|
+
|
|
76
|
+
- The app is on the Home screen
|
|
77
|
+
- There is a Home icon, and it is blue
|
|
78
|
+
- A temperature is displayed
|
|
79
|
+
|
|
80
|
+
## Handling failure
|
|
81
|
+
|
|
82
|
+
When running a journey, evaluate it as a test. Failure is acceptable, and often
|
|
83
|
+
expected. Proper reporting of failures is the priority.
|
|
84
|
+
|
|
85
|
+
Keep debugging and troubleshooting to a minimum; assume that tools are showing
|
|
86
|
+
you the correct output every time. The goal is to determine
|
|
87
|
+
if the *current* Android app can correctly handle the *current* steps outlined
|
|
88
|
+
in the journey. Suggestions for bug fixes, clarification, or
|
|
89
|
+
other improvements should be kept to journey evaluation summary at the end.
|
|
90
|
+
|
|
91
|
+
## Summarizing
|
|
92
|
+
|
|
93
|
+
After evaluating the whole journey, output a markdown (.md) file describing the
|
|
94
|
+
results.
|
|
95
|
+
|
|
96
|
+
The file should have the following format:
|
|
97
|
+
|
|
98
|
+
# Journey: <Name of the journey>
|
|
99
|
+
|
|
100
|
+
## Results
|
|
101
|
+
|
|
102
|
+
<!-- Append "✅" to the action header if the instruction was evaluated or "❌" if the instruction could not be evaluated -->
|
|
103
|
+
### Action: Click the blue button ✅
|
|
104
|
+
- **Commands**:
|
|
105
|
+
<!-- A list of the ADB commands executed while evaluating the instruction -->
|
|
106
|
+
- `adb shell input swipe 490 200 500 500 500`
|
|
107
|
+
- `adb shell input tap 45 920`
|
|
108
|
+
|
|
109
|
+
<!-- Failure reasons, feedback, or other useful information -->
|
|
110
|
+
- **Comment**: The journey step doesn't specify that the button requires scrolling to see
|
|
111
|
+
|
|
112
|
+
### Action: Check if "Switch 2" is visible on the screen ✅
|
|
113
|
+
- **Screenshot**: [switch_2_screenshot.png](path/to/screenshot)
|
|
114
|
+
- **Comment**: Confirmed both in layout and visually
|
|
115
|
+
|
|
116
|
+
### Action: The home screen is shown ❌
|
|
117
|
+
- **Comment**: The settings page was shown
|
|
118
|
+
|
|
119
|
+
<!-- Append nothing to the action header if the action was not evaluated because the journey execution ended early -->
|
|
120
|
+
### Action: Swipe down to view active notifications
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: android-code-review
|
|
3
|
+
description: Reviews native Android code in Kotlin and Java for the bugs that reach production — lifecycle and Context leaks, coroutine scope, dispatcher and cancellation mistakes, Flow collection outside the lifecycle, Jetpack Compose state, recomposition and side effects, state lost on configuration change or process death, main-thread I/O, WorkManager and permission handling, and exported components. Use when reviewing Kotlin or Java files in an Android app or module, Activities, Fragments, ViewModels, Composables, repositories or Gradle modules, or when the user asks for an Android code review or PR review.
|
|
4
|
+
intents: [review, performance]
|
|
5
|
+
stacks: [android, kotlin-multiplatform]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Android Code Review
|
|
9
|
+
|
|
10
|
+
Apply to Kotlin and Java sources under `src/main` (and `androidMain` in KMP). Items are ordered by impact: the first sections cause crashes, leaks or lost user data. Before flagging an API as missing or deprecated, check the library versions in the version catalog or build files.
|
|
11
|
+
|
|
12
|
+
## 1. Lifecycle and leaks (crash / leak)
|
|
13
|
+
|
|
14
|
+
- [ ] **Activity or View held beyond its lifecycle.** An `Activity`, `Fragment`, `View` or Activity `Context` stored in a singleton, companion object, `ViewModel`, static field or long-lived callback. `ViewModel`s must not reference Views or Activity contexts; use `applicationContext` only where a Context is truly needed.
|
|
15
|
+
- [ ] **Fragment view binding not cleared.** A binding stored in a property must be set to `null` in `onDestroyView`, since the Fragment outlives its view.
|
|
16
|
+
- [ ] **Flow collected without lifecycle awareness.** `lifecycleScope.launch { flow.collect {} }` keeps collecting in the background. Use `repeatOnLifecycle(Lifecycle.State.STARTED)`, and in Fragments use `viewLifecycleOwner.lifecycleScope`. In Compose, `collectAsStateWithLifecycle()` (from `lifecycle-runtime-compose`) instead of `collectAsState()`.
|
|
17
|
+
- [ ] **Listeners and receivers not unregistered.** `registerReceiver`, location or sensor listeners, and callbacks added in `onStart`/`onResume` without the matching removal.
|
|
18
|
+
|
|
19
|
+
## 2. Coroutines
|
|
20
|
+
|
|
21
|
+
- [ ] **`GlobalScope` or a hand-made `CoroutineScope` never cancelled.** Work should live in `viewModelScope`, `lifecycleScope` or an injected application scope.
|
|
22
|
+
- [ ] **Blocking work on the main thread.** File or database I/O, JSON parsing of large payloads or `runBlocking` on the main thread. Room throws on main-thread queries unless explicitly allowed; network libraries may not. Blocking calls belong in `withContext(Dispatchers.IO)` (or `Default` for CPU work).
|
|
23
|
+
- [ ] **Swallowed cancellation.** `catch (e: Exception)` around suspending calls also catches `CancellationException`; rethrow it, or catch narrower exceptions.
|
|
24
|
+
- [ ] **Unhandled exceptions in `launch`.** An exception in `launch` crashes the app unless handled; errors should become UI state, not silent failures.
|
|
25
|
+
- [ ] **Hardcoded dispatchers** in classes that need tests: inject them.
|
|
26
|
+
|
|
27
|
+
## 3. State
|
|
28
|
+
|
|
29
|
+
- [ ] **State lost on configuration change or process death.** UI state kept in Activity fields, or user input not saved. Use a `ViewModel`, and `SavedStateHandle` (or `rememberSaveable` in Compose) for what must survive process death.
|
|
30
|
+
- [ ] **Impossible states representable.** Separate `isLoading`, `error` and `data` fields that can contradict each other; prefer a sealed UI state.
|
|
31
|
+
- [ ] **Mutable state exposed.** `MutableStateFlow`/`MutableLiveData` public from a `ViewModel` instead of a read-only `StateFlow`/`LiveData`.
|
|
32
|
+
- [ ] **One-off events as state** (navigation, snackbars) replayed after rotation.
|
|
33
|
+
|
|
34
|
+
## 4. Jetpack Compose
|
|
35
|
+
|
|
36
|
+
- [ ] **Side effects in composition.** Network calls, analytics, navigation or `viewModel.load()` called directly in a composable body run on every recomposition. Use `LaunchedEffect` with the right keys, or trigger from the `ViewModel`.
|
|
37
|
+
- [ ] **`remember` without keys** for values derived from parameters, so they go stale when the parameter changes.
|
|
38
|
+
- [ ] **Unstable parameters** (plain `List`, lambdas recreated each time, classes from modules without Compose compiler stability) causing avoidable recompositions in frequently updated screens. Only report where it shows up in a hot path.
|
|
39
|
+
- [ ] **`LazyColumn`/`LazyRow` items without `key`** when items can move or be removed.
|
|
40
|
+
- [ ] **State read too high.** Reading a fast-changing state (scroll offset, animation) at the top of a screen recomposes all of it; read it in a lambda or lower in the tree.
|
|
41
|
+
|
|
42
|
+
## 5. Platform
|
|
43
|
+
|
|
44
|
+
- [ ] **Exported components.** `android:exported="true"` on activities, services, receivers or providers without a permission, that act on the incoming `Intent` without validating it. Details in `mobile-security-audit`.
|
|
45
|
+
- [ ] **Runtime permissions.** Features used without checking the permission, or denial ("don't ask again") not handled.
|
|
46
|
+
- [ ] **Background work.** Long work started from an Activity or a plain `Service` that the system will stop; persistent or deferrable work belongs in `WorkManager`. Starting foreground services and exact alarms have restrictions that depend on `targetSdk`; check it before reviewing.
|
|
47
|
+
- [ ] **`PendingIntent` mutability.** Flags must include `FLAG_IMMUTABLE` or `FLAG_MUTABLE` explicitly on apps targeting Android 12 or higher.
|
|
48
|
+
|
|
49
|
+
## 6. Maintainability and UI quality
|
|
50
|
+
|
|
51
|
+
- [ ] Hardcoded user-visible strings instead of `strings.xml`.
|
|
52
|
+
- [ ] Missing `contentDescription` on meaningful images and icon buttons; touch targets smaller than 48dp.
|
|
53
|
+
- [ ] Business logic in Activities, Fragments or Composables instead of the `ViewModel` or domain layer.
|
|
54
|
+
- [ ] New logic without tests when the module already has a test suite.
|
|
55
|
+
|
|
56
|
+
## Output
|
|
57
|
+
|
|
58
|
+
Report in the matching section of the `mobile-code-reviewer` report (Bugs for sections 1–3, Performance for Compose recomposition, Security for exported components), always with `file:line` and the corrected snippet when the fix is short.
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: android-display-glasses-with-jetpack-compose-glimmer
|
|
3
|
+
description: Provides guidelines for developing projected Android XR apps for display
|
|
4
|
+
glasses using the Jetpack Compose Glimmer UI toolkit. This skill covers foundational
|
|
5
|
+
Glimmer design principles, workflows for implementing Jetpack Compose Glimmer, and
|
|
6
|
+
interaction models for the glasses form factor. Use this skill to build an Android
|
|
7
|
+
XR Augmented Experience app with Jetpack Compose Glimmer that adheres to the Glimmer
|
|
8
|
+
design system for optimized glasses styling.
|
|
9
|
+
license: Apache-2.0
|
|
10
|
+
source: https://github.com/android/skills
|
|
11
|
+
routing: manual
|
|
12
|
+
stacks: [android]
|
|
13
|
+
metadata:
|
|
14
|
+
author: Google LLC
|
|
15
|
+
last-updated: '2026-09-08'
|
|
16
|
+
keywords:
|
|
17
|
+
- Jetpack Compose Glimmer
|
|
18
|
+
- audio glasses
|
|
19
|
+
- display glasses
|
|
20
|
+
- Projected Activity
|
|
21
|
+
- GlimmerTheme
|
|
22
|
+
- Additive Display
|
|
23
|
+
- Android XR - Augmented Experiences
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## Glossary
|
|
27
|
+
|
|
28
|
+
| Term | Definition |
|
|
29
|
+
|---|---|
|
|
30
|
+
| **Intelligent Eyewear** | All-day wear, hands-free devices that provide access to information. Equipped with speakers, a camera, and a microphone. Some are audio-only (audio glasses), and some also have a display (display glasses). |
|
|
31
|
+
| **Display glasses** | Audio glasses with the addition of a private display in lenses for glanceable visuals that harmonize with audio output. |
|
|
32
|
+
| **Jetpack Compose Glimmer** | A Compose UI toolkit for building augmented Android XR experiences, optimized for display glasses. It provides components, theming, and behaviors for transparent displays. |
|
|
33
|
+
| **Projected Activity (Glasses Activity)** | An Android `Activity` that runs on a host device (phone) but its UI and interactions are projected to a connected, intelligent eyewear device (audio or display glasses). |
|
|
34
|
+
| **Projected Device** | An XR device connected to an Android-powered device (host). Host projects the application content to the Projected device and let users interact with it. |
|
|
35
|
+
| **GlimmerTheme** | The root provider for styling tokens, including GlimmerColors, GlimmerTypography, and GlimmerShapes. |
|
|
36
|
+
| **Additive Display** | A display technology where black (#000000) is rendered as 100% transparent. UI is built by adding light to the environment. Display glasses have an additive display. |
|
|
37
|
+
| **Augmented Experiences** | Android XR experiences that enhance a user's focus and presence in the real world. They are lightweight and additive, helping users while they are on-the-go |
|
|
38
|
+
| **Visual Angle** | A unit of measurement for perceived size in XR. The minimum readable text size is 0.6 degrees (approx. 18sp at 1 m). |
|
|
39
|
+
|
|
40
|
+
## Prerequisites
|
|
41
|
+
|
|
42
|
+
- Mobile project must target `compileSdk` 37 or higher. If the `compileSdk` is lower than 37, increase the `compileSdk` to 37.
|
|
43
|
+
- Ensure you are using the latest library dependencies from [Create your first
|
|
44
|
+
activity for intelligent eyewear](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/first-activity).
|
|
45
|
+
|
|
46
|
+
## Core Constraints
|
|
47
|
+
|
|
48
|
+
- **Don't:** Use `MaterialTheme` or Material Components.
|
|
49
|
+
- **Do:** Use `GlimmerTheme` and Jetpack Compose Glimmer Components.
|
|
50
|
+
- **Do:** Use `createGoogleSansFlexTypography()` from `androidx.xr.glimmer:glimmer-google-fonts` as the `Typography` value for `GlimmerTheme` to ensure that consistent typography is applied throughout the components.
|
|
51
|
+
|
|
52
|
+
## Limitations
|
|
53
|
+
|
|
54
|
+
- Specific hardware device models or their unique capabilities are not detailed.
|
|
55
|
+
- **Elevation:** Standard Material 3 shadow or elevation modifiers are not supported. You must use `ShadowScope` or `Depth` tokens from Jetpack Compose Glimmer.
|
|
56
|
+
- **Minimum Size:** The absolute minimum size for readable text is 18sp (0.6°). Anything smaller will fail legibility checks.
|
|
57
|
+
- **Text Weight:** Avoid "Thin" or "Hairline" weights; they cause shimmering and aliasing on additive AR lenses.
|
|
58
|
+
|
|
59
|
+
## 1. Set up dependencies
|
|
60
|
+
|
|
61
|
+
- **Setup Projected Activity:** First, you need to create a new projected activity for your app. If the project doesn't already have one, see [Create
|
|
62
|
+
your first activity for intelligent eyewear](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/first-activity). Use [references/projectedcontext-source.md](references/projectedcontext-source.md) to launch the Glasses Projected activity on the Projected Device. Ensure that you specify `xr_projected` for the `android:requiredDisplayCategory` attribute in app manifest to tell the system that this activity will use a projected context to access hardware from a connected device.
|
|
63
|
+
- **Mobile App Integration:** If the project contains an existing mobile app, you must create a new Glasses Activity dedicated to rendering Glimmer UI. For detailed configuration, heavily reference [Create your first activity
|
|
64
|
+
for intelligent eyewear](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/first-activity). If there isn't already a method to launch the Glasses Activity, add a button to the existing mobile app UI labeled "Launch on Glasses" that uses `ProjectedContext` to launch the Glasses Activity on the glasses. Place the 'Launch on Glasses' button as a screen-level FloatingActionButton, in the TopAppBar, or in the top navigation bar to ensure users discover the projection capability. If the glasses aren't connected, disable the button. Don't launch the Glasses Activity on the phone, only on the display glasses. If it makes sense to automatically launch the Glasses Activity without an explicit launch button, then do so.
|
|
65
|
+
- **UI Library:** Identify if the project has the `androidx.xr.glimmer:glimmer` library, if not it must be added to the project. See [Declaring Jetpack Compose Glimmer Dependencies](https://developer.android.com/jetpack/androidx/releases/xr-glimmer#declaring_dependencies) to fetch the latest dependency version.
|
|
66
|
+
- **Theming:** All Glimmer components must be wrapped within the `GlimmerTheme` composable to ensure correct token resolution.
|
|
67
|
+
- **Mandatory black background:** Display glasses use additive displays. Any non-black color in the background blocks the real world. **You must always** set a pure black background (`Modifier.background(Color.Black)`) on the root container of your Projected Activity.
|
|
68
|
+
- **Font:** The default font is Google Sans Flex. Use `androidx.xr.glimmer.googlefonts` library with the default type styles unless otherwise specified. Use `createGoogleSansFlexTypography` to create a `Typography` instance with the Google Sans Flex configuration. Provide this `Typography` instance as normal through `GlimmerTheme`. Use [references/glimmersansflextypography-source.md](references/glimmersansflextypography-source.md) for configuration.
|
|
69
|
+
- **Hardware Capabilities:** Different types of intelligent eyewear devices have different capabilities. To check for these at runtime, see the [Check
|
|
70
|
+
device capabilities at runtime for intelligent eyewear](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/check-capabilities).
|
|
71
|
+
- **Hardware Permissions:** To request hardware permissions like the microphone and camera, see the [Request hardware permissions for
|
|
72
|
+
intelligent eyewear](references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md).
|
|
73
|
+
- **Hardware Access:** To use the glasses camera, sensors, or access the phone's hardware, see the [Use a projected context to access hardware on
|
|
74
|
+
intelligent eyewear](references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md).
|
|
75
|
+
|
|
76
|
+
## 2. Minimize and translate the UI
|
|
77
|
+
|
|
78
|
+
- For display glasses, build UI using components from the Jetpack Compose Glimmer framework.
|
|
79
|
+
- Use depth to communicate element priority and hierarchy.
|
|
80
|
+
- Design from the bottom up, trying to minimize how much of the real world you cover. Always bottom align UI to the glasses display.
|
|
81
|
+
- **One Thing at a Time:** Prioritize the user's awareness of the real world. Show only one primary piece of information at a time (for example, using a `Stack`) to minimize obstruction of the user's field of view. Avoid multiple simultaneous cards.
|
|
82
|
+
- **Color Contrast:** Ensure at least a 70% tone difference between foreground and background using the HCT color space. For calculation metrics, use [references/material-hct-source.md](references/material-hct-source.md).
|
|
83
|
+
|
|
84
|
+
## 3. Map input controls
|
|
85
|
+
|
|
86
|
+
- Map app interactions, such as tap and swipe, to the available hardware controls on the glasses, such as the touchpad.
|
|
87
|
+
- Inputs are one-dimensional; users must make one control input at a time.
|
|
88
|
+
- Avoid nesting scrolling controls.
|
|
89
|
+
- Jetpack Compose Glimmer components are designed to work with standard input methods, such as a tap or swipe on the glasses' touchpad.
|
|
90
|
+
- Use System Back to dismiss temporary states or detailed views.
|
|
91
|
+
- To add input, focus, tap, swipe to your Glasses UI, follow [Focus in Jetpack
|
|
92
|
+
Compose Glimmer](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md).
|
|
93
|
+
- For a detailed breakdown of hardware inputs, see [Hardware Controls for
|
|
94
|
+
display glasses](references/android/design/ui/ai-glasses/guides/interaction/inputs.md)
|
|
95
|
+
|
|
96
|
+
## 4. Build with Jetpack Compose Glimmer
|
|
97
|
+
|
|
98
|
+
Jetpack Compose Glimmer is the UI toolkit for building augmented experiences on
|
|
99
|
+
display glasses.
|
|
100
|
+
|
|
101
|
+
### Key Features
|
|
102
|
+
|
|
103
|
+
- **Glimmer Theming:** A simplified glasses-specific theme for optimal visibility.
|
|
104
|
+
- **Pre-compatible Input:** Supports tap and swipe by default.
|
|
105
|
+
- **Pre-built Components:** Provides optimized composables like `Card`, `ListItem`, `Button`, etc.
|
|
106
|
+
|
|
107
|
+
### Focus Management in Glimmer
|
|
108
|
+
|
|
109
|
+
- Jetpack Compose Glimmer uses a one-dimensional focus search.
|
|
110
|
+
- Focus movement is continuous for scrollable containers and discrete for elements like a row of buttons.
|
|
111
|
+
- To enable the system to automatically set initial focus, you must set the `isInitialFocusOnFocusableAvailable` flag to `true` in your activity's `onCreate` method. For more information on how to implement, see [Focus in
|
|
112
|
+
Jetpack Compose Glimmer](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md).
|
|
113
|
+
|
|
114
|
+
### Implementing Glimmer Styles
|
|
115
|
+
|
|
116
|
+
Glimmer styles are accessed through the `GlimmerTheme` object. Use
|
|
117
|
+
[references/glimmertheme-source.md](references/glimmertheme-source.md) for reference.
|
|
118
|
+
|
|
119
|
+
| Category | Token | Value / Role |
|
|
120
|
+
|---|---|---|
|
|
121
|
+
| **Color** | primary | #9BBFFF (Focal color) |
|
|
122
|
+
| **Color** | secondary | #4C88E9 (Focal color) |
|
|
123
|
+
| **Color** | surface | #262626 (Transparent base - renders as transparent) |
|
|
124
|
+
| **Color** | outline | #606460 (3.dp border color) |
|
|
125
|
+
| **Shape** | Standard | `RoundedCornerShape(36.dp)` |
|
|
126
|
+
| **Shape** | Small | `RoundedCornerShape(12.dp)` |
|
|
127
|
+
|
|
128
|
+
#### Typography Scale (Google Sans Flex)
|
|
129
|
+
|
|
130
|
+
**Strict default:** When creating Glimmer UI you must use Google Sans Flex
|
|
131
|
+
unless a custom brand typeface is explicitly specified.
|
|
132
|
+
**Variable Font Settings:** As Google Sans Flex is a variable font, you must
|
|
133
|
+
configure the following axes:
|
|
134
|
+
|
|
135
|
+
- **Roundness (`ROND`):** Always set to `100f` for the signature rounded appearance.
|
|
136
|
+
- **Width (`wdth`):** Set to `100f`.
|
|
137
|
+
- **Optical Size (`opsz`):** Set to `9f`.
|
|
138
|
+
- **Weight (`wght`):** Use specific values for different roles (Title: `725f`, Body: `520f`, Caption: `650f`).
|
|
139
|
+
|
|
140
|
+
| Style Name | Size / Line-Height | Weight Axis | Width | Roundness | Optical size |
|
|
141
|
+
|---|---|---|---|---|---|
|
|
142
|
+
| **Title Large** | 30.sp / 36.sp | 725 | 100 | 100 | 9 |
|
|
143
|
+
| **Title Medium** | 24.sp / 32.sp | 725 | 100 | 100 | 9 |
|
|
144
|
+
| **Title Small** | 20.sp / 28.sp | 725 | 100 | 100 | 9 |
|
|
145
|
+
| **Body Large** | 30.sp / 36.sp | 520 | 100 | 100 | 9 |
|
|
146
|
+
| **Body Medium** | 24.sp / 32.sp | 520 | 100 | 100 | 9 |
|
|
147
|
+
| **Body Small** | 20.sp / 28.sp | 520 | 100 | 100 | 9 |
|
|
148
|
+
| **Caption** | 18.sp / 28.sp | 650 | 100 | 100 | 9 |
|
|
149
|
+
|
|
150
|
+
#### Depth Levels
|
|
151
|
+
|
|
152
|
+
Simulate depth on display glasses using shadows to establish a sense of
|
|
153
|
+
hierarchy through varying levels of emphasis. The Jetpack Compose Glimmer
|
|
154
|
+
controls use `DepthEffect` with 5 preset `DepthEffectLevels`. Use
|
|
155
|
+
[references/deptheffect-source.md](references/deptheffect-source.md) and
|
|
156
|
+
[references/deptheffectlevels-source.md](references/deptheffectlevels-source.md) for reference.
|
|
157
|
+
|
|
158
|
+
Some examples:
|
|
159
|
+
|
|
160
|
+
| Level | Usage |
|
|
161
|
+
|---|---|
|
|
162
|
+
| **level1** | Standard rest state for cards and persistent background UI. |
|
|
163
|
+
| **level2** | Standard focus/pressed state for buttons and interactive cards. |
|
|
164
|
+
| **ExtraSmall** | 4.dp |
|
|
165
|
+
|
|
166
|
+
### Implementing Jetpack Compose Glimmer Components
|
|
167
|
+
|
|
168
|
+
#### Cards
|
|
169
|
+
|
|
170
|
+
Cards are a fundamental surface-based container in Glimmer used to group related
|
|
171
|
+
content, such as text, images, icons and actions into a single focal point. They
|
|
172
|
+
establish a clear depth plane (Z-axis) in the Glasses environment, providing a
|
|
173
|
+
stable background for text, images, and icons. Never embed a card within a List
|
|
174
|
+
Item.
|
|
175
|
+
|
|
176
|
+
##### Core Implementation Logic
|
|
177
|
+
|
|
178
|
+
- **Surface Hierarchy:** Cards are designed to sit on a base surface or within a list. They provide an automatic visual feedback when focused if an `onClick` lambda is provided.
|
|
179
|
+
- **Interactivity:**
|
|
180
|
+
- **IF** the entire Card serves as a single trigger (e.g., a media item or a setting): **THEN** provide an `onClick` lambda to enable focus effects.
|
|
181
|
+
- **ELSE:** Leave `onClick` as `null` if the Card contains multiple internal interactive elements (like separate buttons or switches) to avoid focus contention.
|
|
182
|
+
|
|
183
|
+
##### Technical Documentation Links
|
|
184
|
+
|
|
185
|
+
If you are creating a Glimmer Card component, read the:
|
|
186
|
+
|
|
187
|
+
- **Developer Guidance:** [Jetpack Compose Glimmer: Cards](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md)
|
|
188
|
+
- **API Source Code:** Use [references/card-source.md](references/card-source.md).
|
|
189
|
+
- **Implementation Samples:** Use [references/card-samples-source.md](references/card-samples-source.md). (Basic and Interactive Card usage)
|
|
190
|
+
|
|
191
|
+
#### Buttons
|
|
192
|
+
|
|
193
|
+
Buttons are the primary triggers for discrete actions in Glimmer. They are
|
|
194
|
+
specifically optimized for the display glasses focus model, where a focus
|
|
195
|
+
highlight is added when focus is moved to the button using the touchpad or other
|
|
196
|
+
methods.
|
|
197
|
+
|
|
198
|
+
##### Core Implementation Logic
|
|
199
|
+
|
|
200
|
+
- There are two types of buttons to choose from in Glimmer:
|
|
201
|
+
- **Standard buttons** (Required text label with optional leading or trailing icons). Use this when there is more space in the UI, or when the meaning of the button isn't clear without text.
|
|
202
|
+
- **Icon buttons** (icon only). Only use icon buttons when the icon is clearly understandable.
|
|
203
|
+
- Both icon and standard buttons have default and toggle variants:
|
|
204
|
+
- Default (use for single actions like "buy" or "navigate")
|
|
205
|
+
- Toggle (use for things with selected states like mute buttons)
|
|
206
|
+
|
|
207
|
+
##### Technical Documentation Links
|
|
208
|
+
|
|
209
|
+
If you are creating a Glimmer Button component, read the:
|
|
210
|
+
|
|
211
|
+
- **Developer Guidance:** [Jetpack Compose Glimmer: Buttons](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md)
|
|
212
|
+
- **API Source Code:** Use [references/button-source.md](references/button-source.md).
|
|
213
|
+
- **Implementation Samples:** Use [references/button-samples-source.md](references/button-samples-source.md).
|
|
214
|
+
|
|
215
|
+
#### Title Chips
|
|
216
|
+
|
|
217
|
+
Chips are a pill-shaped, specialized labeling component designed to sit above a
|
|
218
|
+
`Card` or a group of content to provide a title. Use title chips to display
|
|
219
|
+
concise information like a short title, a name, or a status.
|
|
220
|
+
|
|
221
|
+
##### Guidelines and usage
|
|
222
|
+
|
|
223
|
+
- **Spatial Spacing** : When using a standalone `TitleChip` preceding content, you must use `TitleChipDefaults.AssociatedContentSpacing` (8.dp) to maintain the visual hierarchy.
|
|
224
|
+
- **Interactivity:** Title chips are purely for informational purposes, they cannot be targeted or activated for navigation.
|
|
225
|
+
- **Layout** Always center text in a title chip. Never let the title chip go to two lines, and truncate extra words. Keep the label to three words or less.
|
|
226
|
+
|
|
227
|
+
##### Technical Documentation Links
|
|
228
|
+
|
|
229
|
+
If you are creating a Glimmer Title Chip component, read the:
|
|
230
|
+
|
|
231
|
+
- **Developer Guidance:** [Jetpack Compose Glimmer: Title Chips](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md)
|
|
232
|
+
- **API Source Code:** Use [references/titlechip-source.md](references/titlechip-source.md).
|
|
233
|
+
- **Implementation Samples:** Use [references/titlechip-samples-source.md](references/titlechip-samples-source.md). (Title Chips above group content)
|
|
234
|
+
|
|
235
|
+
#### Icons
|
|
236
|
+
|
|
237
|
+
Icons are visual symbols used to represent concepts, actions, or status in a
|
|
238
|
+
concise way. In Glimmer, icons and icon buttons are optimized for the XR
|
|
239
|
+
environment, providing clear visibility on additive displays and gaze-responsive
|
|
240
|
+
feedback for interactive elements.
|
|
241
|
+
|
|
242
|
+
##### Guidelines and usage
|
|
243
|
+
|
|
244
|
+
- **Sizing:** Use predefined `IconSizes` (e.g., Standard, Large) to ensure icons remain legible and meet the minimum touch target requirements for the XR environment.
|
|
245
|
+
- **Interactivity:**
|
|
246
|
+
- **If** an icon serves as a trigger: **Then** you must use an `IconButton` to provide the automatic visual feedback and required tap-target padding.
|
|
247
|
+
- **ELSE:** Use a standalone `Icon` for non-interactive indicators or status symbols.
|
|
248
|
+
- **Contrast:** **NEVER** use pure black (#000000) for icon tints; always use themed colors or standard Glimmer content colors to ensure the icon is visible against dark or real-world backgrounds.
|
|
249
|
+
- **Icon Library** The default icon library is [Material Symbols](https://fonts.google.com/icons?icon.style=Rounded) with 600 weight, Rounded, Unfilled, unless otherwise specified.
|
|
250
|
+
|
|
251
|
+
##### Technical Documentation Links
|
|
252
|
+
|
|
253
|
+
If you are creating a Glimmer Icon component, read the:
|
|
254
|
+
|
|
255
|
+
- **Developer Guidance:** [Jetpack Compose Glimmer: Icons](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md)
|
|
256
|
+
- **API Source Code (Icon):** Use [references/icon-source.md](references/icon-source.md).
|
|
257
|
+
- **API Source Code (IconButton):** Use [references/iconbutton-source.md](references/iconbutton-source.md).
|
|
258
|
+
- **API Source Code (IconSizes):** Use [references/iconsizes-source.md](references/iconsizes-source.md).
|
|
259
|
+
|
|
260
|
+
#### Lists
|
|
261
|
+
|
|
262
|
+
Lists are containers that allow you to navigate between and see multiple items
|
|
263
|
+
on glasses. If your use case works with only seeing one item in the list at a
|
|
264
|
+
time, use a Glimmer Stack. Use lists with a Title Chip when the list
|
|
265
|
+
items are similar in type. Also use a Glimmer Stack if the items are of
|
|
266
|
+
different types.
|
|
267
|
+
|
|
268
|
+
##### Guidelines and usage
|
|
269
|
+
|
|
270
|
+
- **ListItem Slots:** Use the `ListItem` composable for rows. It provides predefined slots. Use [references/listitem-source.md](references/listitem-source.md) for reference.
|
|
271
|
+
- **Visual Consistency:** When building lists of similar items, always use a consistent background color (typically `GlimmerTheme.colors.surface`) and corner radius (standard 36.dp) for every item. Don't vary these unless you are visually grouping different *types* of content.
|
|
272
|
+
- **Integrated Title Chips:** Glimmer Lists support integrated title chips. **IF** you need a section header within a list: **THEN** enable the integrated title chip rather than adding a standalone `TitleChip` to maintain spatial consistency.
|
|
273
|
+
- **Vertical Arrangement:** ALWAYS use `verticalArrangement =
|
|
274
|
+
Arrangement.spacedBy(20.dp)` for `GlimmerLazyColumn` to ensure visual separation between items on the glasses display.
|
|
275
|
+
- Be sure to use the default 20 dp spacing between list items unless otherwise specified.
|
|
276
|
+
|
|
277
|
+
##### Technical Documentation Links
|
|
278
|
+
|
|
279
|
+
If you are creating a Glimmer List component, read the:
|
|
280
|
+
|
|
281
|
+
- **API Source Code (List):** Use [references/list-source.md](references/list-source.md).
|
|
282
|
+
- **API Source Code (ListItem):** Use [references/listitem-source.md](references/listitem-source.md).
|
|
283
|
+
- **API Source Code (GlimmerLazyListState):** Use [references/liststate-source.md](references/liststate-source.md).
|
|
284
|
+
|
|
285
|
+
#### Stacks
|
|
286
|
+
|
|
287
|
+
A stack is a collapsed list that only displays one piece of content at a time,
|
|
288
|
+
in a stacked visual, such as a card. If it is useful to show more than one item
|
|
289
|
+
at a time, use the Glimmer List control. Don't use a title chip with a stack.
|
|
290
|
+
If the items are of different types use a stack to show them. If the items are
|
|
291
|
+
of the same type, use a list.
|
|
292
|
+
|
|
293
|
+
##### Guidelines and usage
|
|
294
|
+
|
|
295
|
+
**Layout tips**
|
|
296
|
+
|
|
297
|
+
- Stacks accept variable height items.
|
|
298
|
+
- Align your stack control with the bottom of the display.
|
|
299
|
+
- The stack control must be 66 dp taller than the tallest item in the stack, allowing room for the scrim and minimizing movement when navigating between items.
|
|
300
|
+
- **Clipping and Layering:** To ensure that items behind the top item are correctly clipped and hidden, you **must** apply the `.itemDecoration(CardDefaults.shape)` modifier to the `Card` (or relevant container) inside every `item` block.
|
|
301
|
+
- **Depth Shadows:** To maintain spatial separation and element priority, utilize Glimmer's `ShadowScope`, `DepthEffect`, or prescribed `DepthEffectLevels` for depth plane scaling.
|
|
302
|
+
|
|
303
|
+
##### Technical Documentation Links
|
|
304
|
+
|
|
305
|
+
If you are creating a Glimmer Stack component, read the:
|
|
306
|
+
|
|
307
|
+
- **API Source Code (Stack):** Use [references/stack-source.md](references/stack-source.md).
|
|
308
|
+
- **API Source Code (StackState):** Use [references/stackstate-source.md](references/stackstate-source.md).
|
|
309
|
+
- **API Source Code (StackItemScope):** Use [references/stackitemscope-source.md](references/stackitemscope-source.md).
|
|
310
|
+
|
|
311
|
+
#### Text
|
|
312
|
+
|
|
313
|
+
In Jetpack Compose Glimmer, the [`Text`](references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md) component builds off the Compose
|
|
314
|
+
text component, and lets you set various text properties. Be sure to choose a
|
|
315
|
+
style from the `GlimmerTheme` for your text. Modify the theme for your
|
|
316
|
+
application if you want custom typography.
|
|
317
|
+
|
|
318
|
+
##### Essential Constraint: Glimmer Text versus Material Text
|
|
319
|
+
|
|
320
|
+
On transparent Display Glasses (additive displays), standard Material `Text`
|
|
321
|
+
resolves to dark foreground tokens which render as transparent and invisible.
|
|
322
|
+
Glimmer `Text` intelligently manages theme color matching. When no manual color
|
|
323
|
+
override is specified, Glimmer `Text` automatically defaults to the content
|
|
324
|
+
color provided by the nearest Glimmer surface.
|
|
325
|
+
|
|
326
|
+
- **Don't:** Use Material Text
|
|
327
|
+
- **Do:** Use Glimmer Text
|
|
328
|
+
|
|
329
|
+
#### Surface
|
|
330
|
+
|
|
331
|
+
`Surface` is a fundamental building block in Glimmer. Use
|
|
332
|
+
[references/surface-source.md](references/surface-source.md) for reference.
|
|
333
|
+
|
|
334
|
+
A surface represents a distinct visual area or 'physical' boundary for
|
|
335
|
+
components such as buttons and cards. Use it if you need to build a custom
|
|
336
|
+
component.
|
|
337
|
+
|
|
338
|
+
## 5. Integrate with system UI
|
|
339
|
+
|
|
340
|
+
- For a detailed breakdown of notifications on intelligent eyewear, see [Understand notification behavior for intelligent eyewear](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/notifications/behavior) and learn how to [Start a glasses activity on display glasses from a notification](https://developer.android.com/develop/xr/jetpack-xr-sdk/ai-glasses/notifications/start-activity).
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
Glasses have multiple sources and types of interaction inputs, including
|
|
2
|
+
hardware and touch, physical gesture, and voice.
|
|
3
|
+
|
|
4
|
+
## Hardware controls
|
|
5
|
+
|
|
6
|
+
Glasses controls can vary depending on device model, but most will include a
|
|
7
|
+
camera button, touchpad, display button, and power switch or button. Hardware
|
|
8
|
+
controls have default interactions, and some can be remapped for your app.
|
|
9
|
+
Consider that inputs for glasses are more 1-dimensional, where users can make
|
|
10
|
+
one control input at a time, compared to touchscreen inputs. The glasses
|
|
11
|
+
hardware controls have default interaction mapping, some of which are handled by
|
|
12
|
+
the app, and others that are handled by the system.
|
|
13
|
+
|
|
14
|
+
**The system will handle the following inputs:**
|
|
15
|
+
|
|
16
|
+
- Camera button single press to take photos and camera button hold to take videos
|
|
17
|
+
- Swiping with two fingers on the touchpad for volume
|
|
18
|
+
- Touch \& hold on the touchpad and the wake word on the microphone will launch Gemini
|
|
19
|
+
- System interprets swipe down on display glasses as system back.
|
|
20
|
+
|
|
21
|
+
**Your app has access to the glasses:**
|
|
22
|
+
|
|
23
|
+
- Microphone
|
|
24
|
+
- Point-of-View (POV) camera
|
|
25
|
+
- Inertial Measurement Unit (IMU)
|
|
26
|
+
- Camera button double-press
|
|
27
|
+
|
|
28
|
+

|
|
30
|
+
|
|
31
|
+
### AI Glasses
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
| Input | Gesture | Interaction affect |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Touchpad (1) | Tap | Play / Pause / Confirm |
|
|
37
|
+
| | Swipe | Next/Previous/Dismiss |
|
|
38
|
+
| | Swipe down | N/A |
|
|
39
|
+
| | Touch \& hold | Invoke AI |
|
|
40
|
+
| | 2-finger swipe | Volume |
|
|
41
|
+
| Display button (2) | Press | N/A |
|
|
42
|
+
| Camera button (3) | Press | Photo / Video end |
|
|
43
|
+
| | Touch \& hold | Video start |
|
|
44
|
+
| | Double press | Camera |
|
|
45
|
+
|
|
46
|
+
<br />
|
|
47
|
+
|
|
48
|
+
### AI Glasses with Display
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
| Input | Gesture | Interaction affect |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| Touchpad (1) | Tap | Play / Pause / Confirm |
|
|
54
|
+
| | Swipe | UI Navigation |
|
|
55
|
+
| | Swipe down | Back |
|
|
56
|
+
| | Touch \& hold | Invoke AI |
|
|
57
|
+
| | 2-finger swipe | Volume |
|
|
58
|
+
| Display button (2) | Press | Wake/Sleep |
|
|
59
|
+
| Camera button (3) | Press | Photo / Video end |
|
|
60
|
+
| | Touch \& hold | Video start |
|
|
61
|
+
| | Double press | Camera |
|
|
62
|
+
|
|
63
|
+
<br />
|
|
64
|
+
|
|
65
|
+
 On
|
|
67
|
+
display focus states have a visual affordances.
|