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.
Files changed (539) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +39 -0
  4. package/README.md +135 -297
  5. package/THIRD_PARTY_NOTICES.md +221 -4
  6. package/agents/android-architect.md +89 -0
  7. package/agents/android-performance-engineer.md +92 -0
  8. package/agents/android-test-engineer.md +97 -0
  9. package/agents/flutter-test-engineer.md +2 -0
  10. package/agents/ios-architect.md +93 -0
  11. package/agents/ios-performance-engineer.md +92 -0
  12. package/agents/ios-test-engineer.md +95 -0
  13. package/agents/lead-mobile.md +10 -1
  14. package/agents/mobile-code-reviewer.md +2 -0
  15. package/agents/mobile-staff-engineer.md +1 -1
  16. package/agents/rn-architect.md +94 -0
  17. package/agents/rn-performance-engineer.md +92 -0
  18. package/agents/rn-test-engineer.md +98 -0
  19. package/bin/reis-mobile.mjs +59 -17
  20. package/commands/debate.md +10 -1
  21. package/commands/debug.md +60 -0
  22. package/commands/reis-mobile.md +7 -2
  23. package/core/config/project.mjs +59 -0
  24. package/core/registry/frontmatter.mjs +15 -4
  25. package/core/registry/registry.mjs +28 -1
  26. package/core/router/intents.mjs +2 -0
  27. package/core/router/router.mjs +10 -5
  28. package/package.json +24 -3
  29. package/skills/mobile-android/SKILL.md +29 -0
  30. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/GUIDE.md +87 -0
  31. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
  32. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
  33. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/buildconfig.md +54 -0
  34. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/ksp-kapt.md +39 -0
  35. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
  36. package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/recipes.md +62 -0
  37. package/skills/mobile-android/references/build-and-performance/android-cli/GUIDE.md +450 -0
  38. package/skills/mobile-android/references/build-and-performance/android-cli/references/interact.md +113 -0
  39. package/skills/mobile-android/references/build-and-performance/android-cli/references/journeys.md +120 -0
  40. package/skills/mobile-android/references/build-and-performance/android-profiler/GUIDE.md +34 -0
  41. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/analysis_orchestrator.md +32 -0
  42. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
  43. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
  44. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
  45. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
  46. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
  47. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
  48. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
  49. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
  50. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
  51. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
  52. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
  53. package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
  54. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/recording_orchestrator.md +36 -0
  55. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
  56. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
  57. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
  58. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
  59. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
  60. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
  61. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
  62. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
  63. package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
  64. package/skills/mobile-android/references/build-and-performance/android-profiler/references/env_setup.md +15 -0
  65. package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/setup.md +29 -0
  66. package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/sql.md +327 -0
  67. package/skills/mobile-android/references/build-and-performance/r8-analyzer/GUIDE.md +53 -0
  68. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
  69. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION.md +44 -0
  70. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
  71. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REDUNDANT-RULES.md +222 -0
  72. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
  73. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REPORT_FORMAT.md +51 -0
  74. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
  75. package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
  76. package/skills/mobile-android/references/build-and-performance.md +12 -0
  77. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/GUIDE.md +317 -0
  78. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
  79. 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
  80. 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
  81. 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
  82. 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
  83. 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
  84. 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
  85. 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
  86. 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
  87. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
  88. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
  89. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
  90. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
  91. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
  92. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
  93. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
  94. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
  95. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
  96. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
  97. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
  98. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
  99. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
  100. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
  101. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
  102. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
  103. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
  104. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
  105. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
  106. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
  107. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
  108. package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
  109. package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/GUIDE.md +707 -0
  110. package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
  111. package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
  112. package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
  113. package/skills/mobile-android/references/devices/wear-compose-m3/GUIDE.md +341 -0
  114. package/skills/mobile-android/references/devices/wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
  115. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
  116. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
  117. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
  118. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
  119. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
  120. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
  121. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
  122. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
  123. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
  124. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
  125. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
  126. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
  127. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
  128. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
  129. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
  130. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
  131. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
  132. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
  133. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
  134. package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
  135. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
  136. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
  137. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
  138. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
  139. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
  140. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
  141. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
  142. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
  143. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md +470 -0
  144. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
  145. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
  146. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
  147. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
  148. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
  149. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
  150. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
  151. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
  152. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
  153. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
  154. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
  155. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
  156. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
  157. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
  158. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
  159. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
  160. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
  161. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
  162. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
  163. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
  164. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
  165. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
  166. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
  167. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
  168. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
  169. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
  170. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
  171. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
  172. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
  173. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
  174. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
  175. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
  176. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
  177. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
  178. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
  179. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
  180. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
  181. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
  182. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
  183. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
  184. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
  185. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
  186. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
  187. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
  188. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
  189. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
  190. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
  191. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
  192. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
  193. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
  194. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
  195. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
  196. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
  197. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
  198. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
  199. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
  200. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
  201. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
  202. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
  203. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
  204. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
  205. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
  206. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
  207. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
  208. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
  209. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
  210. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
  211. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
  212. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
  213. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
  214. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
  215. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
  216. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
  217. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
  218. package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
  219. package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
  220. package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
  221. package/skills/mobile-android/references/devices.md +11 -0
  222. package/skills/mobile-android/references/identity/restore-credentials/GUIDE.md +337 -0
  223. package/skills/mobile-android/references/identity/restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
  224. package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
  225. package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
  226. package/skills/mobile-android/references/identity/verified-email/GUIDE.md +405 -0
  227. package/skills/mobile-android/references/identity/verified-email/references/android/identity/credential-manager/index.md +67 -0
  228. package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
  229. package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
  230. package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
  231. package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/index.md +112 -0
  232. package/skills/mobile-android/references/identity/verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
  233. package/skills/mobile-android/references/identity/verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
  234. package/skills/mobile-android/references/identity.md +10 -0
  235. package/skills/mobile-android/references/media/camerax/GUIDE.md +106 -0
  236. package/skills/mobile-android/references/media/camerax/references/camera1-to-camerax.md +198 -0
  237. package/skills/mobile-android/references/media/camerax/references/camera2-to-camerax.md +193 -0
  238. package/skills/mobile-android/references/media/camerax/references/expert-blueprints.md +58 -0
  239. package/skills/mobile-android/references/media/camerax/references/foldables.md +83 -0
  240. package/skills/mobile-android/references/media/camerax/references/immutability.md +60 -0
  241. package/skills/mobile-android/references/media/camerax/references/low-light.md +124 -0
  242. package/skills/mobile-android/references/media/camerax/references/mlkit-spatial.md +75 -0
  243. package/skills/mobile-android/references/media/camerax/references/modern-apis.md +42 -0
  244. package/skills/mobile-android/references/media/camerax/references/testing.md +69 -0
  245. package/skills/mobile-android/references/media/camerax/references/thermals.md +85 -0
  246. package/skills/mobile-android/references/media/camerax/references/wear-os.md +76 -0
  247. package/skills/mobile-android/references/media/camerax/references/xr.md +54 -0
  248. package/skills/mobile-android/references/media/media3-cast-integration/GUIDE.md +213 -0
  249. package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
  250. package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
  251. package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
  252. package/skills/mobile-android/references/media.md +10 -0
  253. package/skills/mobile-android/references/on-device-ai/appfunctions/GUIDE.md +51 -0
  254. package/skills/mobile-android/references/on-device-ai/appfunctions/references/adb-interaction-testing.md +95 -0
  255. package/skills/mobile-android/references/on-device-ai/appfunctions/references/context.md +26 -0
  256. package/skills/mobile-android/references/on-device-ai/appfunctions/references/feature-discovery-analysis.md +71 -0
  257. package/skills/mobile-android/references/on-device-ai/appfunctions/references/implementation-configuration.md +282 -0
  258. package/skills/mobile-android/references/on-device-ai/appfunctions/references/kdoc-refinement-optimization.md +75 -0
  259. package/skills/mobile-android/references/on-device-ai/appfunctions/references/migrate-to-service-entry-point.md +226 -0
  260. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/GUIDE.md +105 -0
  261. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/get-started.md +272 -0
  262. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
  263. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
  264. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
  265. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/structured-output.md +219 -0
  266. package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
  267. package/skills/mobile-android/references/on-device-ai.md +10 -0
  268. package/skills/mobile-android/references/play/engage-sdk-integration/GUIDE.md +112 -0
  269. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
  270. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
  271. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
  272. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
  273. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
  274. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
  275. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
  276. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
  277. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
  278. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
  279. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
  280. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
  281. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
  282. package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
  283. package/skills/mobile-android/references/play/engage-sdk-integration/references/clusters.md +154 -0
  284. package/skills/mobile-android/references/play/engage-sdk-integration/references/common.md +519 -0
  285. package/skills/mobile-android/references/play/engage-sdk-integration/references/patterns.md +527 -0
  286. package/skills/mobile-android/references/play/engage-sdk-integration/references/requests.md +260 -0
  287. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/food.md +509 -0
  288. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/listen.md +842 -0
  289. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/other.md +220 -0
  290. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/read.md +412 -0
  291. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/shopping.md +357 -0
  292. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/social.md +228 -0
  293. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/travel.md +923 -0
  294. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/tv.md +1226 -0
  295. package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/watch.md +1137 -0
  296. package/skills/mobile-android/references/play/engage-sdk-integration/references/troubleshooting.md +39 -0
  297. package/skills/mobile-android/references/play/play-billing-library-version-upgrade/GUIDE.md +75 -0
  298. package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
  299. package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/migration-logic.md +78 -0
  300. package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/version-checklist.md +54 -0
  301. package/skills/mobile-android/references/play/play-policy-insights/GUIDE.md +130 -0
  302. package/skills/mobile-android/references/play/play-policy-insights/resources/common_mandates.md +100 -0
  303. package/skills/mobile-android/references/play/play-policy-insights/resources/compliance_report_template.md +59 -0
  304. package/skills/mobile-android/references/play/play-policy-insights/resources/critic.md +86 -0
  305. package/skills/mobile-android/references/play/play-policy-insights/resources/goal_data_safety.md +212 -0
  306. package/skills/mobile-android/references/play/play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
  307. package/skills/mobile-android/references/play/play-policy-insights/resources/goal_user_account.md +106 -0
  308. package/skills/mobile-android/references/play/play-policy-insights/resources/policies.json +321 -0
  309. package/skills/mobile-android/references/play/play-policy-insights/resources/scanner_config.json +843 -0
  310. package/skills/mobile-android/references/play/play-policy-insights/scripts/generate_report.py +860 -0
  311. package/skills/mobile-android/references/play/play-policy-insights/scripts/orchestrator.py +1313 -0
  312. package/skills/mobile-android/references/play/play-policy-insights/scripts/play_store_scraper.py +410 -0
  313. package/skills/mobile-android/references/play/play-policy-insights/scripts/scanner.py +261 -0
  314. package/skills/mobile-android/references/play/play-policy-insights/scripts/template_engine.py +243 -0
  315. package/skills/mobile-android/references/play.md +11 -0
  316. package/skills/mobile-android/references/ui/adaptive/GUIDE.md +280 -0
  317. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
  318. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
  319. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
  320. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
  321. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
  322. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
  323. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
  324. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
  325. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
  326. package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
  327. package/skills/mobile-android/references/ui/adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  328. package/skills/mobile-android/references/ui/edge-to-edge/GUIDE.md +409 -0
  329. package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/GUIDE.md +104 -0
  330. package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
  331. 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
  332. 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
  333. 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
  334. 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
  335. package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
  336. package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
  337. package/skills/mobile-android/references/ui/navigation-3/GUIDE.md +86 -0
  338. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
  339. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
  340. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
  341. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
  342. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
  343. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
  344. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
  345. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
  346. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
  347. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
  348. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
  349. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
  350. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
  351. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
  352. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
  353. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
  354. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
  355. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
  356. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
  357. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
  358. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
  359. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
  360. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
  361. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
  362. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
  363. package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
  364. package/skills/mobile-android/references/ui/navigation-event/GUIDE.md +288 -0
  365. package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
  366. package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
  367. package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
  368. package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
  369. package/skills/mobile-android/references/ui/styles/GUIDE.md +209 -0
  370. package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
  371. package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
  372. package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
  373. package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
  374. package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/theming.md +269 -0
  375. package/skills/mobile-android/references/ui.md +14 -0
  376. package/skills/mobile-architecture/SKILL.md +52 -0
  377. package/skills/mobile-architecture/references/android.md +54 -0
  378. package/skills/{flutter-app-architecture/SKILL.md → mobile-architecture/references/flutter/app-architecture.md} +1 -8
  379. package/skills/{bloc/SKILL.md → mobile-architecture/references/flutter/bloc.md} +1 -8
  380. package/skills/{flutter-change-notifier/SKILL.md → mobile-architecture/references/flutter/change-notifier.md} +1 -8
  381. package/skills/{architecture-feature-first/SKILL.md → mobile-architecture/references/flutter/feature-first.md} +1 -8
  382. package/skills/{flutter-login-usecase/SKILL.md → mobile-architecture/references/flutter/login-use-case.md} +0 -7
  383. package/skills/{flutter-managing-state/SKILL.md → mobile-architecture/references/flutter/managing-state.md} +2 -11
  384. package/skills/{provider/SKILL.md → mobile-architecture/references/flutter/provider.md} +1 -8
  385. package/skills/{flutter-apply-architecture-best-practices/SKILL.md → mobile-architecture/references/flutter/recommended-architecture.md} +2 -11
  386. package/skills/{riverpod/SKILL.md → mobile-architecture/references/flutter/riverpod.md} +1 -8
  387. package/skills/mobile-architecture/references/flutter.md +21 -0
  388. package/skills/mobile-architecture/references/ios.md +58 -0
  389. package/skills/mobile-architecture/references/react-native.md +61 -0
  390. package/skills/mobile-code-review/SKILL.md +70 -0
  391. package/skills/mobile-code-review/references/android.md +51 -0
  392. package/skills/{code-review/SKILL.md → mobile-code-review/references/flutter/pr-review.md} +1 -8
  393. package/skills/{flutter-project-audit/SKILL.md → mobile-code-review/references/flutter/project-audit.md} +0 -7
  394. package/skills/{dart-run-static-analysis/SKILL.md → mobile-code-review/references/flutter/static-analysis.md} +2 -11
  395. package/skills/{flutter-widget-review/SKILL.md → mobile-code-review/references/flutter/widget-review.md} +0 -7
  396. package/skills/mobile-code-review/references/flutter.md +18 -0
  397. package/skills/mobile-code-review/references/ios.md +49 -0
  398. package/skills/mobile-code-review/references/react-native.md +58 -0
  399. package/skills/mobile-debug/SKILL.md +50 -0
  400. package/skills/mobile-debug/references/android/gradle-build.md +63 -0
  401. package/skills/mobile-debug/references/android.md +26 -0
  402. package/skills/mobile-debug/references/flutter/build.md +58 -0
  403. package/skills/{flutter-errors/SKILL.md → mobile-debug/references/flutter/errors.md} +1 -8
  404. package/skills/{flutter-fix-layout-issues/SKILL.md → mobile-debug/references/flutter/layout-issues.md} +2 -11
  405. package/skills/{dart-resolve-package-conflicts/SKILL.md → mobile-debug/references/flutter/package-conflicts.md} +2 -11
  406. package/skills/{dart-fix-runtime-errors/SKILL.md → mobile-debug/references/flutter/runtime-errors.md} +2 -11
  407. package/skills/mobile-debug/references/flutter.md +23 -0
  408. package/skills/mobile-debug/references/ios/cocoapods.md +57 -0
  409. package/skills/mobile-debug/references/ios/xcode-build.md +58 -0
  410. package/skills/mobile-debug/references/ios.md +23 -0
  411. package/skills/mobile-debug/references/react-native.md +43 -0
  412. package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
  413. package/skills/mobile-firebase/SKILL.md +54 -0
  414. package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
  415. package/skills/mobile-firebase/references/android/analytics.md +33 -0
  416. package/skills/mobile-firebase/references/android/app-check.md +36 -0
  417. package/skills/mobile-firebase/references/android/auth.md +44 -0
  418. package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
  419. package/skills/mobile-firebase/references/android/firestore.md +44 -0
  420. package/skills/mobile-firebase/references/android/functions.md +33 -0
  421. package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
  422. package/skills/mobile-firebase/references/android/messaging.md +41 -0
  423. package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
  424. package/skills/mobile-firebase/references/android/remote-config.md +43 -0
  425. package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
  426. package/skills/mobile-firebase/references/android/storage.md +39 -0
  427. package/skills/mobile-firebase/references/android.md +30 -0
  428. package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
  429. package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
  430. package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
  431. package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
  432. package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
  433. package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
  434. package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
  435. package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
  436. package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
  437. package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
  438. package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
  439. package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
  440. package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
  441. package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
  442. package/skills/mobile-firebase/references/flutter.md +36 -0
  443. package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
  444. package/skills/mobile-firebase/references/ios/analytics.md +33 -0
  445. package/skills/mobile-firebase/references/ios/app-check.md +36 -0
  446. package/skills/mobile-firebase/references/ios/auth.md +48 -0
  447. package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
  448. package/skills/mobile-firebase/references/ios/firestore.md +53 -0
  449. package/skills/mobile-firebase/references/ios/functions.md +35 -0
  450. package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
  451. package/skills/mobile-firebase/references/ios/messaging.md +45 -0
  452. package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
  453. package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
  454. package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
  455. package/skills/mobile-firebase/references/ios/storage.md +36 -0
  456. package/skills/mobile-firebase/references/ios.md +28 -0
  457. package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
  458. package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
  459. package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
  460. package/skills/mobile-firebase/references/react-native/auth.md +50 -0
  461. package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
  462. package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
  463. package/skills/mobile-firebase/references/react-native/functions.md +28 -0
  464. package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
  465. package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
  466. package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
  467. package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
  468. package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
  469. package/skills/mobile-firebase/references/react-native/storage.md +30 -0
  470. package/skills/mobile-firebase/references/react-native.md +29 -0
  471. package/skills/mobile-flutter/SKILL.md +30 -0
  472. package/skills/{flutter-improving-accessibility/SKILL.md → mobile-flutter/references/accessibility-i18n/accessibility.md} +2 -11
  473. package/skills/{flutter-setup-localization/SKILL.md → mobile-flutter/references/accessibility-i18n/localization.md} +2 -11
  474. package/skills/mobile-flutter/references/accessibility-i18n.md +8 -0
  475. package/skills/{dart-3-updates/SKILL.md → mobile-flutter/references/dart/dart-3.md} +1 -8
  476. package/skills/{effective-dart/SKILL.md → mobile-flutter/references/dart/effective-dart.md} +1 -8
  477. package/skills/{dart-use-pattern-matching/SKILL.md → mobile-flutter/references/dart/pattern-matching/GUIDE.md} +2 -18
  478. package/skills/mobile-flutter/references/dart.md +9 -0
  479. package/skills/{flutter-caching-data/SKILL.md → mobile-flutter/references/data/caching.md} +2 -11
  480. package/skills/{flutter-working-with-databases/SKILL.md → mobile-flutter/references/data/databases.md} +2 -11
  481. package/skills/{flutter-use-http-package/SKILL.md → mobile-flutter/references/data/http.md} +2 -11
  482. package/skills/{flutter-implement-json-serialization/SKILL.md → mobile-flutter/references/data/json-serialization.md} +2 -11
  483. package/skills/mobile-flutter/references/data.md +10 -0
  484. package/skills/{flutter-interoperating-with-native-apis/SKILL.md → mobile-flutter/references/native/native-apis.md} +2 -11
  485. package/skills/{flutter-embedding-native-views/SKILL.md → mobile-flutter/references/native/native-views.md} +2 -11
  486. package/skills/{flutter-building-plugins/SKILL.md → mobile-flutter/references/native/plugins.md} +2 -11
  487. package/skills/mobile-flutter/references/native.md +9 -0
  488. package/skills/{flutter-reducing-app-size/SKILL.md → mobile-flutter/references/performance/app-size.md} +2 -11
  489. package/skills/{flutter-handling-concurrency/SKILL.md → mobile-flutter/references/performance/concurrency.md} +2 -11
  490. package/skills/mobile-flutter/references/performance.md +8 -0
  491. package/skills/{flutter-setting-up-on-macos/SKILL.md → mobile-flutter/references/setup/macos.md} +2 -11
  492. package/skills/mobile-flutter/references/setup.md +7 -0
  493. package/skills/{flutter-animating-apps/SKILL.md → mobile-flutter/references/ui/animations.md} +2 -11
  494. package/skills/{flutter-building-forms/SKILL.md → mobile-flutter/references/ui/forms.md} +2 -11
  495. package/skills/{flutter-adding-home-screen-widgets/SKILL.md → mobile-flutter/references/ui/home-screen-widgets.md} +2 -11
  496. package/skills/{flutter-building-layouts/SKILL.md → mobile-flutter/references/ui/layouts.md} +2 -11
  497. package/skills/{flutter-build-responsive-layout/SKILL.md → mobile-flutter/references/ui/responsive-layout.md} +2 -11
  498. package/skills/{flutter-setup-declarative-routing/SKILL.md → mobile-flutter/references/ui/routing.md} +2 -11
  499. package/skills/{flutter-theming-apps/SKILL.md → mobile-flutter/references/ui/theming.md} +2 -11
  500. package/skills/{flutter-add-widget-preview/SKILL.md → mobile-flutter/references/ui/widget-previews.md} +2 -11
  501. package/skills/mobile-flutter/references/ui.md +14 -0
  502. package/skills/mobile-ios/SKILL.md +25 -0
  503. package/skills/mobile-ios/references/data-networking.md +70 -0
  504. package/skills/mobile-ios/references/performance-release.md +37 -0
  505. package/skills/mobile-ios/references/platform-features.md +52 -0
  506. package/skills/mobile-ios/references/ui-navigation.md +64 -0
  507. package/skills/mobile-rn/SKILL.md +26 -0
  508. package/skills/mobile-rn/references/data-networking.md +59 -0
  509. package/skills/mobile-rn/references/performance-release.md +46 -0
  510. package/skills/mobile-rn/references/platform-features.md +40 -0
  511. package/skills/mobile-rn/references/ui-navigation.md +62 -0
  512. package/skills/mobile-security/SKILL.md +82 -0
  513. package/skills/mobile-security/references/android/intent-security.md +523 -0
  514. package/skills/mobile-security/references/android.md +37 -0
  515. package/skills/{flutter-secure-token-store/SKILL.md → mobile-security/references/flutter/secure-token-store.md} +1 -8
  516. package/skills/mobile-security/references/flutter.md +30 -0
  517. package/skills/mobile-security/references/ios.md +27 -0
  518. package/skills/mobile-security/references/react-native.md +29 -0
  519. package/skills/mobile-test/SKILL.md +63 -0
  520. package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
  521. package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
  522. package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
  523. package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
  524. package/skills/mobile-test/references/android.md +83 -0
  525. package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
  526. package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
  527. package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
  528. package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
  529. package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
  530. package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
  531. package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
  532. package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
  533. package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
  534. package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
  535. package/skills/mobile-test/references/flutter.md +44 -0
  536. package/skills/mobile-test/references/ios.md +79 -0
  537. package/skills/mobile-test/references/react-native.md +62 -0
  538. package/skills/mobile-security-audit/SKILL.md +0 -101
  539. /package/skills/{dart-use-pattern-matching → mobile-flutter/references/dart/pattern-matching}/examples/json_patterns.dart +0 -0
@@ -0,0 +1,707 @@
1
+ > Adapted from the `leanback-to-compose-tv-migration` skill in [android/skills](https://github.com/android/skills) (Apache-2.0). See `THIRD_PARTY_NOTICES.md`.
2
+
3
+ ## The 10-foot UI
4
+
5
+ A "10-foot UI" is a design paradigm for televisions that tailors an interface
6
+ for viewing from approximately 3 meters (10 feet) away. When designing for this
7
+ experience, account for these key characteristics:
8
+
9
+ - **Viewing distance**: Viewers are sitting far from the screen, "leaning back". Screen layouts are uncluttered, with text and UI elements that are large enough to be comfortably readable from a distance, without dense blocks of text.
10
+ - **Color contrast**: To avoid washed out colors on TV displays with low contrast ratios, the design uses high-contrast palettes and distinct visual indicators so focused states remain visible across different TV panels.
11
+ - **D-pad navigation** : Interaction relies on a directional remote control with limited 4-way navigation (`Up`, `Down`, `Left`, `Right`) with components organized into clear spatial grids and carousels without focus traps.
12
+
13
+ ## Core architecture and library selection
14
+
15
+ When migrating an Android TV application to Jetpack Compose, you must use
16
+ `androidx.tv` libraries and follow these 10-foot UI patterns:
17
+
18
+ - **UI modernization**: Focus on custom, cinematic layouts over legacy direct 1:1 templates. You must use Jetpack Compose for TV features like dynamic gradient hero backdrops, custom focus animations, custom navigation drawers, and custom layouts.
19
+ - **Primary design system** : You must always use `androidx.tv.material3.*` (`androidx.tv:tv-material`) over mobile `androidx.compose.material3.*`. TV Material 3 provides built-in D-Pad focus handling, focus zoom scaling, and TV-optimized typography and shapes. To set up Compose for TV dependencies, follow [Compose for TV setup](references/android/training/tv/playback/compose/index.md).
20
+ - **Focus zoom animation** : For interactive cards, you must use `CompactCard`, `ClassicCard`, or `WideCardContainer` with `scale =
21
+ CardDefaults.scale(focusedScale = 1.1f)` to provide standard TV focus animation.
22
+ - **Coil image loading** : To use declarative `AsyncImage(model,
23
+ contentDescription, ...)` without passing an explicit `ImageLoader` parameter, you must include `io.coil-kt:coil-compose` in your Gradle dependencies.
24
+ - **Explicit imports** : You must always import TV Material 3 classes explicitly (for example, `import androidx.tv.material3.Surface`, `import
25
+ androidx.tv.material3.ListItem`) instead of using wildcard imports (`import
26
+ androidx.tv.material3.*`).
27
+ - **File naming conventions** : You must name Composable screen files after the screen (for example, name `BrowseScreen` as `BrowseScreen.kt`, `PlaybackScreen` as `PlaybackScreen.kt`, and `AuthenticationScreen` as `AuthenticationScreen.kt`). Don't use generic prefixes like `Main`.
28
+ - **Overscan and bezels** : You must apply horizontal padding (for example, `horizontal = 48.dp` or `32.dp`, `vertical = 24.dp`) to root containers, carousels, and top bars to prevent clipping.
29
+ - **Reading width constrainment** : You must constrain reading width using `Modifier.widthIn(max = 600.dp)` on text columns for long-form text.
30
+ - **Media3 Compose dependencies** : Include `androidx.media3:media3-ui-compose` in `app/build.gradle` when modernizing media playback screens.
31
+ - **Prohibition of legacy AndroidView wrappers** : Don't use legacy `AndroidView` wrappers to embed View-based components into Jetpack Compose screens. All migrated screens must use Compose components or Media3 Compose surfaces (`PlayerSurface`).
32
+
33
+ ## D-pad focus handling and navigation
34
+
35
+ Jetpack Compose for TV (`androidx.tv.material3`) requires explicit focus
36
+ management, as components don't receive initial focus automatically and
37
+ navigation uses 2D spatial coordinates. To configure TV D-pad navigation, follow
38
+ instructions in [TV Navigation guide](references/android/training/tv/get-started/navigation.md).
39
+
40
+ ### Initial focus
41
+
42
+ You must assign initial focus to the primary interactive element on every screen
43
+ (such as the first action button, card, or `ListItem`) using `FocusRequester`
44
+ when entering a screen. Define `val focusRequester = remember { FocusRequester()
45
+ }`, attach `Modifier.focusRequester(focusRequester)` to the primary element, and
46
+ request focus inside `LaunchedEffect(Unit) { focusRequester.requestFocus() }`:
47
+
48
+
49
+ ```kotlin
50
+ val focusRequester = remember { FocusRequester() }
51
+ val focusManager = LocalFocusManager.current
52
+
53
+ LaunchedEffect(Unit) {
54
+ focusRequester.requestFocus()
55
+ }
56
+ ```
57
+
58
+ <br />
59
+
60
+ *Note: For screens with dynamic state or pagers (like `OnboardingScreen` using
61
+ `HorizontalPager`), you must pass the state key to `LaunchedEffect` (for example
62
+ `LaunchedEffect(pagerState.currentPage)`) so that focus is re-applied when the
63
+ page changes.*
64
+
65
+ ### Bidirectional focus routing and avoiding focus traps
66
+
67
+ When interactive elements sit on opposite sides of the display, standard 2D
68
+ spatial navigation fails to find targets across them. This creates focus traps
69
+ where users are unable to navigate out of an area using the D-pad.
70
+
71
+ For symmetrical, bidirectional D-pad navigation without focus traps, you must
72
+ rely on Compose's 2D spatial focus engine whenever possible. When connecting
73
+ adjacent UI elements across scrollable containers (like `LazyColumn` or
74
+ `LazyRow`), don't set directional overrides (`up = ...`, `down = ...`) targeting
75
+ individual items inside lazy lists. When an item scrolls off-screen during
76
+ vertical navigation, its `FocusRequester` becomes uninitialized, throwing
77
+ `IllegalStateException` during focus searches:
78
+
79
+
80
+ ```kotlin
81
+ Row(
82
+ modifier = Modifier
83
+ .fillMaxWidth()
84
+ .padding(horizontal = 48.dp, vertical = 16.dp),
85
+ horizontalArrangement = Arrangement.End
86
+ ) {
87
+ Button(
88
+ onClick = { /* Search */ },
89
+ modifier = Modifier.focusRequester(topBarFocusRequester)
90
+ ) { Text("Search") }
91
+ }
92
+ ```
93
+
94
+ <br />
95
+
96
+ ### Row focus recollection (`Modifier.focusRestorer`)
97
+
98
+ When navigating vertically between horizontal carousels (`LazyRow`), Compose's
99
+ default 2D spatial focus engine searches along the X coordinate of the focused
100
+ item. If a user scrolls right in Row 1 (for example to Item 4 at X=800dp) and
101
+ presses DOWN to navigate to Row 2, spatial routing focuses whatever item sits at
102
+ X=800dp in Row 2.
103
+
104
+ To make every row maintain its own recollection of card focus (restoring focus
105
+ to the previously visited item when revisited), you must attach
106
+ **`Modifier.focusRestorer`** (with no arguments) directly to the `LazyRow`.
107
+ Don't pass custom fallback `FocusRequester` lambdas in lazy containers, as
108
+ calling `requestFocus` on an unattached or off-screen item during rapid D-pad
109
+ scrolling throws `IllegalStateException`.
110
+
111
+
112
+ ```kotlin
113
+ LazyRow(
114
+ modifier = Modifier.focusRestorer(),
115
+ contentPadding = PaddingValues(horizontal = 48.dp),
116
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
117
+ ) {
118
+ itemsIndexed(videos) { vidIndex, video ->
119
+ CompactCard(
120
+ onClick = { onVideoClick(video) },
121
+ image = {
122
+ AsyncImage(
123
+ model = video.cardImageUrl,
124
+ contentDescription = video.title,
125
+ contentScale = ContentScale.Crop,
126
+ modifier = Modifier.fillMaxSize()
127
+ )
128
+ },
129
+ title = { Text(video.title) },
130
+ modifier = Modifier
131
+ .then(
132
+ if (catIndex == 0 && vidIndex == 0) {
133
+ Modifier.focusRequester(firstCardFocusRequester)
134
+ } else {
135
+ Modifier
136
+ }
137
+ )
138
+ .onFocusChanged { focusState ->
139
+ if (focusState.isFocused) {
140
+ focusedVideo = video
141
+ focusedCategoryIndex = catIndex
142
+ }
143
+ }
144
+ )
145
+ }
146
+ }
147
+ ```
148
+
149
+ <br />
150
+
151
+ ### Text input, hardware keyboard enter interception, and IME focus chaining
152
+
153
+ When migrating search bars or login forms from Leanback
154
+ (`SearchSupportFragment`, `GuidedStepSupportFragment`), don't use bare
155
+ `BasicTextField` containers or empty `Surface(onClick = {})` wrappers, as they
156
+ prevent D-pad CENTER from attaching the virtual keyboard (IME).
157
+
158
+ 1. **Clickable TV surface wrapper with Back-key interception
159
+ (`onPreviewKeyEvent`)** : Wrap standard M3 `TextField` inside a focusable TV `Surface(onClick = { focusRequester.requestFocus() }, scale =
160
+ ClickableSurfaceDefaults.scale(focusedScale = 1.01f), border =
161
+ ClickableSurfaceDefaults.border(focusedBorder = Border(BorderStroke(2.dp,
162
+ Color.White))))` to provide a focused border outline and D-pad focus scaling. You must attach `Modifier.onPreviewKeyEvent` on the text field or wrapper to intercept `Key.Back` and `Key.Escape` so the user's able to remove focus from the input field without exiting the screen.
163
+ 2. **Why Back-key interception is mandatory** : When editing a text field on Android TV, pressing the D-pad **Back** button normally navigates back and exits the screen. By intercepting `Key.Back` and `Key.Escape` on `KeyUp` in `onPreviewKeyEvent` to stop editing (clearing focus), the user's able to return to D-pad form navigation without being trapped in the text field or accidentally exiting the screen.
164
+ 3. **IME focus chaining** : For multi-field forms (such as Username and Password in authentication screens), attach `KeyboardActions(onNext = {
165
+ focusManager.moveFocus(FocusDirection.Down) })` with `ImeAction.Next` on top fields to route focus down to the next input box, and `ImeAction.Done` on the bottom field to route focus directly to the submit button:
166
+
167
+
168
+ ```kotlin
169
+ Surface(
170
+ onClick = { focusRequester.requestFocus() },
171
+ border = ClickableSurfaceDefaults.border(focusedBorder = Border(border = BorderStroke(2.dp, Color.White))),
172
+ modifier = Modifier
173
+ .fillMaxWidth()
174
+ .focusRequester(focusRequester)
175
+ ) {
176
+ OutlinedTextField(
177
+ value = username,
178
+ onValueChange = { username = it },
179
+ label = { Text("Username") },
180
+ singleLine = true,
181
+ keyboardOptions = KeyboardOptions(imeAction = ImeAction.Next),
182
+ keyboardActions = KeyboardActions(onNext = { focusManager.moveFocus(FocusDirection.Down) }),
183
+ modifier = Modifier
184
+ .fillMaxWidth()
185
+ .onPreviewKeyEvent { event ->
186
+ if (event.type == KeyEventType.KeyDown && (event.key == Key.Enter || event.key == Key.NumPadEnter)) {
187
+ focusManager.moveFocus(FocusDirection.Down)
188
+ true
189
+ } else false
190
+ }
191
+ )
192
+ }
193
+
194
+ Surface(
195
+ onClick = {},
196
+ border = ClickableSurfaceDefaults.border(focusedBorder = Border(border = BorderStroke(2.dp, Color.White))),
197
+ modifier = Modifier.fillMaxWidth()
198
+ ) {
199
+ OutlinedTextField(
200
+ value = password,
201
+ onValueChange = { password = it },
202
+ label = { Text("Password") },
203
+ singleLine = true,
204
+ visualTransformation = PasswordVisualTransformation(),
205
+ keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
206
+ keyboardActions = KeyboardActions(onDone = { onLoginSuccess() }),
207
+ modifier = Modifier
208
+ .fillMaxWidth()
209
+ .onPreviewKeyEvent { event ->
210
+ if (event.type == KeyEventType.KeyDown && (event.key == Key.Enter || event.key == Key.NumPadEnter)) {
211
+ onLoginSuccess()
212
+ true
213
+ } else false
214
+ }
215
+ )
216
+ }
217
+ ```
218
+
219
+ <br />
220
+
221
+ ## Lazy containers
222
+
223
+ When implementing scrollable lists or grids in Jetpack Compose for TV, you must
224
+ use standard `LazyColumn`, `LazyRow`, and `LazyVerticalGrid` from
225
+ `androidx.compose.foundation.lazy` and `androidx.compose.foundation.lazy.grid`.
226
+ For catalog browsing layouts, follow instructions in [Catalog Browser guide](references/android/training/tv/playback/compose/browse.md).
227
+
228
+ 1. **Pivot scrolling with `BringIntoViewSpec`** : When defining a custom pivot scroll line for catalog rows using `BringIntoViewSpec` and `CompositionLocalProvider(LocalBringIntoViewSpec provides ...)`, you must ensure your project compiles against Compose Foundation 1.7.0+ by adding `implementation platform('androidx.compose:compose-bom:2024.06.00')` (or newer) or `implementation 'androidx.compose.foundation:foundation:1.7.0'` in `app/build.gradle`. Without Compose Foundation 1.7.0+, `import
229
+ androidx.compose.foundation.gestures.LocalBringIntoViewSpec` will fail with `Unresolved reference: LocalBringIntoViewSpec`.
230
+ 2. **Row focus recollection (`Modifier.focusRestorer`)** : Annotate your composable with `@OptIn(ExperimentalFocusRestorerApi::class,
231
+ ExperimentalComposeUiApi::class)` and attach `Modifier.focusRestorer` on every category `LazyRow` to remember and restore the last focused card when navigating vertically across catalog rows.
232
+
233
+ When populated with focusable TV Material 3 components (`CompactCard`,
234
+ `ListItem`, `Button`), standard Compose lazy containers handle 2D D-Pad focus
235
+ routing, focus memory, and edge scrolling automatically:
236
+
237
+
238
+ ```kotlin
239
+ @Composable
240
+ fun CatalogBrowser(
241
+ featuredContentList: List<Movie>,
242
+ sectionList: List<Section>,
243
+ modifier: Modifier = Modifier,
244
+ onItemSelected: (Movie) -> Unit = {},
245
+ ) {
246
+ LazyColumn(
247
+ modifier = modifier.fillMaxSize(),
248
+ verticalArrangement = Arrangement.spacedBy(16.dp)
249
+ ) {
250
+ items(sectionList.size) { index ->
251
+ val section = sectionList[index]
252
+ SectionRow(section, onItemSelected = onItemSelected)
253
+ }
254
+ }
255
+ }
256
+ ```
257
+
258
+ <br />
259
+
260
+ ## Media3 video playback and transport controls
261
+
262
+ When migrating legacy Leanback video playback (`VideoSupportFragment` /
263
+ `PlaybackGlue`), use Compose Media3 `PlayerSurface`
264
+ (`androidx.media3.ui.compose.PlayerSurface`) combined with a translucent
265
+ transport controls overlay:
266
+
267
+ 1. **Mandatory Media3 transport control buttons (`PlayPauseButton`)** : Over the `PlayerSurface`, you must layer a translucent bottom controls bar (`Box(modifier = Modifier.align(Alignment.BottomCenter))`) containing explicit Media3 UI Compose buttons: at minimum `PlayPauseButton`, `SeekBackButton`, and `SeekForwardButton`. Never leave the transport controls overlay empty. To use these composables, you must add `implementation 'androidx.media3:media3-ui-compose-material3:1.6.0'` alongside `androidx.media3:media3-ui-compose` in your `app/build.gradle` dependencies.
268
+ 2. **D-pad directional seeking (`onPreviewKeyEvent`)** : To support seeking backward and forward with the remote control D-pad, attach `Modifier.onPreviewKeyEvent` on the container or controls overlay and intercept Compose `Key.DirectionLeft` and `Key.DirectionRight` (for example, `keyEvent.key == Key.DirectionLeft`) to seek backward and forward by 10 seconds (`exoPlayer.seekTo(exoPlayer.currentPosition - 10000)`). Never use legacy Android View keycodes (`KeyEvent.KEYCODE_DPAD_LEFT` or `nativeKeyEvent.keyCode`).
269
+ 3. **Prohibition of legacy AndroidView wrappers** : Don't wrap legacy `PlayerView` or `StyledPlayerView` in `AndroidView { ... }`. You must use `PlayerSurface` (`androidx.media3.ui.compose.PlayerSurface`) with `ExoPlayer` for video rendering in Compose for TV.
270
+
271
+ ## Phased migration strategy
272
+
273
+ To migrate an app cleanly without breaking compilation or introducing circular
274
+ dependencies, execute in five distinct phases:
275
+
276
+ - **Phase 1**: Foundation and design system
277
+ - **Phase 2**: Leaf and standalone screens
278
+ - **Phase 3**: Core browsing and discovery screens
279
+ - **Phase 4**: Details and media playback
280
+ - **Phase 5**: Final unification and cleanup
281
+
282
+ ### Phase 1: Foundation and design system
283
+
284
+ - Create `TvTheme.kt` wrapping `TvMaterialTheme` with custom `ColorScheme`, `Typography`, and `Shapes`.
285
+ - Build atomic reusable components: `MovieCard`, `SectionHeader`, `LoadingIndicator`, `ErrorState`.
286
+
287
+ ### Phase 2: Leaf and standalone screens
288
+
289
+ - Migrate screens with no outbound navigation first, such as error messages, onboarding screens, or settings screens, by replacing them with `ErrorDialog`, `OnboardingScreen`, and `SettingsScreen`.
290
+ - Replace anything using `BaseLeanbackPreferenceFragmentCompat`, `BaseLeanbackPreferenceFragment`, or `LeanbackSettingsFragment` to use Compose, for example by using `ListItem` + `Switch` bound directly to `SharedPreferences` and replacing the `findPreference` implementation.
291
+ - Ensure screens receive initial D-pad focus on the first or main component of that screen using `FocusRequester`, for example on the first `ListItem`.
292
+ - Replace legacy `Fragment` classes with activities of type `ComponentActivity` that declaratively use components in Compose.
293
+ - Clean up legacy style and theme references in `res/values/styles.xml` and `res/values/themes.xml` (such as removing `preferenceTheme` that points to `@style/PreferenceThemeOverlay.v14.Leanback`) that aren't supported once leanback dependencies are removed:
294
+
295
+
296
+ ```kotlin
297
+ @Composable
298
+ fun TvSettingsScreen(
299
+ modifier: Modifier = Modifier
300
+ ) {
301
+ var autoPlayNext by remember { mutableStateOf(true) }
302
+ var highQualityAudio by remember { mutableStateOf(false) }
303
+
304
+ Column(
305
+ modifier = modifier
306
+ .fillMaxSize()
307
+ .padding(48.dp)
308
+ ) {
309
+ Text(
310
+ text = "Settings",
311
+ style = MaterialTheme.typography.headlineMedium,
312
+ modifier = Modifier.padding(bottom = 24.dp)
313
+ )
314
+
315
+ LazyColumn(
316
+ verticalArrangement = Arrangement.spacedBy(12.dp),
317
+ contentPadding = PaddingValues(vertical = 8.dp)
318
+ ) {
319
+ item {
320
+ ListItem(
321
+ selected = false,
322
+ onClick = { autoPlayNext = !autoPlayNext },
323
+ headlineContent = { Text("Autoplay Next Video") },
324
+ supportingContent = { Text("Automatically start playing next item in queue") },
325
+ trailingContent = {
326
+ Switch(
327
+ checked = autoPlayNext,
328
+ onCheckedChange = null
329
+ )
330
+ }
331
+ )
332
+ }
333
+
334
+ item {
335
+ ListItem(
336
+ selected = false,
337
+ onClick = { highQualityAudio = !highQualityAudio },
338
+ headlineContent = { Text("High Quality Audio") },
339
+ supportingContent = { Text("Use spatial audio and multi-channel output when available") },
340
+ trailingContent = {
341
+ Switch(
342
+ checked = highQualityAudio,
343
+ onCheckedChange = null
344
+ )
345
+ }
346
+ )
347
+ }
348
+ }
349
+ }
350
+ }
351
+ ```
352
+
353
+ <br />
354
+
355
+ ### Phase 3: Core browsing and discovery screens
356
+
357
+ - Migrate `VerticalGridScreen` (`LazyVerticalGrid`), `SearchScreen` (`BasicTextField` with live list filtering), and `BrowseScreen` (`LazyColumn` of `LazyRow`s).
358
+ - Eradicate legacy `ArrayObjectAdapter`, `ListRowPresenter`, `CardPresenter`, and `HeaderItem` classes.
359
+
360
+ ### Phase 4: Details and media playback
361
+
362
+ - Migrate `VideoDetailsScreen` and `GuidedStepScreen`.
363
+ - Migrate `PlaybackScreen` using Compose Media3 `PlayerSurface` (`androidx.media3.ui.compose.PlayerSurface`) paired with a translucent bottom overlay containing Media3 Compose transport controls (such as `PlayPauseButton`, `SeekBackButton`, `SeekForwardButton`).
364
+
365
+ ### Phase 5: Final unification and cleanup
366
+
367
+ - Remove all remaining legacy `.java` activities, fragments, presenters, and XML layout files.
368
+ - Ensure all activities extend `ComponentActivity` or `FragmentActivity` calling `setContent { ... }`.
369
+ - Completely remove legacy Leanback themes and style declarations from `res/values/styles.xml` and `res/values/themes.xml` (for example, any styles inheriting from `Theme.Leanback` or referencing `lb_` styles).
370
+
371
+ ## Component and class mapping guide
372
+
373
+ | Legacy Leanback / View Class | Modern Jetpack Compose Equivalent |
374
+ |---|---|
375
+ | `BrowseSupportFragment` / `MainFragment` | `BrowseScreen` (`LazyColumn` containing categorized `LazyRow`s + Hero Banner) |
376
+ | `DetailsSupportFragment` | `VideoDetailsScreen` (Poster image, text column, action buttons, related `LazyRow`) |
377
+ | `VideoSupportFragment` / `PlaybackGlue` | `PlaybackScreen` (Media3 `ExoPlayer` + Compose `PlayerSurface`) |
378
+ | `GuidedStepSupportFragment` | `GuidedStepScreen` (Split-screen layout: 40% left guidance pane, 60% right actions pane) |
379
+ | `SearchSupportFragment` | `SearchScreen` (`BasicTextField` + live filtering + `LazyVerticalGrid`) |
380
+ | `VerticalGridSupportFragment` | `VerticalGridScreen` (`LazyVerticalGrid(columns = GridCells.Fixed(5))`) |
381
+ | `ArrayObjectAdapter` / `Presenter` | Declarative `@Composable` functions observing immutable `State<List<T>>` |
382
+ | `CursorMapper` / `LoaderManager` / `CursorLoader` | Kotlin Coroutines / `withContext(Dispatchers.IO)` in a Repository object |
383
+ | `OnboardingSupportFragment` | `OnboardingScreen` (`HorizontalPager` + D-Pad navigation buttons) |
384
+ | `LeanbackSettingsFragment` / `PreferenceFragment` | `SettingsScreen` (`FocusRequester` on first `ListItem` + trailing `Switch` bound to `SharedPreferences`) |
385
+
386
+ ## Reference implementations and battle-tested patterns
387
+
388
+ ### Modern TV immersive list architecture (`BrowseScreen`)
389
+
390
+ When building a 10-foot TV browse screen or Immersive List, don't place a hero
391
+ banner before or outside a scrolling list, and don't fight Compose's automatic
392
+ `BringIntoView` system with programmatic `animateScrollToItem` calls.
393
+
394
+ Instead, use `BringIntoViewSpec` with `LocalBringIntoViewSpec` from Compose
395
+ Foundation to define exact TV pivot scrolling (for example, pivoting active rows
396
+ at 35% from the top edge of the display). Combine this with a reshaping
397
+ immersive row: when lower rows are focused (`focusedCategoryIndex > 0`), hide
398
+ the hero text and display a normal section header on Row 0:
399
+
400
+
401
+ ```kotlin
402
+ @Composable
403
+ fun ImmersiveBrowseScreen(
404
+ categories: Map<String, List<Video>>,
405
+ onVideoClick: (Video) -> Unit
406
+ ) {
407
+ var focusedVideo by remember { mutableStateOf<Video?>(null) }
408
+ var focusedCategoryIndex by remember { mutableStateOf(0) }
409
+ val listState = rememberLazyListState()
410
+ val topBarFocusRequester = remember { FocusRequester() }
411
+ val firstCardFocusRequester = remember { FocusRequester() }
412
+
413
+ Box(modifier = Modifier.fillMaxSize()) {
414
+ AsyncImage(
415
+ model = focusedVideo?.bgImageUrl,
416
+ contentDescription = null,
417
+ contentScale = ContentScale.Crop,
418
+ modifier = Modifier.fillMaxSize()
419
+ )
420
+
421
+ PositionFocusedItemInLazyLayout(parentFraction = 0.35f, childFraction = 0.5f) {
422
+ LazyColumn(
423
+ state = listState,
424
+ contentPadding = PaddingValues(top = 36.dp, bottom = 64.dp),
425
+ verticalArrangement = Arrangement.spacedBy(28.dp),
426
+ modifier = Modifier.fillMaxSize()
427
+ ) {
428
+ item {
429
+ Row(
430
+ modifier = Modifier
431
+ .fillMaxWidth()
432
+ .padding(horizontal = 48.dp, vertical = 16.dp),
433
+ horizontalArrangement = Arrangement.End
434
+ ) {
435
+ Button(
436
+ onClick = { /* Search */ },
437
+ modifier = Modifier.focusRequester(topBarFocusRequester)
438
+ ) { Text("Search") }
439
+ }
440
+ }
441
+
442
+ itemsIndexed(categories.entries.toList()) { catIndex, (categoryName, videos) ->
443
+ Column {
444
+ if (catIndex == 0 && focusedCategoryIndex == 0) {
445
+ Column(
446
+ modifier = Modifier
447
+ .heightIn(min = 200.dp)
448
+ .padding(horizontal = 48.dp)
449
+ ) {
450
+ Text(
451
+ text = focusedVideo?.title ?: "",
452
+ style = MaterialTheme.typography.displayMedium
453
+ )
454
+ Text(
455
+ text = focusedVideo?.description ?: "",
456
+ style = MaterialTheme.typography.bodyLarge
457
+ )
458
+ }
459
+ } else {
460
+ Text(
461
+ text = categoryName,
462
+ style = MaterialTheme.typography.titleMedium,
463
+ modifier = Modifier.padding(horizontal = 48.dp, vertical = 8.dp)
464
+ )
465
+ }
466
+
467
+ LazyRow(
468
+ modifier = Modifier.focusRestorer(),
469
+ contentPadding = PaddingValues(horizontal = 48.dp),
470
+ horizontalArrangement = Arrangement.spacedBy(16.dp)
471
+ ) {
472
+ itemsIndexed(videos) { vidIndex, video ->
473
+ CompactCard(
474
+ onClick = { onVideoClick(video) },
475
+ image = {
476
+ AsyncImage(
477
+ model = video.cardImageUrl,
478
+ contentDescription = video.title,
479
+ contentScale = ContentScale.Crop,
480
+ modifier = Modifier.fillMaxSize()
481
+ )
482
+ },
483
+ title = { Text(video.title) },
484
+ modifier = Modifier
485
+ .then(
486
+ if (catIndex == 0 && vidIndex == 0) {
487
+ Modifier.focusRequester(firstCardFocusRequester)
488
+ } else {
489
+ Modifier
490
+ }
491
+ )
492
+ .onFocusChanged { focusState ->
493
+ if (focusState.isFocused) {
494
+ focusedVideo = video
495
+ focusedCategoryIndex = catIndex
496
+ }
497
+ }
498
+ )
499
+ }
500
+ }
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+ }
507
+
508
+ @OptIn(ExperimentalFoundationApi::class)
509
+ @Composable
510
+ private fun PositionFocusedItemInLazyLayout(
511
+ parentFraction: Float = 0.35f,
512
+ childFraction: Float = 0.5f,
513
+ content: @Composable () -> Unit,
514
+ ) {
515
+ val bringIntoViewSpec = remember(parentFraction, childFraction) {
516
+ object : BringIntoViewSpec {
517
+ override fun calculateScrollDistance(
518
+ offset: Float,
519
+ size: Float,
520
+ containerSize: Float
521
+ ): Float {
522
+ if (offset >= 0f && offset <= containerSize * 0.45f) {
523
+ return 0f
524
+ }
525
+ val initialTargetForLeadingEdge = parentFraction * containerSize - (childFraction * size)
526
+ val targetForLeadingEdge = if (size <= containerSize && (containerSize - initialTargetForLeadingEdge) < size) {
527
+ containerSize - size
528
+ } else {
529
+ initialTargetForLeadingEdge
530
+ }
531
+ return offset - targetForLeadingEdge
532
+ }
533
+ }
534
+ }
535
+ CompositionLocalProvider(LocalBringIntoViewSpec provides bringIntoViewSpec, content = content)
536
+ }
537
+ ```
538
+
539
+ <br />
540
+
541
+ ### Media3 playback in Compose TV (`PlaybackScreen`)
542
+
543
+ Implement a custom playback screen using
544
+ `androidx.media3.ui.compose.PlayerSurface` as the video rendering canvas. Layer
545
+ Material3 transport controls (`SeekBackButton`, `PlayPauseButton`,
546
+ `SeekForwardButton` from `androidx.media3:media3-ui-compose-material3`) over the
547
+ surface in a translucent bottom overlay, and handle D-pad remote key events with
548
+ an auto-hide timeout:
549
+
550
+
551
+ ```kotlin
552
+ @OptIn(UnstableApi::class)
553
+ @Composable
554
+ fun Media3PlaybackScreen(
555
+ video: Video,
556
+ onFinish: () -> Unit,
557
+ modifier: Modifier = Modifier
558
+ ) {
559
+ val context = LocalContext.current
560
+ val exoPlayer = remember(context) { ExoPlayer.Builder(context).build() }
561
+ var showControls by remember { mutableStateOf(true) }
562
+ val focusRequester = remember { FocusRequester() }
563
+ val coroutineScope = rememberCoroutineScope()
564
+ var autoHideJob by remember { mutableStateOf<Job?>(null) }
565
+
566
+ fun scheduleAutoHide() {
567
+ autoHideJob?.cancel()
568
+ autoHideJob = coroutineScope.launch {
569
+ delay(5000)
570
+ showControls = false
571
+ }
572
+ }
573
+
574
+ DisposableEffect(exoPlayer) {
575
+ val listener = object : Player.Listener {
576
+ override fun onPlaybackStateChanged(playbackState: Int) {
577
+ if (playbackState == Player.STATE_ENDED) {
578
+ onFinish()
579
+ }
580
+ }
581
+ }
582
+ exoPlayer.addListener(listener)
583
+ onDispose {
584
+ autoHideJob?.cancel()
585
+ exoPlayer.removeListener(listener)
586
+ exoPlayer.release()
587
+ }
588
+ }
589
+
590
+ LaunchedEffect(video) {
591
+ focusRequester.requestFocus()
592
+ scheduleAutoHide()
593
+
594
+ val mediaItem = MediaItem.fromUri(video.videoUrl)
595
+ exoPlayer.setMediaItem(mediaItem)
596
+ exoPlayer.prepare()
597
+ exoPlayer.playWhenReady = true
598
+ }
599
+
600
+ Box(
601
+ modifier = modifier
602
+ .fillMaxSize()
603
+ .background(Color.Black)
604
+ .focusRequester(focusRequester)
605
+ .focusable()
606
+ .onPreviewKeyEvent { event ->
607
+ if (event.type == KeyEventType.KeyDown) {
608
+ when (event.key) {
609
+ Key.DirectionCenter, Key.Enter, Key.NumPadEnter, Key.MediaPlayPause, Key.Spacebar -> {
610
+ if (exoPlayer.isPlaying) exoPlayer.pause() else exoPlayer.play()
611
+ showControls = true
612
+ scheduleAutoHide()
613
+ true
614
+ }
615
+ Key.DirectionLeft, Key.MediaRewind -> {
616
+ val newPos = (exoPlayer.currentPosition - 10_000L).coerceAtLeast(0L)
617
+ exoPlayer.seekTo(newPos)
618
+ showControls = true
619
+ scheduleAutoHide()
620
+ true
621
+ }
622
+ Key.DirectionRight, Key.MediaFastForward -> {
623
+ val duration = exoPlayer.duration.coerceAtLeast(0L)
624
+ val newPos = (exoPlayer.currentPosition + 10_000L).coerceAtMost(duration)
625
+ exoPlayer.seekTo(newPos)
626
+ showControls = true
627
+ scheduleAutoHide()
628
+ true
629
+ }
630
+ Key.DirectionUp, Key.DirectionDown -> {
631
+ showControls = !showControls
632
+ if (showControls) scheduleAutoHide() else autoHideJob?.cancel()
633
+ true
634
+ }
635
+ else -> false
636
+ }
637
+ } else false
638
+ },
639
+ contentAlignment = Alignment.Center
640
+ ) {
641
+ PlayerSurface(
642
+ player = exoPlayer,
643
+ modifier = Modifier.fillMaxSize()
644
+ )
645
+
646
+ if (showControls) {
647
+ Box(
648
+ modifier = Modifier
649
+ .fillMaxSize()
650
+ .background(Color(0x80000000))
651
+ .padding(48.dp),
652
+ contentAlignment = Alignment.BottomCenter
653
+ ) {
654
+ Row(
655
+ horizontalArrangement = Arrangement.spacedBy(24.dp),
656
+ verticalAlignment = Alignment.CenterVertically
657
+ ) {
658
+ SeekBackButton(player = exoPlayer)
659
+ PlayPauseButton(player = exoPlayer)
660
+ SeekForwardButton(player = exoPlayer)
661
+ }
662
+ }
663
+ }
664
+ }
665
+ }
666
+ ```
667
+
668
+ <br />
669
+
670
+ ### Replacing CursorLoader with reactive coroutine flow
671
+
672
+ Replace legacy `LoaderManager.LoaderCallbacks<Cursor>` and `CursorObjectAdapter`
673
+ with a repository returning a `Flow` that observes database changes and triggers
674
+ asynchronous fetching when empty:
675
+
676
+
677
+ ```kotlin
678
+ object VideoFlowRepository {
679
+ fun getVideosFlow(context: Context, contentUri: Uri): Flow<List<Video>> = callbackFlow {
680
+ val contentObserver = object : ContentObserver(Handler(Looper.getMainLooper())) {
681
+ override fun onChange(selfChange: Boolean) {
682
+ trySend(queryVideos(context, contentUri))
683
+ }
684
+ }
685
+
686
+ context.contentResolver.registerContentObserver(
687
+ contentUri,
688
+ true,
689
+ contentObserver
690
+ )
691
+
692
+ val initialVideos = queryVideos(context, contentUri)
693
+ trySend(initialVideos)
694
+
695
+ awaitClose {
696
+ context.contentResolver.unregisterContentObserver(contentObserver)
697
+ }
698
+ }.flowOn(Dispatchers.IO)
699
+
700
+ private fun queryVideos(context: Context, uri: Uri): List<Video> {
701
+ // Query database or ContentProvider
702
+ return emptyList()
703
+ }
704
+ }
705
+ ```
706
+
707
+ <br />