reis-mobile 0.3.6 → 0.5.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 +39 -0
- package/README.md +135 -297
- package/THIRD_PARTY_NOTICES.md +221 -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-code-reviewer.md +2 -0
- 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 +28 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +24 -3
- package/skills/mobile-android/SKILL.md +29 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/GUIDE.md +87 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/recipes.md +62 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/GUIDE.md +450 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/references/interact.md +113 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/references/journeys.md +120 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/GUIDE.md +34 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/env_setup.md +15 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/GUIDE.md +53 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/mobile-android/references/build-and-performance.md +12 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/GUIDE.md +317 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/GUIDE.md +707 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/GUIDE.md +341 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/mobile-android/references/devices.md +11 -0
- package/skills/mobile-android/references/identity/restore-credentials/GUIDE.md +337 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/mobile-android/references/identity/verified-email/GUIDE.md +405 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/mobile-android/references/identity.md +10 -0
- package/skills/mobile-android/references/media/camerax/GUIDE.md +106 -0
- package/skills/mobile-android/references/media/camerax/references/camera1-to-camerax.md +198 -0
- package/skills/mobile-android/references/media/camerax/references/camera2-to-camerax.md +193 -0
- package/skills/mobile-android/references/media/camerax/references/expert-blueprints.md +58 -0
- package/skills/mobile-android/references/media/camerax/references/foldables.md +83 -0
- package/skills/mobile-android/references/media/camerax/references/immutability.md +60 -0
- package/skills/mobile-android/references/media/camerax/references/low-light.md +124 -0
- package/skills/mobile-android/references/media/camerax/references/mlkit-spatial.md +75 -0
- package/skills/mobile-android/references/media/camerax/references/modern-apis.md +42 -0
- package/skills/mobile-android/references/media/camerax/references/testing.md +69 -0
- package/skills/mobile-android/references/media/camerax/references/thermals.md +85 -0
- package/skills/mobile-android/references/media/camerax/references/wear-os.md +76 -0
- package/skills/mobile-android/references/media/camerax/references/xr.md +54 -0
- package/skills/mobile-android/references/media/media3-cast-integration/GUIDE.md +213 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/mobile-android/references/media.md +10 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/GUIDE.md +51 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/context.md +26 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/implementation-configuration.md +282 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/GUIDE.md +105 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/mobile-android/references/on-device-ai.md +10 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/GUIDE.md +112 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/clusters.md +154 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/common.md +519 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/patterns.md +527 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/requests.md +260 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/GUIDE.md +75 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/mobile-android/references/play/play-policy-insights/GUIDE.md +130 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/critic.md +86 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/policies.json +321 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/scanner.py +261 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/mobile-android/references/play.md +11 -0
- package/skills/mobile-android/references/ui/adaptive/GUIDE.md +280 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/mobile-android/references/ui/edge-to-edge/GUIDE.md +409 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/GUIDE.md +104 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/mobile-android/references/ui/navigation-3/GUIDE.md +86 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/mobile-android/references/ui/navigation-event/GUIDE.md +288 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/mobile-android/references/ui/styles/GUIDE.md +209 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/mobile-android/references/ui.md +14 -0
- package/skills/mobile-architecture/SKILL.md +52 -0
- package/skills/mobile-architecture/references/android.md +54 -0
- package/skills/{flutter-app-architecture/SKILL.md → mobile-architecture/references/flutter/app-architecture.md} +1 -8
- package/skills/{bloc/SKILL.md → mobile-architecture/references/flutter/bloc.md} +1 -8
- package/skills/{flutter-change-notifier/SKILL.md → mobile-architecture/references/flutter/change-notifier.md} +1 -8
- package/skills/{architecture-feature-first/SKILL.md → mobile-architecture/references/flutter/feature-first.md} +1 -8
- package/skills/{flutter-login-usecase/SKILL.md → mobile-architecture/references/flutter/login-use-case.md} +0 -7
- package/skills/{flutter-managing-state/SKILL.md → mobile-architecture/references/flutter/managing-state.md} +2 -11
- package/skills/{provider/SKILL.md → mobile-architecture/references/flutter/provider.md} +1 -8
- package/skills/{flutter-apply-architecture-best-practices/SKILL.md → mobile-architecture/references/flutter/recommended-architecture.md} +2 -11
- package/skills/{riverpod/SKILL.md → mobile-architecture/references/flutter/riverpod.md} +1 -8
- package/skills/mobile-architecture/references/flutter.md +21 -0
- package/skills/mobile-architecture/references/ios.md +58 -0
- package/skills/mobile-architecture/references/react-native.md +61 -0
- package/skills/mobile-code-review/SKILL.md +70 -0
- package/skills/mobile-code-review/references/android.md +51 -0
- package/skills/{code-review/SKILL.md → mobile-code-review/references/flutter/pr-review.md} +1 -8
- package/skills/{flutter-project-audit/SKILL.md → mobile-code-review/references/flutter/project-audit.md} +0 -7
- package/skills/{dart-run-static-analysis/SKILL.md → mobile-code-review/references/flutter/static-analysis.md} +2 -11
- package/skills/{flutter-widget-review/SKILL.md → mobile-code-review/references/flutter/widget-review.md} +0 -7
- package/skills/mobile-code-review/references/flutter.md +18 -0
- package/skills/mobile-code-review/references/ios.md +49 -0
- package/skills/mobile-code-review/references/react-native.md +58 -0
- package/skills/mobile-debug/SKILL.md +50 -0
- package/skills/mobile-debug/references/android/gradle-build.md +63 -0
- package/skills/mobile-debug/references/android.md +26 -0
- package/skills/mobile-debug/references/flutter/build.md +58 -0
- package/skills/{flutter-errors/SKILL.md → mobile-debug/references/flutter/errors.md} +1 -8
- package/skills/{flutter-fix-layout-issues/SKILL.md → mobile-debug/references/flutter/layout-issues.md} +2 -11
- package/skills/{dart-resolve-package-conflicts/SKILL.md → mobile-debug/references/flutter/package-conflicts.md} +2 -11
- package/skills/{dart-fix-runtime-errors/SKILL.md → mobile-debug/references/flutter/runtime-errors.md} +2 -11
- package/skills/mobile-debug/references/flutter.md +23 -0
- package/skills/mobile-debug/references/ios/cocoapods.md +57 -0
- package/skills/mobile-debug/references/ios/xcode-build.md +58 -0
- package/skills/mobile-debug/references/ios.md +23 -0
- package/skills/mobile-debug/references/react-native.md +43 -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-flutter/SKILL.md +30 -0
- package/skills/{flutter-improving-accessibility/SKILL.md → mobile-flutter/references/accessibility-i18n/accessibility.md} +2 -11
- package/skills/{flutter-setup-localization/SKILL.md → mobile-flutter/references/accessibility-i18n/localization.md} +2 -11
- package/skills/mobile-flutter/references/accessibility-i18n.md +8 -0
- package/skills/{dart-3-updates/SKILL.md → mobile-flutter/references/dart/dart-3.md} +1 -8
- package/skills/{effective-dart/SKILL.md → mobile-flutter/references/dart/effective-dart.md} +1 -8
- package/skills/{dart-use-pattern-matching/SKILL.md → mobile-flutter/references/dart/pattern-matching/GUIDE.md} +2 -18
- package/skills/mobile-flutter/references/dart.md +9 -0
- package/skills/{flutter-caching-data/SKILL.md → mobile-flutter/references/data/caching.md} +2 -11
- package/skills/{flutter-working-with-databases/SKILL.md → mobile-flutter/references/data/databases.md} +2 -11
- package/skills/{flutter-use-http-package/SKILL.md → mobile-flutter/references/data/http.md} +2 -11
- package/skills/{flutter-implement-json-serialization/SKILL.md → mobile-flutter/references/data/json-serialization.md} +2 -11
- package/skills/mobile-flutter/references/data.md +10 -0
- package/skills/{flutter-interoperating-with-native-apis/SKILL.md → mobile-flutter/references/native/native-apis.md} +2 -11
- package/skills/{flutter-embedding-native-views/SKILL.md → mobile-flutter/references/native/native-views.md} +2 -11
- package/skills/{flutter-building-plugins/SKILL.md → mobile-flutter/references/native/plugins.md} +2 -11
- package/skills/mobile-flutter/references/native.md +9 -0
- package/skills/{flutter-reducing-app-size/SKILL.md → mobile-flutter/references/performance/app-size.md} +2 -11
- package/skills/{flutter-handling-concurrency/SKILL.md → mobile-flutter/references/performance/concurrency.md} +2 -11
- package/skills/mobile-flutter/references/performance.md +8 -0
- package/skills/{flutter-setting-up-on-macos/SKILL.md → mobile-flutter/references/setup/macos.md} +2 -11
- package/skills/mobile-flutter/references/setup.md +7 -0
- package/skills/{flutter-animating-apps/SKILL.md → mobile-flutter/references/ui/animations.md} +2 -11
- package/skills/{flutter-building-forms/SKILL.md → mobile-flutter/references/ui/forms.md} +2 -11
- package/skills/{flutter-adding-home-screen-widgets/SKILL.md → mobile-flutter/references/ui/home-screen-widgets.md} +2 -11
- package/skills/{flutter-building-layouts/SKILL.md → mobile-flutter/references/ui/layouts.md} +2 -11
- package/skills/{flutter-build-responsive-layout/SKILL.md → mobile-flutter/references/ui/responsive-layout.md} +2 -11
- package/skills/{flutter-setup-declarative-routing/SKILL.md → mobile-flutter/references/ui/routing.md} +2 -11
- package/skills/{flutter-theming-apps/SKILL.md → mobile-flutter/references/ui/theming.md} +2 -11
- package/skills/{flutter-add-widget-preview/SKILL.md → mobile-flutter/references/ui/widget-previews.md} +2 -11
- package/skills/mobile-flutter/references/ui.md +14 -0
- package/skills/mobile-ios/SKILL.md +25 -0
- package/skills/mobile-ios/references/data-networking.md +70 -0
- package/skills/mobile-ios/references/performance-release.md +37 -0
- package/skills/mobile-ios/references/platform-features.md +52 -0
- package/skills/mobile-ios/references/ui-navigation.md +64 -0
- package/skills/mobile-rn/SKILL.md +26 -0
- package/skills/mobile-rn/references/data-networking.md +59 -0
- package/skills/mobile-rn/references/performance-release.md +46 -0
- package/skills/mobile-rn/references/platform-features.md +40 -0
- package/skills/mobile-rn/references/ui-navigation.md +62 -0
- package/skills/mobile-security/SKILL.md +82 -0
- package/skills/mobile-security/references/android/intent-security.md +523 -0
- package/skills/mobile-security/references/android.md +37 -0
- package/skills/{flutter-secure-token-store/SKILL.md → mobile-security/references/flutter/secure-token-store.md} +1 -8
- package/skills/mobile-security/references/flutter.md +30 -0
- package/skills/mobile-security/references/ios.md +27 -0
- package/skills/mobile-security/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/mobile-security-audit/SKILL.md +0 -101
- /package/skills/{dart-use-pattern-matching → mobile-flutter/references/dart/pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
> Adapted from the `media3-cast-integration` skill in [android/skills](https://github.com/android/skills) (Apache-2.0). See `THIRD_PARTY_NOTICES.md`.
|
|
2
|
+
|
|
3
|
+
## Prerequisites
|
|
4
|
+
|
|
5
|
+
- Jetpack Media3 version must be `>= 1.9.0`. Cast isn't available in lower versions.
|
|
6
|
+
|
|
7
|
+
## Glossary
|
|
8
|
+
|
|
9
|
+
- **`CastPlayer`** : Media3 `Player` that controls playback on both local and remote Cast devices.
|
|
10
|
+
- **`RemoteCastPlayer`** : Media3 `Player` that communicates with a Cast receiver, only used for remote playback.
|
|
11
|
+
- **Google Cast SDK**: Legacy casting SDK in maintenance mode, superseded by Jetpack Media3.
|
|
12
|
+
- **`OptionsProvider`** : Interface providing configuration options to initialize GMS `CastContext`.
|
|
13
|
+
|
|
14
|
+
## Common guidelines
|
|
15
|
+
|
|
16
|
+
- Legacy [Google Cast SDK](https://developers.google.com/cast) is in maintenance mode.
|
|
17
|
+
- For new Cast setups:
|
|
18
|
+
- You must use [Jetpack Media3 Cast](references/android/media/media3/cast/index.md).
|
|
19
|
+
- You mustn't use legacy Cast SDK unless explicitly requested.
|
|
20
|
+
|
|
21
|
+
## Step 1: Set up dependencies
|
|
22
|
+
|
|
23
|
+
To complete this step, you **MUST** ensure the following:
|
|
24
|
+
|
|
25
|
+
- In the app-level build file, declare the `media3-cast` dependency version
|
|
26
|
+
1.9.0 or higher.
|
|
27
|
+
|
|
28
|
+
implementation("androidx.media3:media3-cast:1.11.0")
|
|
29
|
+
|
|
30
|
+
- Ensure required Media3 dependencies are present:
|
|
31
|
+
|
|
32
|
+
- `androidx.media3:media3-exoplayer`
|
|
33
|
+
- `androidx.media3:media3-session`
|
|
34
|
+
- `androidx.media3:media3-ui-compose`
|
|
35
|
+
- If the application uses legacy Views, add `media3-ui`.
|
|
36
|
+
|
|
37
|
+
- Enforce the same versions across all Media3 dependencies.
|
|
38
|
+
|
|
39
|
+
- Use configurations in "Add build dependencies" section of [Getting started
|
|
40
|
+
with CastPlayer](references/android/media/media3/cast/create-castplayer.md) as the source of
|
|
41
|
+
truth.
|
|
42
|
+
|
|
43
|
+
- **For apps without an existing Cast integration:**
|
|
44
|
+
|
|
45
|
+
- Verify legacy Cast SDK (`libs.play.services.cast.framework`) is absent.
|
|
46
|
+
- **If Migrating from Legacy Cast SDK:**
|
|
47
|
+
|
|
48
|
+
- Add Media3 Cast dependencies first.
|
|
49
|
+
- Keep existing legacy dependencies untouched at this stage to prevent compilation errors.
|
|
50
|
+
|
|
51
|
+
## Step 2: Update the manifest
|
|
52
|
+
|
|
53
|
+
To complete this step, you **MUST** ensure the following:
|
|
54
|
+
|
|
55
|
+
- Inside the manifest's `<application>` tag, declare the Cast options provider.
|
|
56
|
+
- Use `DefaultCastOptionsProvider` by default. See the "OptionsProvider" section in [Getting started with
|
|
57
|
+
CastPlayer](references/android/media/media3/cast/create-castplayer.md).
|
|
58
|
+
- Declare a custom `OptionsProvider` only if explicitly requested. See [Customize CastOptions](references/android/media/media3/cast/customize-castoptions.md).
|
|
59
|
+
- Ensure `INTERNET` permission is present. Don't add any unnecessary permissions.
|
|
60
|
+
- **If Migrating from Legacy Cast SDK:**
|
|
61
|
+
- Don't delete existing custom options provider files or manifest entries.
|
|
62
|
+
|
|
63
|
+
## Step 3: Implement the player and service
|
|
64
|
+
|
|
65
|
+
### Architecture baseline
|
|
66
|
+
|
|
67
|
+
Before integrating Media3 Cast, an existing app follows one of two setups:
|
|
68
|
+
|
|
69
|
+
- **Local-only playback:** Uses Media3 `ExoPlayer` only to support local playback.
|
|
70
|
+
- **Legacy Cast setup:** Uses `ExoPlayer` for local playback, alongside a `Player` wrapper over the legacy `RemoteMediaClient` for remote playback. The UI interfaces with a `MediaSession` interacting with a `ForwardingPlayer`, which finally routes controls to either local or remote playback.
|
|
71
|
+
|
|
72
|
+
To complete this step, you **MUST** ensure the following:
|
|
73
|
+
|
|
74
|
+
- Inside the application's `MediaSessionService` (or `MediaLibraryService`) `onCreate()` method, initialize `ExoPlayer` and `CastPlayer`.
|
|
75
|
+
- Use `CastPlayer` by default unless `RemoteCastPlayer` is explicitly requested. See the "Build a CastPlayer" section in [Getting started with
|
|
76
|
+
CastPlayer](references/android/media/media3/cast/create-castplayer.md).
|
|
77
|
+
- For `CastPlayer`, pass the instance directly to `MediaSession.Builder`.
|
|
78
|
+
- Replace all legacy forwarding player wrappers.
|
|
79
|
+
- Don't delete legacy class files yet to prevent compilation errors during migration.
|
|
80
|
+
|
|
81
|
+
### Advanced: `RemoteCastPlayer`
|
|
82
|
+
|
|
83
|
+
- Use `RemoteCastPlayer` only if explicitly requested by user.
|
|
84
|
+
- Initialize `MediaSession` with `localPlayer` and set a `SessionAvailabilityListener` on `RemoteCastPlayer` to transfer playback state on Cast session availability changes:
|
|
85
|
+
|
|
86
|
+
class PlaybackService : MediaSessionService() {
|
|
87
|
+
private var mediaSession: MediaSession? = null
|
|
88
|
+
private lateinit var localPlayer: ExoPlayer
|
|
89
|
+
private lateinit var remotePlayer: RemoteCastPlayer
|
|
90
|
+
|
|
91
|
+
override fun onCreate() {
|
|
92
|
+
super.onCreate()
|
|
93
|
+
|
|
94
|
+
localPlayer = ExoPlayer.Builder(this).build()
|
|
95
|
+
remotePlayer = RemoteCastPlayer.Builder(this).build()
|
|
96
|
+
mediaSession = MediaSession.Builder(this, localPlayer).build()
|
|
97
|
+
|
|
98
|
+
remotePlayer.setSessionAvailabilityListener(
|
|
99
|
+
object : SessionAvailabilityListener {
|
|
100
|
+
override fun onCastSessionAvailable() {
|
|
101
|
+
transferPlaybackState(localPlayer, remotePlayer)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
override fun onCastSessionUnavailable() {
|
|
105
|
+
transferPlaybackState(remotePlayer, localPlayer)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private fun transferPlaybackState(previousPlayer: Player, newPlayer: Player) {
|
|
112
|
+
if (previousPlayer.mediaItemCount > 0) {
|
|
113
|
+
val transferStateBuilder = PlayerTransferState.builderFromPlayer(previousPlayer)
|
|
114
|
+
if (previousPlayer.playbackState == Player.STATE_ENDED ||
|
|
115
|
+
previousPlayer.currentPosition == C.TIME_END_OF_SOURCE) {
|
|
116
|
+
transferStateBuilder.setCurrentMediaItemIndex(0)
|
|
117
|
+
transferStateBuilder.setCurrentPosition(0)
|
|
118
|
+
}
|
|
119
|
+
transferStateBuilder.build().setToPlayer(newPlayer)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
previousPlayer.stop()
|
|
123
|
+
previousPlayer.clearMediaItems()
|
|
124
|
+
newPlayer.prepare()
|
|
125
|
+
mediaSession?.setPlayer(newPlayer)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
## Step 4: Set up the UI
|
|
130
|
+
|
|
131
|
+
### Compose-based UI
|
|
132
|
+
|
|
133
|
+
To complete this step, you **MUST** ensure the following:
|
|
134
|
+
|
|
135
|
+
- See the "Add a MediaRouteButton Composable to the Player" section in [Getting started with CastPlayer](references/android/media/media3/cast/create-castplayer.md) for Compose integration guidelines.
|
|
136
|
+
- Use the [`MediaRouteButton` composable](https://developer.android.com/reference/kotlin/androidx/media3/cast/MediaRouteButton.composable) from `androidx.media3.cast` package.
|
|
137
|
+
- Don't use `AndroidView` in the Compose UI hierarchy.
|
|
138
|
+
- Place `MediaRouteButton` in an area next to playback controls. Don't hide it behind system UI.
|
|
139
|
+
- Don't use `PlayerSurface` for custom player UI. Use the Material3 [`Player`
|
|
140
|
+
composable](https://developer.android.com/reference/kotlin/androidx/media3/ui/compose/material3/Player.composable).
|
|
141
|
+
- Force recomposition on playback location shifts to ensure UI sync. Use key
|
|
142
|
+
constraints on `DeviceInfo` changes:
|
|
143
|
+
|
|
144
|
+
@OptIn(UnstableApi::class)
|
|
145
|
+
@Composable
|
|
146
|
+
fun MainScreen() {
|
|
147
|
+
val player = rememberMediaController()
|
|
148
|
+
val deviceInfo = rememberDeviceInfo(player)
|
|
149
|
+
player?.let { activePlayer -> key(deviceInfo) { PlayerScreen(player = activePlayer) } }
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@Composable
|
|
153
|
+
private fun rememberMediaController(): Player? {
|
|
154
|
+
// Logic to connect MediaController to MediaSession and release it
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
@Composable
|
|
158
|
+
private fun rememberDeviceInfo(player: Player?): DeviceInfo? {
|
|
159
|
+
var deviceInfo by remember(player) { mutableStateOf(player?.deviceInfo) }
|
|
160
|
+
DisposableEffect(player) {
|
|
161
|
+
val activePlayer = player ?: return@DisposableEffect onDispose {}
|
|
162
|
+
deviceInfo = activePlayer.deviceInfo
|
|
163
|
+
val listener = object : Player.Listener {
|
|
164
|
+
override fun onDeviceInfoChanged(info: DeviceInfo) {
|
|
165
|
+
deviceInfo = info
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
activePlayer.addListener(listener)
|
|
169
|
+
onDispose { activePlayer.removeListener(listener) }
|
|
170
|
+
}
|
|
171
|
+
return deviceInfo
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
### View-based UI
|
|
175
|
+
|
|
176
|
+
To complete this step, you **MUST** ensure the following:
|
|
177
|
+
|
|
178
|
+
- For View-based UI setups, see the "Add UI elements" section in [Getting
|
|
179
|
+
started with CastPlayer](references/android/media/media3/cast/create-castplayer.md).
|
|
180
|
+
- Casting Activities must extend `AppCompatActivity` or `FragmentActivity` and use a `Theme.AppCompat` descendant.
|
|
181
|
+
- Ensure the `AppCompat` theme has a visible `ActionBar` if adding `MediaRouteButton` to the options menu.
|
|
182
|
+
- Replace all instances and imports of `CastButtonFactory` with `MediaRouteButtonFactory`.
|
|
183
|
+
- Rebind `PlayerView.player` references upon `onDeviceInfoChanged` events to
|
|
184
|
+
prevent black screens or UI freezes:
|
|
185
|
+
|
|
186
|
+
private val playerListener: Player.Listener =
|
|
187
|
+
object : Player.Listener {
|
|
188
|
+
override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
|
|
189
|
+
// Resetting to null bypasses PlayerView.setPlayer()'s instance equality check
|
|
190
|
+
// (this.player == player), forcing it to re-bind the video surface to the controller.
|
|
191
|
+
playerView.player = null
|
|
192
|
+
playerView.player = controller
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
- **Migration to Compose:**
|
|
197
|
+
|
|
198
|
+
- Don't use `AndroidView` to wrap the legacy `PlayerView`.
|
|
199
|
+
- Implement Material3 [`Player` composable](https://developer.android.com/reference/kotlin/androidx/media3/ui/compose/material3/Player.composable) and [`MediaRouteButton` composable](https://developer.android.com/reference/kotlin/androidx/media3/cast/MediaRouteButton.composable) as per [Getting started with CastPlayer](references/android/media/media3/cast/create-castplayer.md).
|
|
200
|
+
- Remove legacy XML layout declarations, menu files, and View component references.
|
|
201
|
+
|
|
202
|
+
## Step 5: Clean up legacy Cast SDK code
|
|
203
|
+
|
|
204
|
+
> [!WARNING]
|
|
205
|
+
> **Warning:** Don't perform cleanup directly. Remove legacy files and dependencies only when explicitly requested by the user.
|
|
206
|
+
|
|
207
|
+
To complete this step, you **MUST** ensure the following:
|
|
208
|
+
|
|
209
|
+
- Remove legacy GMS Cast SDK (`libs.play.services.cast.framework`) and MediaRouter (`libs.androidx.mediarouter`) dependencies.
|
|
210
|
+
- Delete custom `OptionsProvider` classes and manifest entries if `DefaultCastOptionsProvider` is adopted.
|
|
211
|
+
- Remove legacy `MediaTransferReceiver` manifest declarations if present.
|
|
212
|
+
- Remove all references to legacy Cast SDK components such as legacy helper wrappers, forwarding players, and `RemoteMediaClient` interfaces.
|
|
213
|
+
- Delete legacy View XML layouts, menu files, and references to `PlayerView` if the migration to Compose is complete.
|
|
@@ -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 />
|