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,182 @@
|
|
|
1
|
+
When implementing Glimmer styles, refer to the following source code in
|
|
2
|
+
`GlimmerTheme.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.BorderStroke
|
|
25
|
+
import androidx.compose.foundation.IndicationNodeFactory
|
|
26
|
+
import androidx.compose.foundation.LocalIndication
|
|
27
|
+
import androidx.compose.foundation.interaction.InteractionSource
|
|
28
|
+
import androidx.compose.runtime.Composable
|
|
29
|
+
import androidx.compose.runtime.CompositionLocal
|
|
30
|
+
import androidx.compose.runtime.CompositionLocalProvider
|
|
31
|
+
import androidx.compose.runtime.Immutable
|
|
32
|
+
import androidx.compose.runtime.ProvidableCompositionLocal
|
|
33
|
+
import androidx.compose.runtime.ReadOnlyComposable
|
|
34
|
+
import androidx.compose.runtime.staticCompositionLocalOf
|
|
35
|
+
import androidx.compose.ui.Modifier
|
|
36
|
+
import androidx.compose.ui.node.DelegatableNode
|
|
37
|
+
import androidx.xr.glimmer.GlimmerTheme.Companion.colors
|
|
38
|
+
import androidx.xr.glimmer.GlimmerTheme.Companion.depthEffectLevels
|
|
39
|
+
import androidx.xr.glimmer.GlimmerTheme.Companion.iconSizes
|
|
40
|
+
import androidx.xr.glimmer.GlimmerTheme.Companion.shapes
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
|
|
44
|
+
* an application.
|
|
45
|
+
*
|
|
46
|
+
* Components use properties provided here when retrieving default values.
|
|
47
|
+
*
|
|
48
|
+
* Any values that are not set will inherit the current value from the theme, falling back to the
|
|
49
|
+
* defaults if there is no parent GlimmerTheme. This allows using a GlimmerTheme at the top of your
|
|
50
|
+
* application, and then separate GlimmerTheme(s) for different screens / parts of your UI,
|
|
51
|
+
* overriding only the parts of the theme definition that need to change.
|
|
52
|
+
*
|
|
53
|
+
* @param colors [Colors] used by components within this hierarchy
|
|
54
|
+
* @param typography [Typography] used by components within this hierarchy
|
|
55
|
+
* @param componentSpacingValues [ComponentSpacingValues] used by components within this hierarchy
|
|
56
|
+
* @param content The content that can retrieve values from this theme
|
|
57
|
+
*/
|
|
58
|
+
@Composable
|
|
59
|
+
public fun GlimmerTheme(
|
|
60
|
+
colors: Colors = GlimmerTheme.colors,
|
|
61
|
+
typography: Typography = GlimmerTheme.typography,
|
|
62
|
+
componentSpacingValues: ComponentSpacingValues = GlimmerTheme.componentSpacingValues,
|
|
63
|
+
content: @Composable () -> Unit,
|
|
64
|
+
) {
|
|
65
|
+
val theme = GlimmerTheme(colors, typography, componentSpacingValues)
|
|
66
|
+
CompositionLocalProvider(
|
|
67
|
+
_localGlimmerTheme provides theme,
|
|
68
|
+
// TODO: b/413429405
|
|
69
|
+
LocalIndication provides NoIndication,
|
|
70
|
+
LocalTextStyle provides typography.bodySmall,
|
|
71
|
+
LocalIconSize provides theme.iconSizes.medium,
|
|
72
|
+
content = content,
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Jetpack Compose Glimmer contains different theme subsystems to allow visual customization across
|
|
78
|
+
* an application.
|
|
79
|
+
*
|
|
80
|
+
* Components use properties provided here when retrieving default values.
|
|
81
|
+
*
|
|
82
|
+
* @property colors [Colors] used by Jetpack Compose Glimmer components
|
|
83
|
+
* @property typography [Typography] used by Jetpack Compose Glimmer components. It is recommended
|
|
84
|
+
* to use `createGoogleSansFlexTypography()` from `androidx.xr.glimmer:glimmer-google-fonts` to
|
|
85
|
+
* create this.
|
|
86
|
+
* @property componentSpacingValues [ComponentSpacingValues] used by Jetpack Compose Glimmer
|
|
87
|
+
* components
|
|
88
|
+
* @property shapes [Shapes] used by Jetpack Compose Glimmer components
|
|
89
|
+
* @property depthEffectLevels [DepthEffectLevels] used by Jetpack Compose Glimmer components
|
|
90
|
+
* @property iconSizes [IconSizes] used by icons
|
|
91
|
+
*/
|
|
92
|
+
@Immutable
|
|
93
|
+
public class GlimmerTheme(
|
|
94
|
+
public val colors: Colors = Colors(),
|
|
95
|
+
public val typography: Typography = Typography(),
|
|
96
|
+
public val componentSpacingValues: ComponentSpacingValues = ComponentSpacingValues(),
|
|
97
|
+
) {
|
|
98
|
+
public val shapes: Shapes = _shapes
|
|
99
|
+
public val depthEffectLevels: DepthEffectLevels = _depthEffectLevels
|
|
100
|
+
public val iconSizes: IconSizes = _iconSizes
|
|
101
|
+
|
|
102
|
+
public companion object {
|
|
103
|
+
/** Retrieves the current [Colors] at the call site's position in the hierarchy. */
|
|
104
|
+
public val colors: Colors
|
|
105
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.colors
|
|
106
|
+
|
|
107
|
+
/** Retrieves the current [Typography] at the call site's position in the hierarchy. */
|
|
108
|
+
public val typography: Typography
|
|
109
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.typography
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Retrieves the current [ComponentSpacingValues] at the call site's position in the
|
|
113
|
+
* hierarchy.
|
|
114
|
+
*/
|
|
115
|
+
public val componentSpacingValues: ComponentSpacingValues
|
|
116
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.componentSpacingValues
|
|
117
|
+
|
|
118
|
+
/** Retrieves the current [Shapes] at the call site's position in the hierarchy. */
|
|
119
|
+
public val shapes: Shapes
|
|
120
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.shapes
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Retrieves the current [DepthEffectLevels] at the call site's position in the hierarchy.
|
|
124
|
+
*/
|
|
125
|
+
public val depthEffectLevels: DepthEffectLevels
|
|
126
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.depthEffectLevels
|
|
127
|
+
|
|
128
|
+
/** Retrieves the current [IconSizes] at the call site's position in the hierarchy. */
|
|
129
|
+
public val iconSizes: IconSizes
|
|
130
|
+
@Composable @ReadOnlyComposable get() = LocalGlimmerTheme.current.iconSizes
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* [CompositionLocal] providing [GlimmerTheme] throughout the hierarchy. You can use
|
|
134
|
+
* properties in the companion object to access specific subsystems, for example [colors].
|
|
135
|
+
* To provide a new value for this, use [GlimmerTheme]. This API is exposed to allow
|
|
136
|
+
* retrieving values from inside CompositionLocalConsumerModifierNode implementations - in
|
|
137
|
+
* most cases you should use [colors] and other properties directly.
|
|
138
|
+
*/
|
|
139
|
+
public val LocalGlimmerTheme: CompositionLocal<GlimmerTheme>
|
|
140
|
+
get() = _localGlimmerTheme
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Cached Shapes instance to be used across [GlimmerTheme] instances - currently shapes are
|
|
144
|
+
* not user-configurable.
|
|
145
|
+
*/
|
|
146
|
+
private val _shapes = Shapes()
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Cached [DepthEffectLevels] instance to be used across [GlimmerTheme] instances -
|
|
150
|
+
* currently depth effect levels are not user-configurable.
|
|
151
|
+
*/
|
|
152
|
+
private val _depthEffectLevels = DepthEffectLevels()
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Cached IconSizes instance to be used across [GlimmerTheme] instances - currently icon
|
|
156
|
+
* sizes are not user-configurable.
|
|
157
|
+
*/
|
|
158
|
+
internal val _iconSizes = IconSizes()
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
internal var defaultSurfaceBorderCached: BorderStroke? = null
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
private object NoIndication : IndicationNodeFactory {
|
|
165
|
+
override fun create(interactionSource: InteractionSource): DelegatableNode {
|
|
166
|
+
return object : Modifier.Node() {}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
override fun equals(other: Any?): Boolean = other === this
|
|
170
|
+
|
|
171
|
+
override fun hashCode(): Int = -5
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/** Use [GlimmerTheme.LocalGlimmerTheme] to access this publicly. */
|
|
175
|
+
@Suppress("CompositionLocalNaming")
|
|
176
|
+
private val _localGlimmerTheme: ProvidableCompositionLocal<GlimmerTheme> =
|
|
177
|
+
staticCompositionLocalOf {
|
|
178
|
+
GlimmerTheme()
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
<br />
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
When creating a Glimmer Icon component, refer to the following source code in
|
|
2
|
+
`Icon.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.layout.Box
|
|
25
|
+
import androidx.compose.foundation.layout.size
|
|
26
|
+
import androidx.compose.runtime.Composable
|
|
27
|
+
import androidx.compose.runtime.ProvidableCompositionLocal
|
|
28
|
+
import androidx.compose.runtime.compositionLocalOf
|
|
29
|
+
import androidx.compose.runtime.remember
|
|
30
|
+
import androidx.compose.runtime.structuralEqualityPolicy
|
|
31
|
+
import androidx.compose.ui.Modifier
|
|
32
|
+
import androidx.compose.ui.draw.CacheDrawModifierNode
|
|
33
|
+
import androidx.compose.ui.draw.paint
|
|
34
|
+
import androidx.compose.ui.graphics.Color
|
|
35
|
+
import androidx.compose.ui.graphics.ColorFilter
|
|
36
|
+
import androidx.compose.ui.graphics.ColorProducer
|
|
37
|
+
import androidx.compose.ui.graphics.ImageBitmap
|
|
38
|
+
import androidx.compose.ui.graphics.isSpecified
|
|
39
|
+
import androidx.compose.ui.graphics.layer.drawLayer
|
|
40
|
+
import androidx.compose.ui.graphics.painter.BitmapPainter
|
|
41
|
+
import androidx.compose.ui.graphics.painter.Painter
|
|
42
|
+
import androidx.compose.ui.graphics.toolingGraphicsLayer
|
|
43
|
+
import androidx.compose.ui.graphics.vector.ImageVector
|
|
44
|
+
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
|
45
|
+
import androidx.compose.ui.layout.ContentScale
|
|
46
|
+
import androidx.compose.ui.node.DelegatingNode
|
|
47
|
+
import androidx.compose.ui.node.ModifierNodeElement
|
|
48
|
+
import androidx.compose.ui.node.invalidateDraw
|
|
49
|
+
import androidx.compose.ui.semantics.Role
|
|
50
|
+
import androidx.compose.ui.semantics.contentDescription
|
|
51
|
+
import androidx.compose.ui.semantics.role
|
|
52
|
+
import androidx.compose.ui.semantics.semantics
|
|
53
|
+
import androidx.compose.ui.unit.Dp
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* An icon component that draws [imageVector], with a default size of [LocalIconSize], and applies a
|
|
57
|
+
* content color tint. Icon is an opinionated component designed to be used with single-color icons
|
|
58
|
+
* so that they can be tinted correctly for the component they are placed in. The recommended icon
|
|
59
|
+
* sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
|
|
60
|
+
* using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
|
|
61
|
+
* inside the component. The content color used to tint this icon is provided by [surface]. To set a
|
|
62
|
+
* custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
|
|
63
|
+
* that should not be tinted, use the overload and set [Color.Unspecified] as the tint color. For
|
|
64
|
+
* generic images that should not be tinted, and should not use the provided icon size, use the
|
|
65
|
+
* generic [androidx.compose.foundation.Image] instead.
|
|
66
|
+
*
|
|
67
|
+
* @param imageVector [ImageVector] to draw inside this icon
|
|
68
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
69
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
70
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
71
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
72
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
73
|
+
* @see LocalIconSize
|
|
74
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
75
|
+
*/
|
|
76
|
+
@Composable
|
|
77
|
+
public fun Icon(
|
|
78
|
+
imageVector: ImageVector,
|
|
79
|
+
contentDescription: String?,
|
|
80
|
+
modifier: Modifier = Modifier,
|
|
81
|
+
) {
|
|
82
|
+
Icon(
|
|
83
|
+
painter = rememberVectorPainter(imageVector),
|
|
84
|
+
contentDescription = contentDescription,
|
|
85
|
+
modifier = modifier,
|
|
86
|
+
)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* An icon component that draws [imageVector], with a default size of [LocalIconSize], and applies a
|
|
91
|
+
* tint of [tint]. Icon is an opinionated component designed to be used with single-color icons so
|
|
92
|
+
* that they can be tinted correctly for the component they are placed in. The recommended icon
|
|
93
|
+
* sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
|
|
94
|
+
* using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
|
|
95
|
+
* inside the component. Use the other overload of Icon without a [tint] parameter to apply the
|
|
96
|
+
* recommended content color provided by a [surface]. For multicolored icons and icons that should
|
|
97
|
+
* not be tinted, set [tint] to [Color.Unspecified]. For generic images that should not be tinted,
|
|
98
|
+
* and should not use the provided icon size, use the generic [androidx.compose.foundation.Image]
|
|
99
|
+
* instead.
|
|
100
|
+
*
|
|
101
|
+
* @param imageVector [ImageVector] to draw inside this icon
|
|
102
|
+
* @param tint tint to be applied to [imageVector]. If [Color.Unspecified] is provided, then no tint
|
|
103
|
+
* is applied.
|
|
104
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
105
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
106
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
107
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
108
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
109
|
+
* @see LocalIconSize
|
|
110
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
111
|
+
*/
|
|
112
|
+
@Composable
|
|
113
|
+
public fun Icon(
|
|
114
|
+
imageVector: ImageVector,
|
|
115
|
+
tint: Color,
|
|
116
|
+
contentDescription: String?,
|
|
117
|
+
modifier: Modifier = Modifier,
|
|
118
|
+
) {
|
|
119
|
+
Icon(
|
|
120
|
+
painter = rememberVectorPainter(imageVector),
|
|
121
|
+
tint =
|
|
122
|
+
if (tint.isSpecified) {
|
|
123
|
+
{ tint }
|
|
124
|
+
} else null,
|
|
125
|
+
contentDescription = contentDescription,
|
|
126
|
+
modifier = modifier,
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* An icon component that draws [bitmap], with a default size of [LocalIconSize], and applies a
|
|
132
|
+
* content color tint. Icon is an opinionated component designed to be used with single-color icons
|
|
133
|
+
* so that they can be tinted correctly for the component they are placed in. The recommended icon
|
|
134
|
+
* sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
|
|
135
|
+
* using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
|
|
136
|
+
* inside the component. The content color used to tint this icon is provided by [surface]. To set a
|
|
137
|
+
* custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
|
|
138
|
+
* that should not be tinted, use the overload and set [Color.Unspecified] as the tint color. For
|
|
139
|
+
* generic images that should not be tinted, and should not use the provided icon size, use the
|
|
140
|
+
* generic [androidx.compose.foundation.Image] instead.
|
|
141
|
+
*
|
|
142
|
+
* @param bitmap [ImageBitmap] to draw inside this icon
|
|
143
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
144
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
145
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
146
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
147
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
148
|
+
* @see LocalIconSize
|
|
149
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
150
|
+
*/
|
|
151
|
+
@Composable
|
|
152
|
+
public fun Icon(bitmap: ImageBitmap, contentDescription: String?, modifier: Modifier = Modifier) {
|
|
153
|
+
val painter = remember(bitmap) { BitmapPainter(bitmap) }
|
|
154
|
+
Icon(painter = painter, contentDescription = contentDescription, modifier = modifier)
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* An icon component that draws [bitmap], with a default size of [LocalIconSize], and applies a tint
|
|
159
|
+
* of [tint]. Icon is an opinionated component designed to be used with single-color icons so that
|
|
160
|
+
* they can be tinted correctly for the component they are placed in. The recommended icon sizes can
|
|
161
|
+
* be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly using [size],
|
|
162
|
+
* and components can use [LocalIconSize] to set the preferred size for any Icons inside the
|
|
163
|
+
* component. Use the other overload of Icon without a [tint] parameter to apply the recommended
|
|
164
|
+
* content color provided by a [surface]. For multicolored icons and icons that should not be
|
|
165
|
+
* tinted, set [tint] to [Color.Unspecified]. For generic images that should not be tinted, and
|
|
166
|
+
* should not use the provided icon size, use the generic [androidx.compose.foundation.Image]
|
|
167
|
+
* instead.
|
|
168
|
+
*
|
|
169
|
+
* @param bitmap [ImageBitmap] to draw inside this icon
|
|
170
|
+
* @param tint tint to be applied to [bitmap]. If [Color.Unspecified] is provided, then no tint is
|
|
171
|
+
* applied.
|
|
172
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
173
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
174
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
175
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
176
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
177
|
+
* @see LocalIconSize
|
|
178
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
179
|
+
*/
|
|
180
|
+
@Composable
|
|
181
|
+
public fun Icon(
|
|
182
|
+
bitmap: ImageBitmap,
|
|
183
|
+
tint: Color,
|
|
184
|
+
contentDescription: String?,
|
|
185
|
+
modifier: Modifier = Modifier,
|
|
186
|
+
) {
|
|
187
|
+
val painter = remember(bitmap) { BitmapPainter(bitmap) }
|
|
188
|
+
Icon(
|
|
189
|
+
painter = painter,
|
|
190
|
+
tint =
|
|
191
|
+
if (tint.isSpecified) {
|
|
192
|
+
{ tint }
|
|
193
|
+
} else null,
|
|
194
|
+
contentDescription = contentDescription,
|
|
195
|
+
modifier = modifier,
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* An icon component that draws [painter], with a default size of [LocalIconSize], and applies a
|
|
201
|
+
* content color tint. Icon is an opinionated component designed to be used with single-color icons
|
|
202
|
+
* so that they can be tinted correctly for the component they are placed in. The recommended icon
|
|
203
|
+
* sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
|
|
204
|
+
* using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
|
|
205
|
+
* inside the component. The content color used to tint this icon is provided by [surface]. To set a
|
|
206
|
+
* custom tint color, use the Icon overload with a tint parameter. For multicolored icons and icons
|
|
207
|
+
* that should not be tinted, use the overload and set `null` for the tint parameter. For generic
|
|
208
|
+
* images that should not be tinted, and should not use the provided icon size, use the generic
|
|
209
|
+
* [androidx.compose.foundation.Image] instead.
|
|
210
|
+
*
|
|
211
|
+
* @param painter [Painter] to draw inside this icon
|
|
212
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
213
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
214
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
215
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
216
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
217
|
+
* @see LocalIconSize
|
|
218
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
219
|
+
*/
|
|
220
|
+
@Composable
|
|
221
|
+
public fun Icon(painter: Painter, contentDescription: String?, modifier: Modifier = Modifier) {
|
|
222
|
+
Icon(
|
|
223
|
+
painter = painter,
|
|
224
|
+
useContentColor = true,
|
|
225
|
+
tint = null,
|
|
226
|
+
contentDescription = contentDescription,
|
|
227
|
+
modifier = modifier,
|
|
228
|
+
)
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* An icon component that draws [painter], with a default size of [LocalIconSize], and applies a
|
|
233
|
+
* tint of [tint]. Icon is an opinionated component designed to be used with single-color icons so
|
|
234
|
+
* that they can be tinted correctly for the component they are placed in. The recommended icon
|
|
235
|
+
* sizes can be retrieved using [GlimmerTheme.Companion.iconSizes]. A size can be set explicitly
|
|
236
|
+
* using [size], and components can use [LocalIconSize] to set the preferred size for any Icons
|
|
237
|
+
* inside the component. Use the other overload of Icon without a [tint] parameter to apply the
|
|
238
|
+
* recommended content color provided by a [surface]. For multicolored icons and icons that should
|
|
239
|
+
* not be tinted, set [tint] to `null`. For generic images that should not be tinted, and should not
|
|
240
|
+
* use the provided icon size, use the generic [androidx.compose.foundation.Image] instead.
|
|
241
|
+
*
|
|
242
|
+
* @param painter [Painter] to draw inside this icon
|
|
243
|
+
* @param tint tint to be applied to [painter]. If null, then no tint is applied.
|
|
244
|
+
* @param contentDescription text used by accessibility services to describe what this icon
|
|
245
|
+
* represents. This should always be provided unless this icon is used for decorative purposes,
|
|
246
|
+
* and does not represent a meaningful action that a user can take. This text should be localized,
|
|
247
|
+
* such as by using [androidx.compose.ui.res.stringResource] or similar
|
|
248
|
+
* @param modifier the [Modifier] to be applied to this icon
|
|
249
|
+
* @see LocalIconSize
|
|
250
|
+
* @see GlimmerTheme.Companion.iconSizes
|
|
251
|
+
*/
|
|
252
|
+
@Composable
|
|
253
|
+
public fun Icon(
|
|
254
|
+
painter: Painter,
|
|
255
|
+
tint: ColorProducer?,
|
|
256
|
+
contentDescription: String?,
|
|
257
|
+
modifier: Modifier = Modifier,
|
|
258
|
+
) {
|
|
259
|
+
Icon(
|
|
260
|
+
painter = painter,
|
|
261
|
+
useContentColor = false,
|
|
262
|
+
tint = tint,
|
|
263
|
+
contentDescription = contentDescription,
|
|
264
|
+
modifier = modifier,
|
|
265
|
+
)
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* CompositionLocal containing the preferred size of an icon. This value will be used by [Icon] by
|
|
270
|
+
* default - it can be overridden with a [size] modifier.
|
|
271
|
+
*/
|
|
272
|
+
public val LocalIconSize: ProvidableCompositionLocal<Dp> =
|
|
273
|
+
compositionLocalOf(structuralEqualityPolicy()) { GlimmerTheme._iconSizes.medium }
|
|
274
|
+
|
|
275
|
+
@Composable
|
|
276
|
+
private fun Icon(
|
|
277
|
+
painter: Painter,
|
|
278
|
+
useContentColor: Boolean,
|
|
279
|
+
tint: ColorProducer?,
|
|
280
|
+
contentDescription: String?,
|
|
281
|
+
modifier: Modifier,
|
|
282
|
+
) {
|
|
283
|
+
val colorFilter =
|
|
284
|
+
if (useContentColor || tint != null) {
|
|
285
|
+
IconColorFilterElement(
|
|
286
|
+
useContentColor = useContentColor,
|
|
287
|
+
tint = tint,
|
|
288
|
+
painter = painter,
|
|
289
|
+
)
|
|
290
|
+
} else {
|
|
291
|
+
Modifier
|
|
292
|
+
}
|
|
293
|
+
val semantics =
|
|
294
|
+
if (contentDescription != null) {
|
|
295
|
+
Modifier.semantics {
|
|
296
|
+
this.contentDescription = contentDescription
|
|
297
|
+
this.role = Role.Image
|
|
298
|
+
}
|
|
299
|
+
} else {
|
|
300
|
+
Modifier
|
|
301
|
+
}
|
|
302
|
+
Box(
|
|
303
|
+
modifier
|
|
304
|
+
.toolingGraphicsLayer()
|
|
305
|
+
.size(LocalIconSize.current)
|
|
306
|
+
.then(colorFilter)
|
|
307
|
+
.paint(painter, contentScale = ContentScale.Fit)
|
|
308
|
+
.then(semantics)
|
|
309
|
+
)
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
@Suppress("ModifierNodeInspectableProperties")
|
|
313
|
+
private class IconColorFilterElement(
|
|
314
|
+
private val useContentColor: Boolean,
|
|
315
|
+
private val tint: ColorProducer?,
|
|
316
|
+
private val painter: Painter,
|
|
317
|
+
) : ModifierNodeElement<IconColorFilterNode>() {
|
|
318
|
+
override fun create() = IconColorFilterNode(useContentColor, tint, painter)
|
|
319
|
+
|
|
320
|
+
override fun update(node: IconColorFilterNode) {
|
|
321
|
+
node.update(useContentColor, tint, painter)
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
override fun equals(other: Any?): Boolean {
|
|
325
|
+
if (this === other) return true
|
|
326
|
+
if (other !is IconColorFilterElement) return false
|
|
327
|
+
|
|
328
|
+
if (useContentColor != other.useContentColor) return false
|
|
329
|
+
if (tint != other.tint) return false
|
|
330
|
+
if (painter != other.painter) return false
|
|
331
|
+
|
|
332
|
+
return true
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
override fun hashCode(): Int {
|
|
336
|
+
var result = useContentColor.hashCode()
|
|
337
|
+
result = 31 * result + (tint?.hashCode() ?: 0)
|
|
338
|
+
result = 31 * result + painter.hashCode()
|
|
339
|
+
return result
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
private class IconColorFilterNode(
|
|
344
|
+
private var useContentColor: Boolean,
|
|
345
|
+
private var tint: ColorProducer?,
|
|
346
|
+
private var painter: Painter,
|
|
347
|
+
) : DelegatingNode() {
|
|
348
|
+
val cacheDrawNode =
|
|
349
|
+
delegate(
|
|
350
|
+
CacheDrawModifierNode {
|
|
351
|
+
val layer = obtainGraphicsLayer()
|
|
352
|
+
layer.apply { record { drawContent() } }
|
|
353
|
+
var cachedTintColor = Color.Unspecified
|
|
354
|
+
onDrawWithContent {
|
|
355
|
+
val tintColor =
|
|
356
|
+
if (useContentColor) {
|
|
357
|
+
currentContentColor()
|
|
358
|
+
} else {
|
|
359
|
+
tint?.invoke() ?: Color.Unspecified
|
|
360
|
+
}
|
|
361
|
+
if (cachedTintColor != tintColor) {
|
|
362
|
+
cachedTintColor = tintColor
|
|
363
|
+
val cachedColorFilter =
|
|
364
|
+
if (tintColor.isSpecified) ColorFilter.tint(tintColor) else null
|
|
365
|
+
layer.colorFilter = cachedColorFilter
|
|
366
|
+
}
|
|
367
|
+
drawLayer(graphicsLayer = layer)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
)
|
|
371
|
+
|
|
372
|
+
fun update(useContentColor: Boolean, tint: ColorProducer?, painter: Painter) {
|
|
373
|
+
val painterChanged = this.painter != painter
|
|
374
|
+
if (this.useContentColor != useContentColor || this.tint != tint || painterChanged) {
|
|
375
|
+
this.useContentColor = useContentColor
|
|
376
|
+
this.tint = tint
|
|
377
|
+
this.painter = painter
|
|
378
|
+
if (painterChanged) {
|
|
379
|
+
cacheDrawNode.invalidateDrawCache()
|
|
380
|
+
} else {
|
|
381
|
+
cacheDrawNode.invalidateDraw()
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
<br />
|
package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
When creating a Glimmer Icon component, refer to the following source code in
|
|
2
|
+
`IconButton.kt` for icon buttons:
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
```kotlin
|
|
6
|
+
/*
|
|
7
|
+
* Copyright 2026 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.Box
|
|
27
|
+
import androidx.compose.foundation.layout.PaddingValues
|
|
28
|
+
import androidx.compose.foundation.layout.defaultMinSize
|
|
29
|
+
import androidx.compose.foundation.layout.padding
|
|
30
|
+
import androidx.compose.runtime.Composable
|
|
31
|
+
import androidx.compose.runtime.CompositionLocalProvider
|
|
32
|
+
import androidx.compose.runtime.remember
|
|
33
|
+
import androidx.compose.ui.Alignment
|
|
34
|
+
import androidx.compose.ui.Modifier
|
|
35
|
+
import androidx.compose.ui.graphics.Color
|
|
36
|
+
import androidx.compose.ui.graphics.Shape
|
|
37
|
+
import androidx.compose.ui.semantics.Role
|
|
38
|
+
import androidx.compose.ui.semantics.role
|
|
39
|
+
import androidx.compose.ui.semantics.semantics
|
|
40
|
+
import androidx.compose.ui.unit.Dp
|
|
41
|
+
import androidx.compose.ui.unit.dp
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* IconButton is a component used for exposing supplementary actions with a single tap.
|
|
45
|
+
*
|
|
46
|
+
* Icon buttons are used when a compact button is required, such as in a toolbar or image list.
|
|
47
|
+
*
|
|
48
|
+
* [content] should typically be an [Icon]. If using a custom icon, note that the typical size for
|
|
49
|
+
* the internal icon is 32 x 32 dp. Container has an overall minimum size of 48 x 48 dp.
|
|
50
|
+
*
|
|
51
|
+
* @param onClick called when this icon button is clicked
|
|
52
|
+
* @param modifier the [Modifier] to be applied to this icon button
|
|
53
|
+
* @param enabled controls the enabled state of this icon button. When `false`, this icon button
|
|
54
|
+
* will not respond to user input
|
|
55
|
+
* @param shape the [Shape] used to clip this icon button
|
|
56
|
+
* @param color background color of this icon button
|
|
57
|
+
* @param contentColor content color used by components inside [content]
|
|
58
|
+
* @param contentPadding the spacing values to apply internally between the container and the
|
|
59
|
+
* content
|
|
60
|
+
* @param interactionSource an optional hoisted [MutableInteractionSource] for observing and
|
|
61
|
+
* emitting Interactions for this icon button. You can use this to change the icon button's
|
|
62
|
+
* appearance or preview the icon button in different states. Note that if `null` is provided,
|
|
63
|
+
* interactions will still happen internally.
|
|
64
|
+
* @param content the content of this icon button, typically an [Icon]
|
|
65
|
+
* @sample androidx.xr.glimmer.samples.IconButtonSample
|
|
66
|
+
*/
|
|
67
|
+
@Composable
|
|
68
|
+
public fun IconButton(
|
|
69
|
+
onClick: () -> Unit,
|
|
70
|
+
modifier: Modifier = Modifier,
|
|
71
|
+
enabled: Boolean = true,
|
|
72
|
+
shape: Shape = GlimmerTheme.shapes.large,
|
|
73
|
+
color: Color = GlimmerTheme.colors.surface,
|
|
74
|
+
contentColor: Color = calculateContentColor(color),
|
|
75
|
+
contentPadding: PaddingValues = IconButtonDefaults.contentPadding,
|
|
76
|
+
interactionSource: MutableInteractionSource? = null,
|
|
77
|
+
content: @Composable () -> Unit,
|
|
78
|
+
) {
|
|
79
|
+
val internalInteractionSource = interactionSource ?: remember { MutableInteractionSource() }
|
|
80
|
+
|
|
81
|
+
Box(
|
|
82
|
+
modifier
|
|
83
|
+
.semantics { role = Role.Button }
|
|
84
|
+
.surface(
|
|
85
|
+
enabled = enabled,
|
|
86
|
+
shape = shape,
|
|
87
|
+
color = color,
|
|
88
|
+
contentColor = contentColor,
|
|
89
|
+
depthEffect = null,
|
|
90
|
+
interactionSource = internalInteractionSource,
|
|
91
|
+
)
|
|
92
|
+
.clickable(
|
|
93
|
+
enabled = enabled,
|
|
94
|
+
interactionSource = internalInteractionSource,
|
|
95
|
+
onClick = onClick,
|
|
96
|
+
)
|
|
97
|
+
.defaultMinSize(IconButtonDefaults.minimumSize)
|
|
98
|
+
.padding(contentPadding),
|
|
99
|
+
contentAlignment = Alignment.Center,
|
|
100
|
+
) {
|
|
101
|
+
CompositionLocalProvider(
|
|
102
|
+
LocalIconSize provides IconButtonDefaults.iconSize,
|
|
103
|
+
content = content,
|
|
104
|
+
)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/** Default values used for [IconButton]. */
|
|
109
|
+
public object IconButtonDefaults {
|
|
110
|
+
/** Default content padding for an [IconButton]. */
|
|
111
|
+
@get:Composable
|
|
112
|
+
public val contentPadding: PaddingValues
|
|
113
|
+
get() = PaddingValues(GlimmerTheme.componentSpacingValues.small)
|
|
114
|
+
|
|
115
|
+
/** Minimum size for icon-only buttons: [IconButton], [IconToggleButton]. */
|
|
116
|
+
internal val minimumSize: Dp
|
|
117
|
+
get() = 48.dp
|
|
118
|
+
|
|
119
|
+
/** Default icon size for icon-only buttons: [IconButton], [IconToggleButton]. */
|
|
120
|
+
@get:Composable
|
|
121
|
+
internal val iconSize: Dp
|
|
122
|
+
get() = GlimmerTheme.iconSizes.small
|
|
123
|
+
}
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
<br />
|