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,390 @@
|
|
|
1
|
+
The [`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer) is a Jetpack Media3 [Player](https://developer.android.com/reference/kotlin/androidx/media3/common/Player) implementation that supports
|
|
2
|
+
both local playback and casting to a remote Cast-enabled device. [`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer)
|
|
3
|
+
simplifies adding cast functionality to your app and provides rich features to
|
|
4
|
+
seamlessly switch between local and remote playback. This guide shows you how to
|
|
5
|
+
integrate [`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer) into your media app.
|
|
6
|
+
|
|
7
|
+
To integrate Cast with other platforms, see the [Cast SDK](https://developers.google.com/cast/docs/developers).
|
|
8
|
+
|
|
9
|
+
## Get a Cast-enabled device
|
|
10
|
+
|
|
11
|
+
To test `CastPlayer`, you need a [Cast-enabled device](https://store.google.com/gb/category/connected_home?hl=en-GB). Choices include Android
|
|
12
|
+
TV, Chromecast, smart speakers, and smart displays. Verify that your device is
|
|
13
|
+
set up and connected to the same Wi-Fi network as your development mobile for
|
|
14
|
+
discovery.
|
|
15
|
+
|
|
16
|
+
## Add build dependencies
|
|
17
|
+
|
|
18
|
+
To start using `CastPlayer`, add the AndroidX Media3 and `CastPlayer`
|
|
19
|
+
dependencies to the `build.gradle` file of your app module.
|
|
20
|
+
|
|
21
|
+
### Kotlin
|
|
22
|
+
|
|
23
|
+
implementation("androidx.media3:media3-exoplayer:1.11.0")
|
|
24
|
+
implementation("androidx.media3:media3-ui:1.11.0")
|
|
25
|
+
implementation("androidx.media3:media3-session:1.11.0")
|
|
26
|
+
implementation("androidx.media3:media3-cast:1.11.0")
|
|
27
|
+
|
|
28
|
+
### Groovy
|
|
29
|
+
|
|
30
|
+
implementation "androidx.media3:media3-exoplayer:1.11.0"
|
|
31
|
+
implementation "androidx.media3:media3-ui:1.11.0"
|
|
32
|
+
implementation "androidx.media3:media3-session:1.11.0"
|
|
33
|
+
implementation "androidx.media3:media3-cast:1.11.0"
|
|
34
|
+
|
|
35
|
+
## Configure your CastPlayer
|
|
36
|
+
|
|
37
|
+
To configure the [`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer), update your `AndroidManifest.xml` file with an
|
|
38
|
+
options provider.
|
|
39
|
+
|
|
40
|
+
### Options provider
|
|
41
|
+
|
|
42
|
+
The [`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer) requires an options provider to configure its behavior. For a
|
|
43
|
+
basic setup, you can use the [`DefaultCastOptionsProvider`](https://developer.android.com/reference/androidx/media3/cast/DefaultCastOptionsProvider) by adding it to your
|
|
44
|
+
`AndroidManifest.xml` file. This uses default settings, including the default
|
|
45
|
+
receiver application.
|
|
46
|
+
|
|
47
|
+
<application>
|
|
48
|
+
...
|
|
49
|
+
<meta-data
|
|
50
|
+
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
|
|
51
|
+
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
|
|
52
|
+
...
|
|
53
|
+
</application>
|
|
54
|
+
|
|
55
|
+
To customize the configuration, implement your own custom `OptionsProvider`. See
|
|
56
|
+
the [CastOptions](https://developer.android.com/media/media3/cast/customize-castoptions) guide to learn how.
|
|
57
|
+
|
|
58
|
+
### Add a receiver for media transfers
|
|
59
|
+
|
|
60
|
+
Adding a `MediaTransferReceiver` to your manifest enables the System UI to
|
|
61
|
+
discover Cast-enabled devices on the network and reroute media without opening
|
|
62
|
+
the app activity. For example, a user can change the device playing your app's
|
|
63
|
+
media from the [media notification](https://developer.android.com/media/implement/surfaces/mobile).
|
|
64
|
+
|
|
65
|
+
<application>
|
|
66
|
+
...
|
|
67
|
+
<receiver android:name="androidx.mediarouter.media.MediaTransferReceiver" />
|
|
68
|
+
...
|
|
69
|
+
</application>
|
|
70
|
+
|
|
71
|
+
## Build a CastPlayer
|
|
72
|
+
|
|
73
|
+
For remote playback with Cast, your app should be able to manage playback even
|
|
74
|
+
when the user isn't interacting with an Activity from your app, such as through
|
|
75
|
+
the system media notification. For this reason, you should create your
|
|
76
|
+
`ExoPlayer` (for local playback) and `CastPlayer` (for remote playback)
|
|
77
|
+
instances in a service, such as [MediaSessionService](https://developer.android.com/media/media3/session/background-playback#service-lifecycle) or [MediaLibraryService](https://developer.android.com/guide/topics/media/session/medialibraryservice).
|
|
78
|
+
First, create your `ExoPlayer` instance and then when building your
|
|
79
|
+
[`CastPlayer`](https://developer.android.com/reference/androidx/media3/cast/CastPlayer) instance, set `ExoPlayer` as the local player instance. You can
|
|
80
|
+
then switch media playback between your mobile and the Cast-enabled device from
|
|
81
|
+
the media notification or the lock screen notification. Media3 uses the **Output
|
|
82
|
+
Switcher** feature to handle player transfers when the output route changes from
|
|
83
|
+
local to remote or from remote to local.
|
|
84
|
+
 Figure 1: (a) Device chip on Media notification (b) Cast-enabled devices shown on tapping the device chip (c) Device chip on Lock screen notification
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
### Kotlin
|
|
88
|
+
|
|
89
|
+
```kotlin
|
|
90
|
+
override fun onCreate() {
|
|
91
|
+
super.onCreate()
|
|
92
|
+
|
|
93
|
+
val exoPlayer = ExoPlayer.Builder(context).build()
|
|
94
|
+
val castPlayer = CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build()
|
|
95
|
+
|
|
96
|
+
mediaSession = MediaSession.Builder(context, castPlayer).build()
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Java
|
|
101
|
+
|
|
102
|
+
```java
|
|
103
|
+
@Override
|
|
104
|
+
public void onCreate() {
|
|
105
|
+
super.onCreate();
|
|
106
|
+
|
|
107
|
+
ExoPlayer exoPlayer = new ExoPlayer.Builder(context).build();
|
|
108
|
+
CastPlayer castPlayer = new CastPlayer.Builder(context).setLocalPlayer(exoPlayer).build();
|
|
109
|
+
|
|
110
|
+
mediaSession =
|
|
111
|
+
new MediaSession.Builder(/* context= */ context, /* player= */ castPlayer).build();
|
|
112
|
+
}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
<br />
|
|
116
|
+
|
|
117
|
+
> [!IMPORTANT]
|
|
118
|
+
> **Important:** The preceding code snippet shows the `onCreate` method of a `MediaSessionService`. In an `Activity`, players should be created in `onStart` or `onResume`.
|
|
119
|
+
|
|
120
|
+
## Add UI elements
|
|
121
|
+
|
|
122
|
+
Add a [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) to your app's UI. Tapping the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton)
|
|
123
|
+
opens a dialog displaying a list of available Cast-enabled devices on the
|
|
124
|
+
network. When the user selects a device, the media playback is transferred from
|
|
125
|
+
the mobile to the selected receiver device. This section shows you how to add
|
|
126
|
+
the button and listen for events to update your UI when playback switches
|
|
127
|
+
between local and remote devices.
|
|
128
|
+
|
|
129
|
+
### Set the MediaRouteButton
|
|
130
|
+
|
|
131
|
+
There are four ways to add the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) to your activity's UI. The
|
|
132
|
+
best choice depends on your app's design and requirements.
|
|
133
|
+
|
|
134
|
+
- **Compose UI**: Add a button composable.
|
|
135
|
+
- **Views UI** :
|
|
136
|
+
- Add the button to the app bar menu.
|
|
137
|
+
- Add the button inside `PlayerView`.
|
|
138
|
+
- Add the button as a standard `View`.
|
|
139
|
+
|
|
140
|
+
 Figure 2: (a) MediaRouteButton in menu bar, (b) as a View, (c) in PlayerView, and (d) Dialog of Cast-enabled devices.
|
|
141
|
+
|
|
142
|
+
> [!IMPORTANT]
|
|
143
|
+
> **Important:** To use the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) in Views UI, the containing activity must be a subclass of `FragmentActivity`.
|
|
144
|
+
|
|
145
|
+
> [!TIP]
|
|
146
|
+
> **Tip:** These screenshots are from the [demo-session](https://github.com/androidx/media/tree/release/demos/session) apps in Media3. You can checkout the app to see an example of `CastPlayer` implementation.
|
|
147
|
+
|
|
148
|
+
#### Add a Composable `MediaRouteButton` to the Player
|
|
149
|
+
|
|
150
|
+
You can add the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) Composable to your player's UI. For more
|
|
151
|
+
information, see the [Compose](https://developer.android.com/media/media3/ui/compose) guide.
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
```kotlin
|
|
155
|
+
@Composable
|
|
156
|
+
fun PlayerComposeView(player: Player, modifier: Modifier = Modifier) {
|
|
157
|
+
var controlsVisible by remember { mutableStateOf(false) }
|
|
158
|
+
|
|
159
|
+
Box(
|
|
160
|
+
modifier = modifier.clickable { controlsVisible = true },
|
|
161
|
+
contentAlignment = Alignment.Center,
|
|
162
|
+
) {
|
|
163
|
+
PlayerSurface(player = player, modifier = modifier)
|
|
164
|
+
AnimatedVisibility(visible = controlsVisible, enter = fadeIn(), exit = fadeOut()) {
|
|
165
|
+
Box(modifier = Modifier.fillMaxSize()) {
|
|
166
|
+
MediaRouteButton(modifier = Modifier.align(Alignment.TopEnd))
|
|
167
|
+
PrimaryControls(player = player, modifier = Modifier.align(Alignment.Center))
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@Composable
|
|
174
|
+
fun PrimaryControls(player: Player, modifier: Modifier = Modifier) {
|
|
175
|
+
// ...
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
<br />
|
|
180
|
+
|
|
181
|
+
#### Add the `MediaRouteButton` to the PlayerView
|
|
182
|
+
|
|
183
|
+
You can add the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) directly within the [PlayerView](https://developer.android.com/guide/topics/media/ui/playerview)'s UI
|
|
184
|
+
controls. After setting the [MediaController](https://developer.android.com/guide/topics/media/session/mediacontroller) as the player for your
|
|
185
|
+
`PlayerView`, provide a `MediaRouteButtonViewProvider` to display the Cast
|
|
186
|
+
button on the Player.
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
### Kotlin
|
|
190
|
+
|
|
191
|
+
```kotlin
|
|
192
|
+
override fun onStart() {
|
|
193
|
+
super.onStart()
|
|
194
|
+
|
|
195
|
+
playerView.player = mediaController
|
|
196
|
+
playerView.setMediaRouteButtonViewProvider(MediaRouteButtonViewProvider())
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Java
|
|
201
|
+
|
|
202
|
+
```java
|
|
203
|
+
@Override
|
|
204
|
+
public void onStart() {
|
|
205
|
+
super.onStart();
|
|
206
|
+
|
|
207
|
+
playerView.setPlayer(mediaController);
|
|
208
|
+
playerView.setMediaRouteButtonViewProvider(new MediaRouteButtonViewProvider());
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
<br />
|
|
213
|
+
|
|
214
|
+
#### Add the `MediaRouteButton` to the app bar menu
|
|
215
|
+
|
|
216
|
+
To set up a [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) in the app bar menu, create an XML menu and
|
|
217
|
+
override `onCreateOptionsMenu` in your `Activity`.
|
|
218
|
+
|
|
219
|
+
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
|
220
|
+
xmlns:app="http://schemas.android.com/apk/res-auto">
|
|
221
|
+
<item android:id="@+id/media_route_menu_item"
|
|
222
|
+
android:title="@string/media_route_menu_title"
|
|
223
|
+
app:showAsAction="always"
|
|
224
|
+
app:actionProviderClass="androidx.mediarouter.app.MediaRouteActionProvider"/>
|
|
225
|
+
</menu>
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
### Kotlin
|
|
229
|
+
|
|
230
|
+
```kotlin
|
|
231
|
+
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
|
232
|
+
// ...
|
|
233
|
+
menuInflater.inflate(R.menu.sample_media_route_button_menu, menu)
|
|
234
|
+
val menuItemFuture: ListenableFuture<MenuItem> =
|
|
235
|
+
MediaRouteButtonFactory.setUpMediaRouteButton(context, menu, R.id.media_route_menu_item)
|
|
236
|
+
Futures.addCallback(
|
|
237
|
+
menuItemFuture,
|
|
238
|
+
object : FutureCallback<MenuItem> {
|
|
239
|
+
override fun onSuccess(menuItem: MenuItem?) {
|
|
240
|
+
// Do something with the menu item.
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
override fun onFailure(t: Throwable) {
|
|
244
|
+
// Handle the failure.
|
|
245
|
+
}
|
|
246
|
+
},
|
|
247
|
+
executor,
|
|
248
|
+
)
|
|
249
|
+
// ...
|
|
250
|
+
return true
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Java
|
|
255
|
+
|
|
256
|
+
```java
|
|
257
|
+
@Override
|
|
258
|
+
public boolean onCreateOptionsMenu(Menu menu) {
|
|
259
|
+
// ...
|
|
260
|
+
getMenuInflater().inflate(R.menu.sample_media_route_button_menu, menu);
|
|
261
|
+
ListenableFuture<MenuItem> menuItemFuture =
|
|
262
|
+
MediaRouteButtonFactory.setUpMediaRouteButton(context, menu, R.id.media_route_menu_item);
|
|
263
|
+
Futures.addCallback(
|
|
264
|
+
menuItemFuture,
|
|
265
|
+
new FutureCallback<MenuItem>() {
|
|
266
|
+
@Override
|
|
267
|
+
public void onSuccess(MenuItem menuItem) {
|
|
268
|
+
// Do something with the menu item.
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
@Override
|
|
272
|
+
public void onFailure(Throwable t) {
|
|
273
|
+
// Handle the failure.
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
executor);
|
|
277
|
+
// ...
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
<br />
|
|
283
|
+
|
|
284
|
+
#### Add the `MediaRouteButton` as a View
|
|
285
|
+
|
|
286
|
+
You can set up a [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton) in your activity layout.xml.
|
|
287
|
+
|
|
288
|
+
<androidx.mediarouter.app.MediaRouteButton
|
|
289
|
+
android:id="@+id/media_route_button"
|
|
290
|
+
android:layout_width="wrap_content"
|
|
291
|
+
android:layout_height="wrap_content"
|
|
292
|
+
app:mediaRouteButtonTint="@android:color/white" />
|
|
293
|
+
|
|
294
|
+
To complete the setup for the [`MediaRouteButton`](https://developer.android.com/reference/androidx/mediarouter/app/MediaRouteButton), use the Media3 Cast
|
|
295
|
+
`MediaRouteButtonFactory` in your `Activity` code.
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
### Kotlin
|
|
299
|
+
|
|
300
|
+
```kotlin
|
|
301
|
+
override fun onCreate(savedInstanceState: Bundle?) {
|
|
302
|
+
super.onCreate(savedInstanceState)
|
|
303
|
+
|
|
304
|
+
findViewById<MediaRouteButton>(R.id.media_route_button)?.also {
|
|
305
|
+
val unused = MediaRouteButtonFactory.setUpMediaRouteButton(context, it)
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### Java
|
|
311
|
+
|
|
312
|
+
```java
|
|
313
|
+
@Override
|
|
314
|
+
public void onCreate(Bundle savedInstanceState) {
|
|
315
|
+
super.onCreate(savedInstanceState);
|
|
316
|
+
// ...
|
|
317
|
+
MediaRouteButton button = findViewById(R.id.media_route_button);
|
|
318
|
+
ListenableFuture<Void> setUpFuture =
|
|
319
|
+
MediaRouteButtonFactory.setUpMediaRouteButton(context, button);
|
|
320
|
+
}
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
<br />
|
|
324
|
+
|
|
325
|
+
### Activity Listener
|
|
326
|
+
|
|
327
|
+
Create a `Player.Listener` in your `Activity` to listen for changes to media
|
|
328
|
+
playback location. When the `playbackType` changes between `PLAYBACK_TYPE_LOCAL`
|
|
329
|
+
and `PLAYBACK_TYPE_REMOTE`, you can adjust your UI as needed. To prevent memory
|
|
330
|
+
leaks and to confine listener activity to only when your app is visible,
|
|
331
|
+
register the listener in `onStart` and unregister it in `onStop`:
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
### Kotlin
|
|
335
|
+
|
|
336
|
+
```kotlin
|
|
337
|
+
private val playerListener: Player.Listener =
|
|
338
|
+
object : Player.Listener {
|
|
339
|
+
override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
|
|
340
|
+
if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) {
|
|
341
|
+
// Add UI changes for local playback.
|
|
342
|
+
} else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) {
|
|
343
|
+
// Add UI changes for remote playback.
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
override fun onStart() {
|
|
349
|
+
super.onStart()
|
|
350
|
+
mediaController.addListener(playerListener)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
override fun onStop() {
|
|
354
|
+
super.onStop()
|
|
355
|
+
mediaController.removeListener(playerListener)
|
|
356
|
+
}
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
### Java
|
|
360
|
+
|
|
361
|
+
```java
|
|
362
|
+
private final Player.Listener playerListener =
|
|
363
|
+
new Player.Listener() {
|
|
364
|
+
@Override
|
|
365
|
+
public void onDeviceInfoChanged(DeviceInfo deviceInfo) {
|
|
366
|
+
if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_LOCAL) {
|
|
367
|
+
// Add UI changes for local playback.
|
|
368
|
+
} else if (deviceInfo.playbackType == DeviceInfo.PLAYBACK_TYPE_REMOTE) {
|
|
369
|
+
// Add UI changes for remote playback.
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
@Override
|
|
375
|
+
protected void onStart() {
|
|
376
|
+
super.onStart();
|
|
377
|
+
mediaController.addListener(playerListener);
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
@Override
|
|
381
|
+
protected void onStop() {
|
|
382
|
+
super.onStop();
|
|
383
|
+
mediaController.removeListener(playerListener);
|
|
384
|
+
}
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
<br />
|
|
388
|
+
|
|
389
|
+
For more information about listening and responding to playback events, see the
|
|
390
|
+
[player events](https://developer.android.com/media/media3/exoplayer/listening-to-player-events) guide.
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
To configure your app's Cast session, provide an [`OptionsProvider`](https://developers.google.com/android/reference/com/google/android/gms/cast/framework/OptionsProvider). Use the
|
|
2
|
+
[`CastOptions`](https://developers.google.com/android/reference/com/google/android/gms/cast/framework/CastOptions) object built by the provider to set the receiver application ID,
|
|
3
|
+
manage session lifecycles, and customize media playback behavior.
|
|
4
|
+
|
|
5
|
+
## Use the default options provider
|
|
6
|
+
|
|
7
|
+
For a basic setup that uses the default Cast receiver application, add the
|
|
8
|
+
`DefaultCastOptionsProvider` to your app's `AndroidManifest.xml` file:
|
|
9
|
+
|
|
10
|
+
<application>
|
|
11
|
+
...
|
|
12
|
+
<meta-data
|
|
13
|
+
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
|
|
14
|
+
android:value="androidx.media3.cast.DefaultCastOptionsProvider" />
|
|
15
|
+
...
|
|
16
|
+
</application>
|
|
17
|
+
|
|
18
|
+
## Create a custom options provider
|
|
19
|
+
|
|
20
|
+
For more advanced configurations, such as setting a custom receiver application
|
|
21
|
+
ID, you need to create your own `OptionsProvider`.
|
|
22
|
+
|
|
23
|
+
### 1. Declare the provider in your manifest
|
|
24
|
+
|
|
25
|
+
First, declare your custom provider in `AndroidManifest.xml`. Make sure to use
|
|
26
|
+
the fully qualified class name.
|
|
27
|
+
|
|
28
|
+
<application>
|
|
29
|
+
...
|
|
30
|
+
<meta-data
|
|
31
|
+
android:name="com.google.android.gms.cast.framework.OPTIONS_PROVIDER_CLASS_NAME"
|
|
32
|
+
android:value="path.to.your.class.MyCustomCastOptionsProvider" />
|
|
33
|
+
...
|
|
34
|
+
</application>
|
|
35
|
+
|
|
36
|
+
### 2. Implement the OptionsProvider interface
|
|
37
|
+
|
|
38
|
+
Next, create a class that implements the `OptionsProvider` interface. In this
|
|
39
|
+
class, you must override `getCastOptions()` to return a `CastOptions` instance.
|
|
40
|
+
The custom `OptionsProvider` class is where you configure your Cast session, for
|
|
41
|
+
example, by setting your custom receiver application ID.
|
|
42
|
+
|
|
43
|
+
For more information, see [CastOptions.Builder](https://developers.google.com/android/reference/com/google/android/gms/cast/framework/CastOptions.Builder).
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
### Kotlin
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
class MyCustomCastOptionsProvider : OptionsProvider {
|
|
50
|
+
|
|
51
|
+
override fun getCastOptions(context: Context): CastOptions {
|
|
52
|
+
return CastOptions.Builder()
|
|
53
|
+
.setReceiverApplicationId(APP_ID)
|
|
54
|
+
.setRemoteToLocalEnabled(true)
|
|
55
|
+
.build()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
override fun getAdditionalSessionProviders(context: Context): List<SessionProvider>? {
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
companion object {
|
|
63
|
+
// Add your receiver app ID in <APP_ID>.
|
|
64
|
+
private const val APP_ID = "<APP_ID>"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### Java
|
|
70
|
+
|
|
71
|
+
```java
|
|
72
|
+
public static final class MyCustomCastOptionsProvider implements OptionsProvider {
|
|
73
|
+
|
|
74
|
+
// Add your receiver app ID in <APP_ID>.
|
|
75
|
+
public static final String APP_ID = "<APP_ID>";
|
|
76
|
+
|
|
77
|
+
@Override
|
|
78
|
+
public CastOptions getCastOptions(Context context) {
|
|
79
|
+
return new CastOptions.Builder()
|
|
80
|
+
.setReceiverApplicationId(APP_ID)
|
|
81
|
+
.setRemoteToLocalEnabled(true)
|
|
82
|
+
.build();
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@Override
|
|
86
|
+
@Nullable
|
|
87
|
+
public List<SessionProvider> getAdditionalSessionProviders(Context context) {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
<br />
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
The Media3 [`cast`](https://developer.android.com/reference/androidx/media3/cast/package-summary) module extends your media playback experience to
|
|
2
|
+
Cast devices. It lets your app cast content to [compatible devices](https://developer.android.com/media/media3/cast/create-castplayer#get-device),
|
|
3
|
+
such as TVs and speakers. The [sender](https://developers.google.com/cast/glossary#sender) app acts as a remote controller for media
|
|
4
|
+
playback on the [receiver](https://developers.google.com/cast/glossary#receiver) device. This module integrates with the [Jetpack
|
|
5
|
+
Media3](https://developer.android.com/guide/topics/media/media3) library, so you can use the same `Player` interface and UI
|
|
6
|
+
components for both local and remote playback.
|
|
7
|
+
|
|
8
|
+
## Media3 CastPlayer
|
|
9
|
+
|
|
10
|
+
The `CastPlayer` is a media player API included in Media3 that supports both
|
|
11
|
+
local and remote media playback. It implements the `Player` interface to manage
|
|
12
|
+
playback, simplifying the integration of casting into your media experience.
|
|
13
|
+
|
|
14
|
+
[Go to Media3 CastPlayer](https://developer.android.com/media/media3/cast/create-castplayer)
|
|
15
|
+
|
|
16
|
+
## Other Cast integrations
|
|
17
|
+
|
|
18
|
+
The Cast SDK overview explains how to integrate Cast with other platforms, such
|
|
19
|
+
as building a receiver app or integrating with the web sender SDK.
|
|
20
|
+
|
|
21
|
+
[Explore Cast SDK](https://developers.google.com/cast/docs/developers)
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: android-migrate-xml-views-to-jetpack-compose
|
|
3
|
+
description: Provides a structured workflow for migrating an Android XML View to Jetpack
|
|
4
|
+
Compose. This skill details the step-by-step process, from planning and dependency
|
|
5
|
+
setup, to theming and layout migration, validation and XML cleanup. Use this skill
|
|
6
|
+
when you need to migrate an XML View to Jetpack Compose in an Android project. It
|
|
7
|
+
solves the problem of converting the UI of a legacy XML View into modern, declarative
|
|
8
|
+
Compose components while maintaining interoperability.
|
|
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-08-14'
|
|
16
|
+
keywords:
|
|
17
|
+
- Jetpack Compose
|
|
18
|
+
- migration
|
|
19
|
+
- XML
|
|
20
|
+
- Views
|
|
21
|
+
- interoperability
|
|
22
|
+
- incremental adoption
|
|
23
|
+
- UI development
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
This skill guides through the process of migrating an existing Android XML View
|
|
27
|
+
to Jetpack Compose. It performs a stable, safe and visually consistent
|
|
28
|
+
transition by following a structured, 10-step methodology. This skill migrates
|
|
29
|
+
UI (XML to Jetpack Compose) only.
|
|
30
|
+
|
|
31
|
+
## Objective
|
|
32
|
+
|
|
33
|
+
To systematically convert a single legacy XML layout into modern, declarative
|
|
34
|
+
Jetpack Compose UI while maintaining pixel-perfect visual parity and functional
|
|
35
|
+
integrity.
|
|
36
|
+
|
|
37
|
+
## Summary of the 10-step migration process
|
|
38
|
+
|
|
39
|
+
1. **Identify the optimal XML candidate for migration**
|
|
40
|
+
2. **Analyze the project and layout**
|
|
41
|
+
3. **Create a plan**
|
|
42
|
+
4. **Capture the XML View UI**
|
|
43
|
+
5. **Set up Compose dependencies and compiler**
|
|
44
|
+
6. **Set up Compose theming**
|
|
45
|
+
7. **Migrate the XML layout to Compose**
|
|
46
|
+
8. **Validate the migration**
|
|
47
|
+
9. **Replace usages**
|
|
48
|
+
10. **XML code removal**
|
|
49
|
+
|
|
50
|
+
## Detailed steps
|
|
51
|
+
|
|
52
|
+
### Step 1: Identify the optimal XML candidate for migration
|
|
53
|
+
|
|
54
|
+
If the user has explicitly specified a target XML layout, proceed to Step 2.
|
|
55
|
+
Otherwise, analyze the codebase to identify the best candidate for migration by
|
|
56
|
+
following the logic in [references/identify-optimal-xml-candidate.md](references/identify-optimal-xml-candidate.md).
|
|
57
|
+
|
|
58
|
+
### Step 2: Analyze the project and layout
|
|
59
|
+
|
|
60
|
+
Analyze the identified XML View's structure, hierarchy, and implementation
|
|
61
|
+
details.
|
|
62
|
+
Use [references/analysis-of-the-project-and-layout.md](references/analysis-of-the-project-and-layout.md) to
|
|
63
|
+
guide your technical audit of the layout and surrounding project context.
|
|
64
|
+
|
|
65
|
+
### Step 3: Create a plan
|
|
66
|
+
|
|
67
|
+
Using the outputs and analysis done in the Step 1 and 2, generate a
|
|
68
|
+
step-by-step plan for the migration. If you support user interaction, present
|
|
69
|
+
to the user and ask for approval before proceeding. If user interaction is not
|
|
70
|
+
supported, proceed to Step 4 following the generated plan.
|
|
71
|
+
|
|
72
|
+
### Step 4: Capture the XML View UI
|
|
73
|
+
|
|
74
|
+
**IF** you support user interaction, ask the user to upload a screenshot of the
|
|
75
|
+
XML View UI or provide an absolute path to a file. Use this image as a visual
|
|
76
|
+
reference for the layout migration in Step 7.
|
|
77
|
+
**ELSE IF** you are able to run an Android emulator, locate an existing
|
|
78
|
+
screenshot test for the XML candidate. If none exists, create one using the
|
|
79
|
+
existing project testing framework. If no framework exists,
|
|
80
|
+
use **UI Automator** or **Espresso** to create a screenshot test with minimum
|
|
81
|
+
required setup. Run the test and take a baseline screenshot of the XML UI.
|
|
82
|
+
**ELSE** proceed to Step 5.
|
|
83
|
+
|
|
84
|
+
### Step 5: Set up Compose dependencies and compiler
|
|
85
|
+
|
|
86
|
+
Check `build.gradle` or `libs.versions.toml` for Compose dependencies and
|
|
87
|
+
compiler setup. If missing, use
|
|
88
|
+
[Setup Compose Dependencies and Compiler](references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md).
|
|
89
|
+
Run a sync to ensure dependencies resolve without errors.
|
|
90
|
+
|
|
91
|
+
### Step 6: Set up Compose theming
|
|
92
|
+
|
|
93
|
+
If the project already has Compose theming set up, proceed to Step 7. If Compose
|
|
94
|
+
theming is missing, initialize it. For Material-based projects, follow
|
|
95
|
+
[Material 3 migration guidelines](references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md).
|
|
96
|
+
For custom design systems, apply expert judgment to migrate XML theming and
|
|
97
|
+
match existing styles.
|
|
98
|
+
**Constraints:** Do not migrate the entire theme. Implement only the minimum
|
|
99
|
+
theming required for the specific XML candidate. Maintain original XML themes
|
|
100
|
+
for interoperability. Maintain existing project code conventions, patterns,
|
|
101
|
+
names and values.
|
|
102
|
+
|
|
103
|
+
### Step 7: Migrate the XML View to Compose
|
|
104
|
+
|
|
105
|
+
Convert the XML candidate to Jetpack Compose code, referencing
|
|
106
|
+
[references/xml-layout-migration.md](references/xml-layout-migration.md) and the image from Step 4.
|
|
107
|
+
You must include a **Compose Preview** for the newly created composable to
|
|
108
|
+
facilitate visual verification.
|
|
109
|
+
|
|
110
|
+
### Step 8: Replace usages
|
|
111
|
+
|
|
112
|
+
Replace the usages of the migrated XML layout to use the new Compose component.
|
|
113
|
+
|
|
114
|
+
- To add Compose in Views, use [Compose in Views](references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md).
|
|
115
|
+
- To add Views in Compose, use [Views in Compose](references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md).
|
|
116
|
+
|
|
117
|
+
### Step 9: Validate the migration
|
|
118
|
+
|
|
119
|
+
Compare the baseline screenshot image from Step 4 with the rendered Compose
|
|
120
|
+
Preview of the new composable. Ignore string content; focus on layout and
|
|
121
|
+
styling. Iterate on the Compose code until visual parity is achieved. Once
|
|
122
|
+
verified, write a Compose UI test for the new composable.
|
|
123
|
+
|
|
124
|
+
### Step 10: XML code removal
|
|
125
|
+
|
|
126
|
+
Delete the migrated XML file and its associated legacy tests. **Caution:** Only
|
|
127
|
+
remove code and resources that are not referenced by other parts of the project.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
## 1. Project health \& build validation
|
|
2
|
+
|
|
3
|
+
Before performing any analysis, you must confirm the project is in a functional state.
|
|
4
|
+
\* **Integrity check:** Verify the project syncs (Gradle) and builds successfully.
|
|
5
|
+
\* **Error resolution:** If there are pre-existing build errors or sync failures, you must report these immediately and attempt to fix. **Do not proceed** with migration until a stable baseline is established.
|
|
6
|
+
|
|
7
|
+
## 2. Compose pattern \& consistency analysis
|
|
8
|
+
|
|
9
|
+
If Jetpack Compose is already present, you must align with the established implementation style.
|
|
10
|
+
\* **Pattern identification:** Scan the codebase for `@Composable` functions. Identify the project's "Best Practices" regarding state hoisting, composable construction and naming conventions, and file organization.
|
|
11
|
+
\* **Theming review:** Determine how `MaterialTheme` or custom theme systems are implemented.
|
|
12
|
+
\* Identify if the project uses a custom design system theme.
|
|
13
|
+
\* Map how attributes, styles, and other theme components are accessed in Compose.
|
|
14
|
+
|
|
15
|
+
## 3. Design system \& infrastructure audit
|
|
16
|
+
|
|
17
|
+
Understand the design system classification (e.g. Material 2, Material 3, or custom design system).
|
|
18
|
+
\* **Resource mapping:** Locate central XML definitions:
|
|
19
|
+
\* `colors.xml` (Light/Dark variants)
|
|
20
|
+
\* `dimens.xml`
|
|
21
|
+
\* `styles.xml` / `themes.xml`
|
|
22
|
+
\* **Hybrid analysis:** Determine if the project is **XML-only** , **Compose-only** , or **Hybrid** .
|
|
23
|
+
\* **Reuse constraint:** If a Compose theming layer (e.g., `AppTheme.kt`) already exists, **DO NOT** generate a new one. You must reuse the existing infrastructure and contribute to it by following its existing implementation pattern.
|
|
24
|
+
|
|
25
|
+
## 4. Candidate layout decomposition
|
|
26
|
+
|
|
27
|
+
Analyze the specific XML layout targeted for migration. You must extract and document the following requirements for the new composable:
|
|
28
|
+
\* **Inputs:** UI State objects, primitive parameters, and click listeners.
|
|
29
|
+
\* **Styling:** Specific color constants, typography styles, and shape definitions referenced in the XML.
|
|
30
|
+
\* **Resources:** Identifying string resources, drawables, and dimensions.
|
|
31
|
+
\* **Layout logic:** Modifiers required to replicate the XML constraints (padding, alignment, weight).
|
|
32
|
+
|
|
33
|
+
## 5. Architectural \& non-UI analysis
|
|
34
|
+
|
|
35
|
+
Understand the environment in which the UI resides to ensure proper integration.
|
|
36
|
+
\* **State management:** Identify the usage of `ViewModel`, `Flow`, or `LiveData`.
|
|
37
|
+
\* **Dependency Injection:** Check for Hilt, Koin, or manual DI to understand how dependencies are provided to the UI layer.
|
|
38
|
+
\* **Testing \& architecture:** Note the architectural pattern (MVI, MVVM, or custom architecture setup.) and existing UI testing frameworks to ensure the migrated code remains testable. Unless the user explicitly requests, **DO NOT** make any changes to any non-UI code that aren't strictly required for the migration of the XML View.
|
|
39
|
+
|
|
40
|
+
*** ** * ** ***
|
|
41
|
+
|
|
42
|
+
> **Pro-tip:** Always prioritize the "Existing infrastructure" over "Default templates." If the project has a custom way of handling spacing or colors, composable code, or any other project layer, your generated Compose code must reflect that specific implementation.
|