reis-mobile 0.3.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/.claude-plugin/plugin.json +1 -1
- package/CHANGELOG.md +39 -0
- package/README.md +135 -297
- package/THIRD_PARTY_NOTICES.md +221 -4
- package/agents/android-architect.md +89 -0
- package/agents/android-performance-engineer.md +92 -0
- package/agents/android-test-engineer.md +97 -0
- package/agents/flutter-test-engineer.md +2 -0
- package/agents/ios-architect.md +93 -0
- package/agents/ios-performance-engineer.md +92 -0
- package/agents/ios-test-engineer.md +95 -0
- package/agents/lead-mobile.md +10 -1
- package/agents/mobile-code-reviewer.md +2 -0
- package/agents/mobile-staff-engineer.md +1 -1
- package/agents/rn-architect.md +94 -0
- package/agents/rn-performance-engineer.md +92 -0
- package/agents/rn-test-engineer.md +98 -0
- package/bin/reis-mobile.mjs +59 -17
- package/commands/debate.md +10 -1
- package/commands/debug.md +60 -0
- package/commands/reis-mobile.md +7 -2
- package/core/config/project.mjs +59 -0
- package/core/registry/frontmatter.mjs +15 -4
- package/core/registry/registry.mjs +28 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +24 -3
- package/skills/mobile-android/SKILL.md +29 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/GUIDE.md +87 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/mobile-android/references/build-and-performance/agp-9-upgrade/references/recipes.md +62 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/GUIDE.md +450 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/references/interact.md +113 -0
- package/skills/mobile-android/references/build-and-performance/android-cli/references/journeys.md +120 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/GUIDE.md +34 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/env_setup.md +15 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/mobile-android/references/build-and-performance/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/GUIDE.md +53 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/mobile-android/references/build-and-performance/r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/mobile-android/references/build-and-performance.md +12 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/GUIDE.md +317 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/GUIDE.md +707 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/mobile-android/references/devices/leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/GUIDE.md +341 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/mobile-android/references/devices/wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/mobile-android/references/devices.md +11 -0
- package/skills/mobile-android/references/identity/restore-credentials/GUIDE.md +337 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/mobile-android/references/identity/restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/mobile-android/references/identity/verified-email/GUIDE.md +405 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/mobile-android/references/identity/verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/mobile-android/references/identity.md +10 -0
- package/skills/mobile-android/references/media/camerax/GUIDE.md +106 -0
- package/skills/mobile-android/references/media/camerax/references/camera1-to-camerax.md +198 -0
- package/skills/mobile-android/references/media/camerax/references/camera2-to-camerax.md +193 -0
- package/skills/mobile-android/references/media/camerax/references/expert-blueprints.md +58 -0
- package/skills/mobile-android/references/media/camerax/references/foldables.md +83 -0
- package/skills/mobile-android/references/media/camerax/references/immutability.md +60 -0
- package/skills/mobile-android/references/media/camerax/references/low-light.md +124 -0
- package/skills/mobile-android/references/media/camerax/references/mlkit-spatial.md +75 -0
- package/skills/mobile-android/references/media/camerax/references/modern-apis.md +42 -0
- package/skills/mobile-android/references/media/camerax/references/testing.md +69 -0
- package/skills/mobile-android/references/media/camerax/references/thermals.md +85 -0
- package/skills/mobile-android/references/media/camerax/references/wear-os.md +76 -0
- package/skills/mobile-android/references/media/camerax/references/xr.md +54 -0
- package/skills/mobile-android/references/media/media3-cast-integration/GUIDE.md +213 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/mobile-android/references/media/media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/mobile-android/references/media.md +10 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/GUIDE.md +51 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/context.md +26 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/implementation-configuration.md +282 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/mobile-android/references/on-device-ai/appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/GUIDE.md +105 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/mobile-android/references/on-device-ai.md +10 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/GUIDE.md +112 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/clusters.md +154 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/common.md +519 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/patterns.md +527 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/requests.md +260 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/mobile-android/references/play/engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/GUIDE.md +75 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/mobile-android/references/play/play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/mobile-android/references/play/play-policy-insights/GUIDE.md +130 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/critic.md +86 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/policies.json +321 -0
- package/skills/mobile-android/references/play/play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/scanner.py +261 -0
- package/skills/mobile-android/references/play/play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/mobile-android/references/play.md +11 -0
- package/skills/mobile-android/references/ui/adaptive/GUIDE.md +280 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/mobile-android/references/ui/adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/mobile-android/references/ui/edge-to-edge/GUIDE.md +409 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/GUIDE.md +104 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/mobile-android/references/ui/navigation-3/GUIDE.md +86 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/mobile-android/references/ui/navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/mobile-android/references/ui/navigation-event/GUIDE.md +288 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/mobile-android/references/ui/navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/mobile-android/references/ui/styles/GUIDE.md +209 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/mobile-android/references/ui/styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/mobile-android/references/ui.md +14 -0
- package/skills/mobile-architecture/SKILL.md +52 -0
- package/skills/mobile-architecture/references/android.md +54 -0
- package/skills/{flutter-app-architecture/SKILL.md → mobile-architecture/references/flutter/app-architecture.md} +1 -8
- package/skills/{bloc/SKILL.md → mobile-architecture/references/flutter/bloc.md} +1 -8
- package/skills/{flutter-change-notifier/SKILL.md → mobile-architecture/references/flutter/change-notifier.md} +1 -8
- package/skills/{architecture-feature-first/SKILL.md → mobile-architecture/references/flutter/feature-first.md} +1 -8
- package/skills/{flutter-login-usecase/SKILL.md → mobile-architecture/references/flutter/login-use-case.md} +0 -7
- package/skills/{flutter-managing-state/SKILL.md → mobile-architecture/references/flutter/managing-state.md} +2 -11
- package/skills/{provider/SKILL.md → mobile-architecture/references/flutter/provider.md} +1 -8
- package/skills/{flutter-apply-architecture-best-practices/SKILL.md → mobile-architecture/references/flutter/recommended-architecture.md} +2 -11
- package/skills/{riverpod/SKILL.md → mobile-architecture/references/flutter/riverpod.md} +1 -8
- package/skills/mobile-architecture/references/flutter.md +21 -0
- package/skills/mobile-architecture/references/ios.md +58 -0
- package/skills/mobile-architecture/references/react-native.md +61 -0
- package/skills/mobile-code-review/SKILL.md +70 -0
- package/skills/mobile-code-review/references/android.md +51 -0
- package/skills/{code-review/SKILL.md → mobile-code-review/references/flutter/pr-review.md} +1 -8
- package/skills/{flutter-project-audit/SKILL.md → mobile-code-review/references/flutter/project-audit.md} +0 -7
- package/skills/{dart-run-static-analysis/SKILL.md → mobile-code-review/references/flutter/static-analysis.md} +2 -11
- package/skills/{flutter-widget-review/SKILL.md → mobile-code-review/references/flutter/widget-review.md} +0 -7
- package/skills/mobile-code-review/references/flutter.md +18 -0
- package/skills/mobile-code-review/references/ios.md +49 -0
- package/skills/mobile-code-review/references/react-native.md +58 -0
- package/skills/mobile-debug/SKILL.md +50 -0
- package/skills/mobile-debug/references/android/gradle-build.md +63 -0
- package/skills/mobile-debug/references/android.md +26 -0
- package/skills/mobile-debug/references/flutter/build.md +58 -0
- package/skills/{flutter-errors/SKILL.md → mobile-debug/references/flutter/errors.md} +1 -8
- package/skills/{flutter-fix-layout-issues/SKILL.md → mobile-debug/references/flutter/layout-issues.md} +2 -11
- package/skills/{dart-resolve-package-conflicts/SKILL.md → mobile-debug/references/flutter/package-conflicts.md} +2 -11
- package/skills/{dart-fix-runtime-errors/SKILL.md → mobile-debug/references/flutter/runtime-errors.md} +2 -11
- package/skills/mobile-debug/references/flutter.md +23 -0
- package/skills/mobile-debug/references/ios/cocoapods.md +57 -0
- package/skills/mobile-debug/references/ios/xcode-build.md +58 -0
- package/skills/mobile-debug/references/ios.md +23 -0
- package/skills/mobile-debug/references/react-native.md +43 -0
- package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
- package/skills/mobile-firebase/SKILL.md +54 -0
- package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
- package/skills/mobile-firebase/references/android/analytics.md +33 -0
- package/skills/mobile-firebase/references/android/app-check.md +36 -0
- package/skills/mobile-firebase/references/android/auth.md +44 -0
- package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
- package/skills/mobile-firebase/references/android/firestore.md +44 -0
- package/skills/mobile-firebase/references/android/functions.md +33 -0
- package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
- package/skills/mobile-firebase/references/android/messaging.md +41 -0
- package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
- package/skills/mobile-firebase/references/android/remote-config.md +43 -0
- package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
- package/skills/mobile-firebase/references/android/storage.md +39 -0
- package/skills/mobile-firebase/references/android.md +30 -0
- package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
- package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
- package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
- package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
- package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
- package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
- package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
- package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
- package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
- package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
- package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
- package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
- package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
- package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
- package/skills/mobile-firebase/references/flutter.md +36 -0
- package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
- package/skills/mobile-firebase/references/ios/analytics.md +33 -0
- package/skills/mobile-firebase/references/ios/app-check.md +36 -0
- package/skills/mobile-firebase/references/ios/auth.md +48 -0
- package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
- package/skills/mobile-firebase/references/ios/firestore.md +53 -0
- package/skills/mobile-firebase/references/ios/functions.md +35 -0
- package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
- package/skills/mobile-firebase/references/ios/messaging.md +45 -0
- package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
- package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
- package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
- package/skills/mobile-firebase/references/ios/storage.md +36 -0
- package/skills/mobile-firebase/references/ios.md +28 -0
- package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
- package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
- package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
- package/skills/mobile-firebase/references/react-native/auth.md +50 -0
- package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
- package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
- package/skills/mobile-firebase/references/react-native/functions.md +28 -0
- package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
- package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
- package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
- package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
- package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
- package/skills/mobile-firebase/references/react-native/storage.md +30 -0
- package/skills/mobile-firebase/references/react-native.md +29 -0
- package/skills/mobile-flutter/SKILL.md +30 -0
- package/skills/{flutter-improving-accessibility/SKILL.md → mobile-flutter/references/accessibility-i18n/accessibility.md} +2 -11
- package/skills/{flutter-setup-localization/SKILL.md → mobile-flutter/references/accessibility-i18n/localization.md} +2 -11
- package/skills/mobile-flutter/references/accessibility-i18n.md +8 -0
- package/skills/{dart-3-updates/SKILL.md → mobile-flutter/references/dart/dart-3.md} +1 -8
- package/skills/{effective-dart/SKILL.md → mobile-flutter/references/dart/effective-dart.md} +1 -8
- package/skills/{dart-use-pattern-matching/SKILL.md → mobile-flutter/references/dart/pattern-matching/GUIDE.md} +2 -18
- package/skills/mobile-flutter/references/dart.md +9 -0
- package/skills/{flutter-caching-data/SKILL.md → mobile-flutter/references/data/caching.md} +2 -11
- package/skills/{flutter-working-with-databases/SKILL.md → mobile-flutter/references/data/databases.md} +2 -11
- package/skills/{flutter-use-http-package/SKILL.md → mobile-flutter/references/data/http.md} +2 -11
- package/skills/{flutter-implement-json-serialization/SKILL.md → mobile-flutter/references/data/json-serialization.md} +2 -11
- package/skills/mobile-flutter/references/data.md +10 -0
- package/skills/{flutter-interoperating-with-native-apis/SKILL.md → mobile-flutter/references/native/native-apis.md} +2 -11
- package/skills/{flutter-embedding-native-views/SKILL.md → mobile-flutter/references/native/native-views.md} +2 -11
- package/skills/{flutter-building-plugins/SKILL.md → mobile-flutter/references/native/plugins.md} +2 -11
- package/skills/mobile-flutter/references/native.md +9 -0
- package/skills/{flutter-reducing-app-size/SKILL.md → mobile-flutter/references/performance/app-size.md} +2 -11
- package/skills/{flutter-handling-concurrency/SKILL.md → mobile-flutter/references/performance/concurrency.md} +2 -11
- package/skills/mobile-flutter/references/performance.md +8 -0
- package/skills/{flutter-setting-up-on-macos/SKILL.md → mobile-flutter/references/setup/macos.md} +2 -11
- package/skills/mobile-flutter/references/setup.md +7 -0
- package/skills/{flutter-animating-apps/SKILL.md → mobile-flutter/references/ui/animations.md} +2 -11
- package/skills/{flutter-building-forms/SKILL.md → mobile-flutter/references/ui/forms.md} +2 -11
- package/skills/{flutter-adding-home-screen-widgets/SKILL.md → mobile-flutter/references/ui/home-screen-widgets.md} +2 -11
- package/skills/{flutter-building-layouts/SKILL.md → mobile-flutter/references/ui/layouts.md} +2 -11
- package/skills/{flutter-build-responsive-layout/SKILL.md → mobile-flutter/references/ui/responsive-layout.md} +2 -11
- package/skills/{flutter-setup-declarative-routing/SKILL.md → mobile-flutter/references/ui/routing.md} +2 -11
- package/skills/{flutter-theming-apps/SKILL.md → mobile-flutter/references/ui/theming.md} +2 -11
- package/skills/{flutter-add-widget-preview/SKILL.md → mobile-flutter/references/ui/widget-previews.md} +2 -11
- package/skills/mobile-flutter/references/ui.md +14 -0
- package/skills/mobile-ios/SKILL.md +25 -0
- package/skills/mobile-ios/references/data-networking.md +70 -0
- package/skills/mobile-ios/references/performance-release.md +37 -0
- package/skills/mobile-ios/references/platform-features.md +52 -0
- package/skills/mobile-ios/references/ui-navigation.md +64 -0
- package/skills/mobile-rn/SKILL.md +26 -0
- package/skills/mobile-rn/references/data-networking.md +59 -0
- package/skills/mobile-rn/references/performance-release.md +46 -0
- package/skills/mobile-rn/references/platform-features.md +40 -0
- package/skills/mobile-rn/references/ui-navigation.md +62 -0
- package/skills/mobile-security/SKILL.md +82 -0
- package/skills/mobile-security/references/android/intent-security.md +523 -0
- package/skills/mobile-security/references/android.md +37 -0
- package/skills/{flutter-secure-token-store/SKILL.md → mobile-security/references/flutter/secure-token-store.md} +1 -8
- package/skills/mobile-security/references/flutter.md +30 -0
- package/skills/mobile-security/references/ios.md +27 -0
- package/skills/mobile-security/references/react-native.md +29 -0
- package/skills/mobile-test/SKILL.md +63 -0
- package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
- package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
- package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
- package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
- package/skills/mobile-test/references/android.md +83 -0
- package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
- package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
- package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
- package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
- package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
- package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
- package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
- package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
- package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
- package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
- package/skills/mobile-test/references/flutter.md +44 -0
- package/skills/mobile-test/references/ios.md +79 -0
- package/skills/mobile-test/references/react-native.md +62 -0
- package/skills/mobile-security-audit/SKILL.md +0 -101
- /package/skills/{dart-use-pattern-matching → mobile-flutter/references/dart/pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
This guide covers implementing low-light features using **Night mode
|
|
2
|
+
extensions** and **Low Light Boost (LLB)**.
|
|
3
|
+
|
|
4
|
+
## Choosing the right tool
|
|
5
|
+
|
|
6
|
+
| Feature | Used for | Implementation | UX impact |
|
|
7
|
+
|---|---|---|---|
|
|
8
|
+
| **Night mode** | High-quality stills | `ExtensionsManager` | Possibly requires user to hold still for several seconds. |
|
|
9
|
+
| **LLB, AE mode** | Real-time preview or video | `Camera2Interop`, CameraX utility | Hardware drops the frame rate to increase brightness. |
|
|
10
|
+
| **LLB, Play services** | Real-time preview and video | `SurfaceProcessor` | Software-based brightening; maintains a higher frame rate. |
|
|
11
|
+
|
|
12
|
+
*** ** * ** ***
|
|
13
|
+
|
|
14
|
+
## Night mode extension
|
|
15
|
+
|
|
16
|
+
CameraX Extensions provide access to the device's built-in computational
|
|
17
|
+
photography pipeline.
|
|
18
|
+
|
|
19
|
+
### Basic setup
|
|
20
|
+
|
|
21
|
+
To set up the extension, initialize the extension manager:
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
```kotlin
|
|
25
|
+
// Use ListenableFuture.await() extension function for coroutine support
|
|
26
|
+
val extensionsManager = ExtensionsManager.getInstanceAsync(context, cameraProvider).await()
|
|
27
|
+
if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.NIGHT)) {
|
|
28
|
+
val nightSelector = extensionsManager.getExtensionEnabledCameraSelector(
|
|
29
|
+
cameraSelector, ExtensionMode.NIGHT
|
|
30
|
+
)
|
|
31
|
+
cameraProvider.bindToLifecycle(lifecycleOwner, nightSelector, imageCapture, preview)
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
<br />
|
|
36
|
+
|
|
37
|
+
### Comprehensive features
|
|
38
|
+
|
|
39
|
+
- **Image postview** : Display a low-resolution image immediately while the multi-frame processing occurs.
|
|
40
|
+
|
|
41
|
+
```kotlin
|
|
42
|
+
val imageCapture = ImageCapture.Builder()
|
|
43
|
+
.setPostviewEnabled(true)
|
|
44
|
+
.build()
|
|
45
|
+
```
|
|
46
|
+
- **Extension strength** : Let users control the intensity of the night effect.
|
|
47
|
+
|
|
48
|
+
```kotlin
|
|
49
|
+
// Set the strength of the active extension (e.g. NIGHT mode intensity)
|
|
50
|
+
val extensionsManager = ExtensionsManager.getInstanceAsync(context, cameraProvider).await()
|
|
51
|
+
val extensionsControl = extensionsManager.getCameraExtensionsControl(camera.cameraControl)
|
|
52
|
+
extensionsControl?.setExtensionStrength(strength)
|
|
53
|
+
```
|
|
54
|
+
- **Capture progress** : Show a UI progress bar for long exposures.
|
|
55
|
+
|
|
56
|
+
```kotlin
|
|
57
|
+
// Use the suspend extension function for takePicture to avoid callback boilerplate
|
|
58
|
+
try {
|
|
59
|
+
val result = imageCapture.takePicture(outputOptions)
|
|
60
|
+
// Use result.savedUri or other fields
|
|
61
|
+
} catch (e: ImageCaptureException) {
|
|
62
|
+
// Handle capture failure
|
|
63
|
+
}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
*** ** * ** ***
|
|
67
|
+
|
|
68
|
+
## Low-light boost
|
|
69
|
+
|
|
70
|
+
LLB is designed for preview and video streams where you prefer high frame rates.
|
|
71
|
+
|
|
72
|
+
### AE mode
|
|
73
|
+
|
|
74
|
+
The built-in CameraX way to prioritize brightness. It modifies the hardware's
|
|
75
|
+
auto-exposure algorithm.
|
|
76
|
+
|
|
77
|
+
- **Activation** : Use `CameraControl.enableLowLightBoostAsync`.
|
|
78
|
+
- **Implementation** :
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
// Enable Low Light Boost (LLB) natively in CameraX 1.4+
|
|
82
|
+
camera.cameraControl.enableLowLightBoostAsync(true)
|
|
83
|
+
```
|
|
84
|
+
- **Monitoring** : Observe `CameraInfo.lowLightBoostState` to track when the hardware actively applies the enhancement.
|
|
85
|
+
|
|
86
|
+
### Google Play services LLB
|
|
87
|
+
|
|
88
|
+
It's a multi-step implementation that uses a session-based `SurfaceProcessor`.
|
|
89
|
+
|
|
90
|
+
**Dependency** : `com.google.android.gms:play-services-camera-low-light-boost`
|
|
91
|
+
|
|
92
|
+
To implement Google Play services LLB, follow these core steps:
|
|
93
|
+
|
|
94
|
+
1. **Initialize client** : `val client = LowLightBoost.getClient`.
|
|
95
|
+
2. **Implement `SurfaceProcessor`** :
|
|
96
|
+
- **Manage session** : Call `client.createSession`.
|
|
97
|
+
- **Forward required metadata** : Observe the camera's `TotalCaptureResult` stream and forward every result to the session: `session.processCaptureResult`.
|
|
98
|
+
- **Provide surface** : Get the input surface from the session, `session.getCameraSurface`, and provide it to the camera's `SurfaceRequest`.
|
|
99
|
+
- **Lifecycle** : Release the session, `session.release`, when the processor is closed or the `SurfaceRequest` completes.
|
|
100
|
+
3. **Wire using `CameraEffect`** :
|
|
101
|
+
|
|
102
|
+
```kotlin
|
|
103
|
+
val effect = SimpleCameraEffect(
|
|
104
|
+
CameraEffect.PREVIEW or CameraEffect.VIDEO_CAPTURE,
|
|
105
|
+
executor,
|
|
106
|
+
llbSurfaceProcessor
|
|
107
|
+
) { throw it }
|
|
108
|
+
|
|
109
|
+
// Add to UseCaseGroup
|
|
110
|
+
val useCaseGroup = UseCaseGroup.Builder()
|
|
111
|
+
.addUseCase(preview)
|
|
112
|
+
.addUseCase(videoCapture)
|
|
113
|
+
.addEffect(effect)
|
|
114
|
+
.build()
|
|
115
|
+
```
|
|
116
|
+
4. **Scene detection** : Use `session.setSceneDetectorCallback` to receive `boostStrength` updates for real-time UI indicators.
|
|
117
|
+
|
|
118
|
+
*** ** * ** ***
|
|
119
|
+
|
|
120
|
+
## Implementation notes
|
|
121
|
+
|
|
122
|
+
- **Thread safety** : Always handle `ExtensionsManager` and `LowLightBoostClient` initialization asynchronously.
|
|
123
|
+
- **FPS trade-offs**: AE mode LLB often drops the frame rate significantly to increase brightness.
|
|
124
|
+
- **Compatibility** : Extensions, Night Mode, possibly conflict with `ConcurrentCamera`. Always verify support before binding.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
When you use ML Kit for features such as face mesh, object detection, or pose
|
|
2
|
+
detection, the most common failure point is the coordinate disparity between the
|
|
3
|
+
analysis image and the viewfinder UI.
|
|
4
|
+
|
|
5
|
+
## The mapping mindset
|
|
6
|
+
|
|
7
|
+
| Dimension | Analysis frame | Viewfinder UI on the screen |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| Resolution | Fixed, such as 640x480 | Dynamic, such as 1080x2400 |
|
|
10
|
+
| Rotation | 0° for the raw buffer | 90° or 270° in portrait or landscape mode |
|
|
11
|
+
| Origin | Top-left of buffer at (0,0) | Top-left of screen at (0,0) |
|
|
12
|
+
|
|
13
|
+
*** ** * ** ***
|
|
14
|
+
|
|
15
|
+
## Follow the implementation guide
|
|
16
|
+
|
|
17
|
+
### Coordinate transformation matrix
|
|
18
|
+
|
|
19
|
+
Android provides the `Viewport` and `UseCaseGroup` APIs to calculate the
|
|
20
|
+
transformation matrix automatically. **Don't** calculate aspect ratio scaling
|
|
21
|
+
manually.
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
```kotlin
|
|
25
|
+
val transform = previewView.viewPort?.let { viewPort ->
|
|
26
|
+
// Use CameraX's built-in coordinate mapper
|
|
27
|
+
viewPort.getTransformationMatrix(imageProxy.imageInfo.rotationDegrees)
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
<br />
|
|
32
|
+
|
|
33
|
+
### Handling the "double rotation" bug
|
|
34
|
+
|
|
35
|
+
ML Kit results, bounding boxes, are relative to the **rotated buffer**. If the
|
|
36
|
+
device is in portrait, the buffer is often 480x640, landscape, but the screen
|
|
37
|
+
is 1080x1920.
|
|
38
|
+
|
|
39
|
+
To map the coordinates, use the following workflow:
|
|
40
|
+
|
|
41
|
+
1. Query `imageProxy.imageInfo.rotationDegrees`.
|
|
42
|
+
2. Pass this rotation to the ML Kit `InputImage`.
|
|
43
|
+
3. Use the `MappingUtils.transformRect` method to map the result `Rect` to the screen.
|
|
44
|
+
|
|
45
|
+
### Face mesh and pose normalization
|
|
46
|
+
|
|
47
|
+
For high-precision spatial analysis, for example, "Is the user's hand at a
|
|
48
|
+
specific screen button?", use **normalized coordinates from 0.0 to 1.0**.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
```kotlin
|
|
52
|
+
// Example: Converting a Pose landmark to a Screen Coordinate
|
|
53
|
+
val screenX = landmark.position.x / analysisWidth * screenWidth
|
|
54
|
+
val screenY = landmark.position.y / analysisHeight * screenHeight
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
<br />
|
|
58
|
+
|
|
59
|
+
**Warning** : Always account for **mirrored lenses** . If the `LENS_FACING_FRONT`
|
|
60
|
+
is used, you must flip the X-coordinate: `actualX = screenWidth - screenX`.
|
|
61
|
+
|
|
62
|
+
### Overlays and canvas clipping
|
|
63
|
+
|
|
64
|
+
Use a custom `GraphicOverlay` view on top of the `PreviewView`.
|
|
65
|
+
|
|
66
|
+
- **Buffer lock** : Ensure your `GraphicOverlay` clears its canvas every time a new `ImageAnalysis` frame is processed to prevent "ghosting" of bounding boxes.
|
|
67
|
+
|
|
68
|
+
*** ** * ** ***
|
|
69
|
+
|
|
70
|
+
## Spatial pitfalls
|
|
71
|
+
|
|
72
|
+
- **The "stretched box" bug** : Caused by assuming the Analysis Frame aspect ratio, 4:3, matches the screen aspect ratio, 21:9. Use `PreviewView.SCALE_TYPE_FILL_CENTER` and map coordinates accordingly.
|
|
73
|
+
- **Latency** : If ML processing exceeds 50 ms, the bounding box trails behind the user's face.
|
|
74
|
+
- **Fix** : Use `ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST` to avoid queuing stale frames.
|
|
75
|
+
- **Sensor vs. display rotation** : On some tablets, the sensor is mounted horizontally. Always query `display.rotation` and `cameraInfo.sensorRotationDegrees`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
Always prefer these various abstractions over legacy Camera2 or early CameraX
|
|
2
|
+
implementations.
|
|
3
|
+
|
|
4
|
+
## Compare APIs
|
|
5
|
+
|
|
6
|
+
| Use case | Legacy or verbose way | Recommendation |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| QR or face scanning | `ImageAnalysis.Analyzer` and manual ByteBuffer math | **`MlKitAnalyzer`**, which automates coordinate mapping and multi-format support |
|
|
9
|
+
| Post-processing | Custom OpenGL shaders or `SurfaceTexture` | **`Media3Effect`** for composable, declarative effects |
|
|
10
|
+
| Dual camera | Manual binding of two UseCases | **`ConcurrentCamera`**, which provides built-in support in CameraX 1.3 and higher |
|
|
11
|
+
| High dynamic range | Manual bit-depth and profile config | **`DynamicRange`** , which uses `DYNAMIC_RANGE_HLG10` or `SDR` |
|
|
12
|
+
| Zoom and focus | `Camera2Interop` for CameraX-to-Camera2 mapping | **`CameraControl.setZoomRatio`** or **`setLinearZoom`** |
|
|
13
|
+
|
|
14
|
+
## Hardware awareness
|
|
15
|
+
|
|
16
|
+
Modern APIs abstract away the complexity of hardware diversity.
|
|
17
|
+
|
|
18
|
+
- **`CameraSelector`** : Use `DEFAULT_BACK_CAMERA` or `DEFAULT_FRONT_CAMERA` instead of hardcoding camera IDs. Use `filter` if you need specific lens capabilities.
|
|
19
|
+
- **Extensions** : Before enabling advanced modes, such as night, bokeh, and face retouch, use `ExtensionsManager` to query whether the device supports them.
|
|
20
|
+
- **Foldables** : Observe `Lifecycle` and `Viewport` updates to handle posture changes, like a half-opened posture, on foldable devices.
|
|
21
|
+
|
|
22
|
+
## Required dependencies
|
|
23
|
+
|
|
24
|
+
Add the following dependencies to your `libs.versions.toml` file:
|
|
25
|
+
|
|
26
|
+
# CameraX ML Kit
|
|
27
|
+
|
|
28
|
+
androidx-camera-mlkit-vision = { group = "androidx.camera", name =
|
|
29
|
+
"camera-mlkit-vision", version.ref = "camerax" }
|
|
30
|
+
|
|
31
|
+
# Media3 effects
|
|
32
|
+
|
|
33
|
+
androidx-media3-effect = { group = "androidx.media3", name = "media3-effect",
|
|
34
|
+
version.ref = "media3" }
|
|
35
|
+
|
|
36
|
+
# Camera extensions
|
|
37
|
+
|
|
38
|
+
androidx-camera-extensions = { group = "androidx.camera", name =
|
|
39
|
+
"camera-extensions", version.ref = "camerax" }
|
|
40
|
+
|
|
41
|
+
Refer to the official [CameraX Release Notes](https://developer.android.com/jetpack/androidx/releases/camera) for the
|
|
42
|
+
stable versions.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
Automated testing for camera features is notoriously difficult because you
|
|
2
|
+
can't easily mock physical hardware, lighting, or motion. This guide provides
|
|
3
|
+
patterns for reliable, hermetic camera tests.
|
|
4
|
+
|
|
5
|
+
## Develop a testing mindset
|
|
6
|
+
|
|
7
|
+
| Challenge | Conventional approach | Camera technical approach |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **Frameworks** | `Mockito` or `MockK` | **Fakes over mocks** |
|
|
10
|
+
| **Assertions** | `assertEquals`, `assertTrue` | **Google Truth, `assertThat`** |
|
|
11
|
+
| **Environment** | Implied environments | **Explicit `@RunWith` annotations** |
|
|
12
|
+
| **Async operations** | `Thread.sleep` | **Explicit `timeoutMillis` or `IdlingResource`** |
|
|
13
|
+
|
|
14
|
+
*** ** * ** ***
|
|
15
|
+
|
|
16
|
+
## Follow the implementation guide
|
|
17
|
+
|
|
18
|
+
### Fakes over mocks
|
|
19
|
+
|
|
20
|
+
**Don't use Mockito.** Relying on mocks for complex, rapidly changing interfaces
|
|
21
|
+
like `ImageProxy` or `CameraInfo` makes tests brittle. Instead, build "Fake"
|
|
22
|
+
implementations that verify state rather than behavior.
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
```kotlin
|
|
26
|
+
// Create a Fake ImageProxy for ML Testing (Fakes over Mocks)
|
|
27
|
+
val fakeImage = FakeImageProxy(w = 640, h = 480)
|
|
28
|
+
|
|
29
|
+
// Feed the fake buffer into your analyzer
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
<br />
|
|
33
|
+
|
|
34
|
+
### Mock camera capabilities
|
|
35
|
+
|
|
36
|
+
Use `FakeAppConfig` from `androidx.camera:camera-testing` to simulate specific
|
|
37
|
+
hardware constraints in tests, such as a device without a flash.
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
```kotlin
|
|
41
|
+
// Use awaitInstance() extension function for coroutine-based provider retrieval
|
|
42
|
+
val cameraProvider = ProcessCameraProvider.awaitInstance(context)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<br />
|
|
46
|
+
|
|
47
|
+
### Use Truth assertions
|
|
48
|
+
|
|
49
|
+
Use Google Truth, `assertThat`, instead of standard JUnit assertions. It
|
|
50
|
+
provides more readable assertion chains and useful failure messages.
|
|
51
|
+
|
|
52
|
+
### Test asynchronous lifecycles
|
|
53
|
+
|
|
54
|
+
Camera initialization is asynchronous. Use `IdlingResource` to ensure
|
|
55
|
+
your test waits for the `UseCase` to be bound before asserting.
|
|
56
|
+
|
|
57
|
+
To test asynchronous lifecycles, use the following pattern:
|
|
58
|
+
|
|
59
|
+
1. Wrap the `ProcessCameraProvider` initialization in a `CountDownLatch` or `IdlingResource`.
|
|
60
|
+
2. Assert only after the `cameraControl` instance is non-null.
|
|
61
|
+
|
|
62
|
+
*** ** * ** ***
|
|
63
|
+
|
|
64
|
+
## Testing pitfalls
|
|
65
|
+
|
|
66
|
+
- **Resource leaks** : To prevent "Camera in Use" errors, in your `@After` block, call `cameraProvider.unbindAll`.
|
|
67
|
+
- **The "flaky initializer"**: Camera tests often fail on CI because the "Virtual Camera" takes too long to warm up. Use a sufficient explicit timeout for the first initialization.
|
|
68
|
+
- **Permission blockers** : To bypass the system permission dialogs, in your Espresso tests, use `GrantPermissionRule`.
|
|
69
|
+
- **Resolution mismatch** : Tests on emulators often default to 640x480. Ensure your `ResolutionSelector` handles this low-res fallback correctly.
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
Camera operations are among the most power-intensive tasks on mobile devices.
|
|
2
|
+
Without proactive management, the system throttle hardware, drop frames, or
|
|
3
|
+
force-close the camera app.
|
|
4
|
+
|
|
5
|
+
## The thermal management strategy
|
|
6
|
+
|
|
7
|
+
| Priority | Strategy | Implementation |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **1. Inform** | Use case hints | Provide `StreamUseCase` to allow the OS to optimize hardware. |
|
|
10
|
+
| **2. Monitor** | Thermal state listener | Observe `PowerManager.addThermalStatusListener`. |
|
|
11
|
+
| **3. Act** | Graceful degradation | Dynamically reduce FPS, resolution, or disable demanding effects such as HDR. |
|
|
12
|
+
|
|
13
|
+
*** ** * ** ***
|
|
14
|
+
|
|
15
|
+
## Follow the implementation guide
|
|
16
|
+
|
|
17
|
+
### Stream use case optimization
|
|
18
|
+
|
|
19
|
+
Android 13 (API level 33) introduced `StreamUseCase`. This is the **single most
|
|
20
|
+
effective** way to tell the hardware how to balance quality versus power.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
```kotlin
|
|
24
|
+
// In CameraX: Set the hint on your Use Case
|
|
25
|
+
val preview = Preview.Builder()
|
|
26
|
+
.setTargetName("Preview")
|
|
27
|
+
.apply {
|
|
28
|
+
Camera2Interop.Extender(this).setStreamUseCase(
|
|
29
|
+
CameraMetadata.SCALER_AVAILABLE_STREAM_USE_CASES_VIDEO_CALL.toLong()
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
.build()
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
<br />
|
|
36
|
+
|
|
37
|
+
Review the following key use cases for stream optimization:
|
|
38
|
+
|
|
39
|
+
- `PREVIEW`: This option is the default and provides a balanced configuration.
|
|
40
|
+
- `STILL_CAPTURE`: This option provides high-quality capture for short bursts.
|
|
41
|
+
- `VIDEO_RECORD`: This option maintains sustained power and is optimized for encoding.
|
|
42
|
+
- `VIDEO_CALL`: This option minimizes power consumption for long-duration sessions.
|
|
43
|
+
|
|
44
|
+
### Monitor thermal status
|
|
45
|
+
|
|
46
|
+
Don't wait for a crash. Monitor the `PowerManager` status and react before
|
|
47
|
+
`THERMAL_STATUS_CRITICAL`.
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
```kotlin
|
|
51
|
+
val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
|
|
52
|
+
powerManager.addThermalStatusListener { status ->
|
|
53
|
+
when (status) {
|
|
54
|
+
PowerManager.THERMAL_STATUS_MODERATE -> {
|
|
55
|
+
// Signal to UI: "Device is warming up"
|
|
56
|
+
}
|
|
57
|
+
PowerManager.THERMAL_STATUS_SEVERE -> {
|
|
58
|
+
// ACTION: Reduce Frame Rate from 60fps to 30fps
|
|
59
|
+
// ACTION: Disable HDR or High-Quality Post-processing
|
|
60
|
+
}
|
|
61
|
+
PowerManager.THERMAL_STATUS_CRITICAL -> {
|
|
62
|
+
// ACTION: Close the camera session to prevent hardware damage
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
<br />
|
|
69
|
+
|
|
70
|
+
### Graceful degradation tiers
|
|
71
|
+
|
|
72
|
+
| Tier | Action | User impact |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| **Mild** | Stop background analysis using ML Kit | Minimal |
|
|
75
|
+
| **Moderate** | Cap frame rate to 30 FPS | Noticeable but smooth |
|
|
76
|
+
| **Severe** | Drop resolution from 1080p to 720p | Significant visual change |
|
|
77
|
+
| **Critical** | Shut down the session | App unusable in safe mode |
|
|
78
|
+
|
|
79
|
+
*** ** * ** ***
|
|
80
|
+
|
|
81
|
+
## Thermal pitfalls
|
|
82
|
+
|
|
83
|
+
- **The "double work" bug**: Don't run two high-resolution streams---such as a preview and a video capture stream---at different aspect ratios unless necessary. This forces the image signal processor (ISP) to perform double the scaling work, which generates excessive heat.
|
|
84
|
+
- **Surface overload** : Don't use multi-step `SurfaceProcessor` or `Media3Effect` chains during `THERMAL_STATUS_SEVERE`.
|
|
85
|
+
- **Flash heat** : Flash or torch usage generates high thermal load. Proactively disable the flash if thermal status is `SEVERE`.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
Developing camera features for Wear OS is rarely about the watch's own lens, if
|
|
2
|
+
it even has one. It's almost always about creating a **Remote Viewfinder** to
|
|
3
|
+
control the phone's camera.
|
|
4
|
+
|
|
5
|
+
## The Wear OS remote mindset
|
|
6
|
+
|
|
7
|
+
| Feature | Phone camera app | Wear OS remote app |
|
|
8
|
+
|---|---|---|
|
|
9
|
+
| **Screen** | Rectangular (Large) | **Circular and less than 2 inches in size** |
|
|
10
|
+
| **Connectivity** | Local Hardware | **Bluetooth or Wi-Fi data layer API** |
|
|
11
|
+
| **Latency** | Direct and less than 20 ms | **Networked, 100 ms to 500 ms** |
|
|
12
|
+
| **Interaction** | Multi-touch gestures | **Rotary input or single taps** |
|
|
13
|
+
|
|
14
|
+
*** ** * ** ***
|
|
15
|
+
|
|
16
|
+
## Follow the implementation guide
|
|
17
|
+
|
|
18
|
+
### The circular UI challenge
|
|
19
|
+
|
|
20
|
+
Wear OS devices are often round. Standard rectangular layouts clip corner
|
|
21
|
+
buttons.
|
|
22
|
+
|
|
23
|
+
Follow these blueprint recommendations:
|
|
24
|
+
|
|
25
|
+
- Use `Horologist` or `Wear Compose` libraries.
|
|
26
|
+
- Use `ScalingLazyColumn` for lists so that items stay within the "safe zone" of the circular display.
|
|
27
|
+
- **Preview scaling**: Crop the center of the rectangular phone viewfinder to fit the circular watch screen.
|
|
28
|
+
|
|
29
|
+
### Stream the viewfinder
|
|
30
|
+
|
|
31
|
+
You can't send a raw 60 fps stream over Bluetooth. compress and throttle.
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
// Example: Sending a viewfinder frame to the watch
|
|
36
|
+
val bitmap = previewView.bitmap // Capture current frame
|
|
37
|
+
if (bitmap != null) {
|
|
38
|
+
val compressed = compressToJpeg(bitmap, quality = 50)
|
|
39
|
+
val request = PutDataMapRequest.create("/camera/preview").apply {
|
|
40
|
+
dataMap.putAsset("image", Asset.createFromBytes(compressed))
|
|
41
|
+
}
|
|
42
|
+
Wearable.getDataClient(context).putDataItem(request.asPutDataRequest())
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
<br />
|
|
47
|
+
|
|
48
|
+
**Optimization** : Cap the watch preview at **10-15 fps** to preserve battery and
|
|
49
|
+
bandwidth.
|
|
50
|
+
|
|
51
|
+
### Remote triggers and syncing
|
|
52
|
+
|
|
53
|
+
Use the `MessageClient` for low-latency commands like "Take Photo" or "Switch
|
|
54
|
+
Camera."
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
```kotlin
|
|
58
|
+
// Watch sends a trigger to the phone
|
|
59
|
+
Wearable.getMessageClient(context).sendMessage(nodeId, "/camera/capture", null)
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
<br />
|
|
63
|
+
|
|
64
|
+
### Rotary input support
|
|
65
|
+
|
|
66
|
+
On devices that support it, use the physical crown, Rotary Input, to control
|
|
67
|
+
**Zoom** or **Exposure**.
|
|
68
|
+
|
|
69
|
+
*** ** * ** ***
|
|
70
|
+
|
|
71
|
+
## Wear OS pitfalls
|
|
72
|
+
|
|
73
|
+
- **Corner clipping** : Placing a **Close** button in the top-right corner of a square layout makes it impossible to tap the button on a round watch display.
|
|
74
|
+
- **Battery drain**: Sustained Bluetooth data transfer, viewfinder sync, drains watch battery. Proactively close the remote app if the phone screen is turned off.
|
|
75
|
+
- **Node discovery** : The phone is possibly connected to multiple "Nodes" (watches, earbuds, or tablets). Ensure your `CapabilityClient` filters for the specific `camera_remote_host` capability.
|
|
76
|
+
- **Disconnect handling**: If the watch disconnects, the phone camera must stop its high-power preview to save energy.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
Developing camera features for XR devices, headsets, and AR glasses requires a
|
|
2
|
+
shift from 2D pixel-pushing to 3D spatial awareness.
|
|
3
|
+
|
|
4
|
+
## Understand the XR development mindset
|
|
5
|
+
|
|
6
|
+
| Concept | Mobile focus | **XR focus** |
|
|
7
|
+
|---|---|---|
|
|
8
|
+
| **Input** | Raw camera stream | **Spatial tracking (visual-inertial odometry (VIO) or simultaneous localization and mapping (SLAM))** |
|
|
9
|
+
| **Output** | Screen viewfinder | **Stereo passthrough and occlusion** |
|
|
10
|
+
| **Constraint** | Battery life | **Motion-to-photon latency (less than 20 ms)** |
|
|
11
|
+
|
|
12
|
+
*** ** * ** ***
|
|
13
|
+
|
|
14
|
+
## Follow the implementation guide
|
|
15
|
+
|
|
16
|
+
### API selection
|
|
17
|
+
|
|
18
|
+
On XR devices, standard `CameraX` implementations are often restricted or
|
|
19
|
+
insufficient. Always use spatial software development kits (SDKs):
|
|
20
|
+
|
|
21
|
+
- **ARCore**: Use ARCore for plane detection, depth sensing, and motion tracking.
|
|
22
|
+
- **OpenXR**: Use OpenXR as the cross-platform standard for VR and AR rendering and input.
|
|
23
|
+
- **OEM SDKs**: Use manufacturer-specific libraries for hardware-accelerated passthrough.
|
|
24
|
+
|
|
25
|
+
### Handle spatial passthrough
|
|
26
|
+
|
|
27
|
+
Unlike a 2D viewport, XR passthrough is often system-managed.
|
|
28
|
+
|
|
29
|
+
**\[Key requirement\] Frame synchronization**: Synchronize your application's
|
|
30
|
+
frame clock with the headset's head-mounted display (HMD) pose.
|
|
31
|
+
|
|
32
|
+
```kotlin
|
|
33
|
+
// Example: Querying the spatial pose for the current camera frame
|
|
34
|
+
val headPose = xrSession.getHeadPose(frameTime)
|
|
35
|
+
val projectionMatrix = headPose.getProjectionMatrix(eyeIndex)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<br />
|
|
39
|
+
|
|
40
|
+
### Manage depth and occlusion
|
|
41
|
+
|
|
42
|
+
Digital content must respect real-world depth to ensure accurate occlusion.
|
|
43
|
+
|
|
44
|
+
- **Depth map** : Access raw depth data using `ARCore` or `SurfaceProcessor` to create an occlusion mask.
|
|
45
|
+
- **Hardware buffers** : Use `HardwareBuffer` to share camera frames directly with the GPU without CPU-side copies to minimize latency.
|
|
46
|
+
|
|
47
|
+
*** ** * ** ***
|
|
48
|
+
|
|
49
|
+
## XR pitfalls
|
|
50
|
+
|
|
51
|
+
- **The nausea limit**: Any processing that delays the viewfinder by more than 20 ms causes user sickness. Don't perform image processing on the main thread.
|
|
52
|
+
- **Privacy restrictions** : Some XR devices return a black frame if you attempt to record the "Passthrough" layer. Check `Session.isRecordingSupported`.
|
|
53
|
+
- **Field of view (FOV)**: The camera FOV possibly doesn't match the display FOV. Use the SDK's projection matrixes instead of calculating aspect ratios manually.
|
|
54
|
+
- **Front buffer rendering** : If the device supports it, use `FrontBufferRenderer` for real-time overlays to bypass standard double-buffering latency.
|