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,226 @@
|
|
|
1
|
+
Follow this systematic procedure to migrate Android applications that use the
|
|
2
|
+
AppFunctions API in version 1.0.0-alpha09 and lower to the compile-time
|
|
3
|
+
`@AppFunctionServiceEntryPoint` architecture introduced in version
|
|
4
|
+
`1.0.0-alpha10`.
|
|
5
|
+
|
|
6
|
+
*** ** * ** ***
|
|
7
|
+
|
|
8
|
+
## Architectural shift overview
|
|
9
|
+
|
|
10
|
+
In lower versions of the AppFunctions API, for example version `1.0.0-alpha09`:
|
|
11
|
+
|
|
12
|
+
- Applications require separate dependencies for core functionality, specifically `androidx.appfunctions:appfunctions`, and service components, specifically `androidx.appfunctions:appfunctions-service`.
|
|
13
|
+
- The application implements `AppFunctionConfiguration.Provider` on its `Application` class.
|
|
14
|
+
- You manually register enclosing class instantiation using `AppFunctionConfiguration.Builder().addEnclosingClassFactory(...)`.
|
|
15
|
+
- You place metadata property tags directly under `<application>`.
|
|
16
|
+
|
|
17
|
+
In version `1.0.0-alpha10` featuring `@AppFunctionServiceEntryPoint`:
|
|
18
|
+
|
|
19
|
+
- The core and service dependencies are consolidated into a single runtime artifact, `androidx.appfunctions:appfunctions`, which eliminates the need for the standalone `appfunctions-service` library.
|
|
20
|
+
- A dedicated wrapper class extending `AppFunctionService` is annotated with `@AppFunctionServiceEntryPoint` and Hilt's `@AndroidEntryPoint` or an alternative dependency injection framework.
|
|
21
|
+
- The KSP compiler generates a concrete service subclass and an XML metadata schema file in `assets/`.
|
|
22
|
+
- The OS discovers and routes executions using a consolidated `<service>` and `app_metadata` declaration in `AndroidManifest.xml`.
|
|
23
|
+
|
|
24
|
+
### Strict migration requirements from 1.0.0-alpha09 to 1.0.0-alpha10
|
|
25
|
+
|
|
26
|
+
When focusing solely on the mandatory API changes required by the new
|
|
27
|
+
`@AppFunctionServiceEntryPoint` architecture, the migration consists of four
|
|
28
|
+
strict requirements that you must complete:
|
|
29
|
+
|
|
30
|
+
1. **Build dependency consolidation** : Remove the merged `appfunctions-service` dependency while retaining core `appfunctions` and the KSP compiler.
|
|
31
|
+
2. **Service wrapper creation** : Replace the legacy `AppFunctionConfiguration.Provider` on the `Application` class with an abstract class extending `AppFunctionService`, annotated with `@AppFunctionServiceEntryPoint`.
|
|
32
|
+
3. **Annotation and context decoupling** : Move `@AppFunction` annotations to the new wrapper methods and drop `AppFunctionContext` parameters because `AppFunctionService` inherits directly from `Context`.
|
|
33
|
+
4. **Manifest registration** : Register the KSP-generated concrete service in `AndroidManifest.xml` with `BIND_APP_FUNCTION_SERVICE`, the `AppFunctionService` intent filter, and metadata property tags.
|
|
34
|
+
|
|
35
|
+
*** ** * ** ***
|
|
36
|
+
|
|
37
|
+
## Systematic migration steps
|
|
38
|
+
|
|
39
|
+
### Consolidate AppFunctions build dependencies
|
|
40
|
+
|
|
41
|
+
Remove the standalone `appfunctions-service` library from your module build
|
|
42
|
+
files like `build.gradle.kts` and version catalog like `libs.versions.toml`. In
|
|
43
|
+
version `1.0.0-alpha10`, all core service capabilities are consolidated directly
|
|
44
|
+
within the main `appfunctions` artifact.
|
|
45
|
+
|
|
46
|
+
// build.gradle.kts
|
|
47
|
+
dependencies {
|
|
48
|
+
implementation(libs.androidx.appfunctions)
|
|
49
|
+
- implementation(libs.androidx.appfunctions.service)
|
|
50
|
+
ksp(libs.androidx.appfunctions.compiler)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
# libs.versions.toml
|
|
54
|
+
[versions]
|
|
55
|
+
appfunctions = "1.0.0-alpha10"
|
|
56
|
+
|
|
57
|
+
[libraries]
|
|
58
|
+
androidx-appfunctions = { module = "androidx.appfunctions:appfunctions", version.ref = "appfunctions" }
|
|
59
|
+
- androidx-appfunctions-service = { module = "androidx.appfunctions:appfunctions-service", version.ref = "appfunctions" }
|
|
60
|
+
androidx-appfunctions-compiler = { module = "androidx.appfunctions:appfunctions-compiler", version.ref = "appfunctions" }
|
|
61
|
+
|
|
62
|
+
> [!NOTE]
|
|
63
|
+
> **Note:** If another dependency in your project uses snapshot builds like `1.0.0-SNAPSHOT` or custom snapshot repositories from `https://androidx.dev/snapshots/...`, preserve your custom snapshot repository configuration in `settings.gradle.kts`. Otherwise, standard Google Maven repositories resolve `1.0.0-alpha10` directly.
|
|
64
|
+
|
|
65
|
+
*** ** * ** ***
|
|
66
|
+
|
|
67
|
+
### Create a dedicated wrapper service extending `AppFunctionService`
|
|
68
|
+
|
|
69
|
+
Instead of annotating standalone business logic classes or implementing manual
|
|
70
|
+
configuration providers, create an abstract service wrapper across your project,
|
|
71
|
+
for example `BaseAppFunctionService`, extending `AppFunctionService` and
|
|
72
|
+
annotated with `@AppFunctionServiceEntryPoint`.
|
|
73
|
+
|
|
74
|
+
#### Recommended approach using Hilt
|
|
75
|
+
|
|
76
|
+
Annotate your service with `@AndroidEntryPoint` and inject your data
|
|
77
|
+
repositories or use cases using standard `@Inject internal lateinit var`:
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
```kotlin
|
|
81
|
+
@RequiresApi(36)
|
|
82
|
+
@AndroidEntryPoint
|
|
83
|
+
@AppFunctionServiceEntryPoint(
|
|
84
|
+
serviceName = "MyAppFunctionService",
|
|
85
|
+
appFunctionXmlFileName = "my_app_function_service", // Do NOT include .xml extension
|
|
86
|
+
)
|
|
87
|
+
abstract class BaseAppFunctionService : AppFunctionService() {
|
|
88
|
+
@Inject internal lateinit var messageRepository: MessageRepository
|
|
89
|
+
|
|
90
|
+
@AppFunction(isDescribedByKDoc = true)
|
|
91
|
+
internal suspend fun send(
|
|
92
|
+
name: String,
|
|
93
|
+
endpointValue: String,
|
|
94
|
+
messageBody: String,
|
|
95
|
+
): MessageResult {
|
|
96
|
+
return messageRepository.send(name, endpointValue, messageBody)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
<br />
|
|
102
|
+
|
|
103
|
+
#### Framework-agnostic approach using alternative dependency injection or a service locator
|
|
104
|
+
|
|
105
|
+
While Hilt is recommended, many Android applications implement AppFunctions with
|
|
106
|
+
alternative dependency injection frameworks like Koin, Anvil, or manual Service
|
|
107
|
+
Locators. Because `AppFunctionService` inherits from Android
|
|
108
|
+
`android.app.Service` and therefore `Context`, you are able access your
|
|
109
|
+
application's DI container directly through `applicationContext` in property
|
|
110
|
+
getters or during service lifecycle execution:
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
```kotlin
|
|
114
|
+
@RequiresApi(36)
|
|
115
|
+
@AppFunctionServiceEntryPoint(
|
|
116
|
+
serviceName = "ServiceLocatorMyAppFunctionService",
|
|
117
|
+
appFunctionXmlFileName = "service_locator_my_app_function_service",
|
|
118
|
+
)
|
|
119
|
+
abstract class ServiceLocatorBaseAppFunctionService : AppFunctionService() {
|
|
120
|
+
// Example using a manual Service Locator or Application container
|
|
121
|
+
private val messageRepository by lazy {
|
|
122
|
+
(applicationContext as AppFunctionApplication).appContainer.messageRepository
|
|
123
|
+
}
|
|
124
|
+
// Or with Koin / alternative DI locators:
|
|
125
|
+
// private val messageRepository: MessageRepository by inject()
|
|
126
|
+
|
|
127
|
+
@AppFunction(isDescribedByKDoc = true)
|
|
128
|
+
internal suspend fun send(
|
|
129
|
+
name: String,
|
|
130
|
+
endpointValue: String,
|
|
131
|
+
messageBody: String,
|
|
132
|
+
): MessageResult {
|
|
133
|
+
return messageRepository.send(name, endpointValue, messageBody)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
<br />
|
|
139
|
+
|
|
140
|
+
> [!IMPORTANT]
|
|
141
|
+
> **Important:** The `appFunctionXmlFileName` parameter, for example `"my_app_function_service"`, mustn't include the `.xml` extension, as the KSP compiler automatically appends `.xml`. Passing `"my_app_function_service.xml"` results in the asset being named `"my_app_function_service.xml.xml"`.
|
|
142
|
+
|
|
143
|
+
*** ** * ** ***
|
|
144
|
+
|
|
145
|
+
### Simplify method signatures and decouple context
|
|
146
|
+
|
|
147
|
+
Remove legacy `AppFunctionContext` parameters from your core methods. When a
|
|
148
|
+
method requires an Android `Context`, for example when constructing a
|
|
149
|
+
`PendingIntent`, access `this` directly from your `AppFunctionService` wrapper
|
|
150
|
+
because the wrapper inherently extends `android.content.Context`.
|
|
151
|
+
|
|
152
|
+
- suspend fun makeCall(appFunctionContext: AppFunctionContext, contactName: String?): PendingIntent
|
|
153
|
+
+ suspend fun makeCall(contactName: String?): PendingIntent
|
|
154
|
+
|
|
155
|
+
*** ** * ** ***
|
|
156
|
+
|
|
157
|
+
### Remove legacy configuration provider
|
|
158
|
+
|
|
159
|
+
Update your `Application` class by removing
|
|
160
|
+
`AppFunctionConfiguration.Provider` and its associated builder entry points:
|
|
161
|
+
|
|
162
|
+
- abstract class BaseChatApplication : Application(), AppFunctionConfiguration.Provider { ... }
|
|
163
|
+
+ abstract class BaseChatApplication : Application()
|
|
164
|
+
|
|
165
|
+
*** ** * ** ***
|
|
166
|
+
|
|
167
|
+
### Avoid redundant abstraction layers
|
|
168
|
+
|
|
169
|
+
Don't attempt to make an `AppFunction` class or method OS-agnostic---AppFunctions
|
|
170
|
+
are inherently part of the Android platform integration through the
|
|
171
|
+
`androidx.appfunctions` package. For architectural cleanliness, use existing
|
|
172
|
+
application functionality, such as existing repositories, use cases, or domain
|
|
173
|
+
orchestrators, to execute the behavior within your `@AppFunction` methods rather
|
|
174
|
+
than creating redundant abstraction layers around the OS service.
|
|
175
|
+
|
|
176
|
+
*** ** * ** ***
|
|
177
|
+
|
|
178
|
+
### Consolidate service and metadata manifest declarations
|
|
179
|
+
|
|
180
|
+
Register the KSP-generated service declaration and `app_metadata` property
|
|
181
|
+
inside your module manifest, for example in `src/main/AndroidManifest.xml`
|
|
182
|
+
within the `<application>` tag:
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
```xml
|
|
186
|
+
<service
|
|
187
|
+
android:name="com.example.snippets.ai.MyAppFunctionService"
|
|
188
|
+
android:permission="android.permission.BIND_APP_FUNCTION_SERVICE"
|
|
189
|
+
android:exported="true"
|
|
190
|
+
tools:targetApi="36">
|
|
191
|
+
<property
|
|
192
|
+
android:name="android.app.appfunctions.schema"
|
|
193
|
+
android:value="app_functions_schema.xsd" />
|
|
194
|
+
<property
|
|
195
|
+
android:name="android.app.appfunctions.v2"
|
|
196
|
+
android:value="my_app_function_service.xml" />
|
|
197
|
+
<intent-filter>
|
|
198
|
+
<action android:name="android.app.appfunctions.AppFunctionService" />
|
|
199
|
+
</intent-filter>
|
|
200
|
+
</service>
|
|
201
|
+
<property
|
|
202
|
+
android:name="android.app.appfunctions.app_metadata"
|
|
203
|
+
android:resource="@xml/app_metadata" />
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
<br />
|
|
207
|
+
|
|
208
|
+
*** ** * ** ***
|
|
209
|
+
|
|
210
|
+
## Verification and troubleshooting
|
|
211
|
+
|
|
212
|
+
1. **Clean rebuild and deploy** : `bash
|
|
213
|
+
./gradlew clean installDebug`
|
|
214
|
+
2. **Verify AppSearch discovery / indexing** : Run the following ADB command to
|
|
215
|
+
confirm the OS successfully discovered and indexed your functions:
|
|
216
|
+
`bash
|
|
217
|
+
adb shell cmd app_function list-app-functions`
|
|
218
|
+
*If your package doesn't appear, confirm that `android.app.appfunctions.v2`
|
|
219
|
+
matches the exact asset name generated in `assets/`.*
|
|
220
|
+
|
|
221
|
+
3. **Verify execution using ADB** :
|
|
222
|
+
`bash
|
|
223
|
+
adb shell "cmd app_function execute-app-function \
|
|
224
|
+
--package com.example.chatapp \
|
|
225
|
+
--function 'com.example.chatapp.appfunctions.BaseAppFunctionService#send' \
|
|
226
|
+
--parameters '{\"name\": \"Alice\", \"endpointValue\": \"1\", \"messageBody\": \"Hello Alice!\"}'"`
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
> Adapted from the `ml-kit-genai-prompt-api` skill in [android/skills](https://github.com/android/skills) (Apache-2.0). See `THIRD_PARTY_NOTICES.md`.
|
|
2
|
+
|
|
3
|
+
This skill provides step-by-step guidance for integrating and optimizing the ML
|
|
4
|
+
Kit GenAI Prompt API in Android apps.
|
|
5
|
+
|
|
6
|
+
## Prerequisites
|
|
7
|
+
|
|
8
|
+
- Android API level must be 26 or higher. If `minSdk` is below 26, update it to 26.
|
|
9
|
+
- Add the ML Kit GenAI Prompt API dependency (`com.google.mlkit:genai-prompt`) to the app-level `build.gradle` file, with version at least `1.0.0-beta4`.
|
|
10
|
+
- If `com.google.mlkit:genai-schema-compiler` dependency is used and KSP plugin version is below 2.3.6, update it to 2.3.6.
|
|
11
|
+
|
|
12
|
+
## Detailed steps
|
|
13
|
+
|
|
14
|
+
### 1. Prompt optimization
|
|
15
|
+
|
|
16
|
+
To optimize prompts for use with the ML Kit Prompt API, follow the
|
|
17
|
+
[prompt optimization guide](https://developer.android.com/agents/skills/device-ai/prompt-api/references/prompt-optimization).
|
|
18
|
+
|
|
19
|
+
### 2. Prefix caching optimization
|
|
20
|
+
|
|
21
|
+
If the prompt is more than 200 words, implement the [prefix caching API](https://developer.android.com/agents/skills/device-ai/prompt-api/references/prefix-caching).
|
|
22
|
+
|
|
23
|
+
### 3. Lifecycle and best practices
|
|
24
|
+
|
|
25
|
+
- The model must be fully downloaded and available before calling the first inference. Follow the guide on [implementing a generative model](https://developer.android.com/agents/skills/device-ai/prompt-api/references/get-started) to check that the `FeatureStatus` of a model is `AVAILABLE` before making an inference.
|
|
26
|
+
- Release ML Kit instances by calling `close()` when an `Activity`,
|
|
27
|
+
`Fragment`, or `ViewModel` is destroyed. Example:
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
```kotlin
|
|
31
|
+
// Instantiating model in activity, fragment, or ViewModel
|
|
32
|
+
val generativeModel = Generation.getClient()
|
|
33
|
+
|
|
34
|
+
// When activity, fragment, or ViewModel is destroyed
|
|
35
|
+
generativeModel.close()
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
<br />
|
|
39
|
+
|
|
40
|
+
### 4. Structured output
|
|
41
|
+
|
|
42
|
+
When implementing or refactoring a prompt to use structured output, follow
|
|
43
|
+
these rules:
|
|
44
|
+
|
|
45
|
+
1. **Check for API availability:** Verify Structured Output feature is available on the device with `isStructuredOutputFeatureAvailable()` before using it. Refer to the [Structured Output API guide](https://developer.android.com/agents/skills/device-ai/prompt-api/references/structured-output) for full instructions.
|
|
46
|
+
2. **Return type:** Return the `@Generable` typed object from the function
|
|
47
|
+
signature instead of a `String` or JSON string.
|
|
48
|
+
|
|
49
|
+
For example:
|
|
50
|
+
|
|
51
|
+
fun parseEmail(email: String): String {
|
|
52
|
+
...
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
should be refactored to:
|
|
56
|
+
|
|
57
|
+
fun parseEmail(email: String): ParsedEmail? {
|
|
58
|
+
...
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
3. **Example:**
|
|
62
|
+
|
|
63
|
+
This is the example code before refactoring:
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
```kotlin
|
|
67
|
+
suspend fun parseEmail(email: String): String {
|
|
68
|
+
val parseEmailPrompt = "Parse this email and return the sender, title, and short summary of the email less than 10 words: "
|
|
69
|
+
|
|
70
|
+
val parsedEmail = generativeModel.generateContent(parseEmailPrompt + email)
|
|
71
|
+
|
|
72
|
+
return parsedEmail.candidates[0].text
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
<br />
|
|
77
|
+
|
|
78
|
+
This is the example code after using Structured Output API:
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
```kotlin
|
|
82
|
+
@Generable
|
|
83
|
+
data class ParsedEmail(
|
|
84
|
+
@Guide(description = "Sender of the email")
|
|
85
|
+
var sender: String = "",
|
|
86
|
+
|
|
87
|
+
@Guide(description = "Title of the email")
|
|
88
|
+
var title: String = "",
|
|
89
|
+
|
|
90
|
+
@Guide(description = "Summary of the email less than 10 words")
|
|
91
|
+
var summary: String = ""
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
suspend fun parseEmail(email: String): ParsedEmail? {
|
|
95
|
+
val parseEmailPrompt =
|
|
96
|
+
"Parse this email: $email"
|
|
97
|
+
|
|
98
|
+
val baseRequest = GenerateContentRequest.Builder(TextPart(parseEmailPrompt)).build()
|
|
99
|
+
val typedRequest = generateTypedContentRequest(baseRequest, ParsedEmail::class)
|
|
100
|
+
val typedResponse = generativeModel.generateContent(typedRequest)
|
|
101
|
+
return typedResponse.candidates[0].response
|
|
102
|
+
}
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
<br />
|
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
This page describes how to do the following:
|
|
2
|
+
|
|
3
|
+
- Configure your project to use Prompt API
|
|
4
|
+
- Provide text-only input and receive a response
|
|
5
|
+
- Provide an image input with related text input and receive a response
|
|
6
|
+
|
|
7
|
+
For more details about the Prompt API, see the
|
|
8
|
+
reference documentation for Kotlin ([com.google.mlkit.genai.prompt](https://developer.android.com/android/reference/kotlin/com/google/mlkit/genai/prompt/package-summary)) and
|
|
9
|
+
Java ([com.google.mlkit.genai.prompt.java](https://developer.android.com/android/reference/com/google/mlkit/genai/prompt/java/package-summary),
|
|
10
|
+
[com.google.mlkit.genai.prompt](https://developer.android.com/android/reference/com/google/mlkit/genai/prompt/package-summary)).
|
|
11
|
+
|
|
12
|
+
## Configure project
|
|
13
|
+
|
|
14
|
+
> [!NOTE]
|
|
15
|
+
> **Note:** This API requires Android API level 26 or higher.
|
|
16
|
+
|
|
17
|
+
Add the ML Kit Prompt API as a dependency in your `build.gradle` configuration:
|
|
18
|
+
|
|
19
|
+
implementation("com.google.mlkit:genai-prompt:1.0.0-beta2")
|
|
20
|
+
|
|
21
|
+
If you need your responses in a certain format using the Structured Output API,
|
|
22
|
+
you need to configure KSP and add additional dependencies. For details, see
|
|
23
|
+
[Generate structured output](https://developer.android.com/agents/skills/device-ai/prompt-api/references/structured-output).
|
|
24
|
+
|
|
25
|
+
## Implement generative model
|
|
26
|
+
|
|
27
|
+
To implement the code in your project, follow these steps:
|
|
28
|
+
|
|
29
|
+
- Create a `generativeModel` object:
|
|
30
|
+
|
|
31
|
+
### Kotlin
|
|
32
|
+
|
|
33
|
+
// Get a GenerativeModel instance
|
|
34
|
+
val generativeModel = Generation.getClient()
|
|
35
|
+
|
|
36
|
+
### Java
|
|
37
|
+
|
|
38
|
+
// Get a GenerativeModel instance
|
|
39
|
+
GenerativeModelFutures generativeModelFutures = GenerativeModelFutures
|
|
40
|
+
.from(Generation.INSTANCE.getClient());
|
|
41
|
+
|
|
42
|
+
- Check if Gemini Nano is `AVAILABLE,` `DOWNLOADABLE`, or `UNAVAILABLE`. Then,
|
|
43
|
+
download the feature if it is downloadable:
|
|
44
|
+
|
|
45
|
+
### Kotlin
|
|
46
|
+
|
|
47
|
+
val status = generativeModel.checkStatus()
|
|
48
|
+
when (status) {
|
|
49
|
+
FeatureStatus.UNAVAILABLE -> {
|
|
50
|
+
// Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
FeatureStatus.DOWNLOADABLE -> {
|
|
54
|
+
// Gemini Nano can be downloaded on this device, but is not currently downloaded
|
|
55
|
+
generativeModel.download().collect { status ->
|
|
56
|
+
when (status) {
|
|
57
|
+
is DownloadStatus.DownloadStarted ->
|
|
58
|
+
Log.d(TAG, "starting download for Gemini Nano")
|
|
59
|
+
|
|
60
|
+
is DownloadStatus.DownloadProgress ->
|
|
61
|
+
Log.d(TAG, "Nano ${status.totalBytesDownloaded} bytes downloaded")
|
|
62
|
+
|
|
63
|
+
DownloadStatus.DownloadCompleted -> {
|
|
64
|
+
Log.d(TAG, "Gemini Nano download complete")
|
|
65
|
+
modelDownloaded = true
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
is DownloadStatus.DownloadFailed -> {
|
|
69
|
+
Log.e(TAG, "Nano download failed ${status.e.message}")
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
FeatureStatus.DOWNLOADING -> {
|
|
76
|
+
// Gemini Nano currently being downloaded
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
FeatureStatus.AVAILABLE -> {
|
|
80
|
+
// Gemini Nano currently downloaded and available to use on this device
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
### Java
|
|
85
|
+
|
|
86
|
+
ListenableFuture<Integer> status = generativeModelFutures.checkStatus();
|
|
87
|
+
Futures.addCallback(generativeModelFutures.checkStatus(), new FutureCallback<>() {
|
|
88
|
+
@Override
|
|
89
|
+
public void onSuccess(Integer featureStatus) {
|
|
90
|
+
switch (featureStatus) {
|
|
91
|
+
case FeatureStatus.AVAILABLE -> {
|
|
92
|
+
// Gemini Nano currently downloaded and available to use on this device
|
|
93
|
+
}
|
|
94
|
+
case FeatureStatus.UNAVAILABLE -> {
|
|
95
|
+
// Gemini Nano not supported on this device or device hasn't fetched the latest configuration to support it
|
|
96
|
+
}
|
|
97
|
+
case FeatureStatus.DOWNLOADING -> {
|
|
98
|
+
// Gemini Nano currently being downloaded
|
|
99
|
+
}
|
|
100
|
+
case FeatureStatus.DOWNLOADABLE -> {
|
|
101
|
+
generativeModelFutures.download(new DownloadCallback() {
|
|
102
|
+
@Override
|
|
103
|
+
public void onDownloadStarted(long l) {
|
|
104
|
+
Log.d(TAG, "starting download for Gemini Nano");
|
|
105
|
+
}
|
|
106
|
+
@Override
|
|
107
|
+
public void onDownloadProgress(long l) {
|
|
108
|
+
Log.d(TAG, "Nano " + l + " bytes downloaded");
|
|
109
|
+
}
|
|
110
|
+
@Override
|
|
111
|
+
public void onDownloadCompleted() {
|
|
112
|
+
Log.d(TAG, "Gemini Nano download complete");
|
|
113
|
+
}
|
|
114
|
+
@Override
|
|
115
|
+
public void onDownloadFailed(@NonNull GenAiException e) {
|
|
116
|
+
Log.e(TAG, "Nano download failed: " + e.getMessage());
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
@Override
|
|
123
|
+
public void onFailure(@NonNull Throwable t) {
|
|
124
|
+
// Failed to check status
|
|
125
|
+
}
|
|
126
|
+
}, ContextCompat.getMainExecutor(context));
|
|
127
|
+
|
|
128
|
+
## Provide text-only input
|
|
129
|
+
|
|
130
|
+
### Kotlin
|
|
131
|
+
|
|
132
|
+
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog.")
|
|
133
|
+
|
|
134
|
+
### Java
|
|
135
|
+
|
|
136
|
+
GenerateContentResponse response = generativeModelFutures.generateContent(
|
|
137
|
+
new GenerateContentRequest.Builder(
|
|
138
|
+
new TextPart("Write a 3 sentence story about a magical dog."))
|
|
139
|
+
.build())
|
|
140
|
+
.get();
|
|
141
|
+
|
|
142
|
+
Alternatively, add optional parameters:
|
|
143
|
+
|
|
144
|
+
### Kotlin
|
|
145
|
+
|
|
146
|
+
val response = generativeModel.generateContent(
|
|
147
|
+
generateContentRequest(
|
|
148
|
+
TextPart("Write a 3 sentence story about a magical dog."),
|
|
149
|
+
) {
|
|
150
|
+
// Optional parameters
|
|
151
|
+
temperature = 0.2f
|
|
152
|
+
topK = 10
|
|
153
|
+
candidateCount = 3
|
|
154
|
+
},
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
### Java
|
|
158
|
+
|
|
159
|
+
GenerateContentRequest.Builder requestBuilder =
|
|
160
|
+
new GenerateContentRequest.Builder(
|
|
161
|
+
new TextPart("Write a 3 sentence story about a magical dog."));
|
|
162
|
+
requestBuilder.setTemperature(.2f);
|
|
163
|
+
requestBuilder.setTopK(10);
|
|
164
|
+
requestBuilder.setCandidateCount(3);
|
|
165
|
+
|
|
166
|
+
GenerateContentResponse response =
|
|
167
|
+
generativeModelFutures.generateContent(requestBuilder.build()).get();
|
|
168
|
+
|
|
169
|
+
For more information about the optional parameters, see [Optional
|
|
170
|
+
configurations](https://developer.android.com/agents/skills/device-ai/ml-kit-genai-prompt-api/references/get-started#optional-configurations).
|
|
171
|
+
|
|
172
|
+
## Provide multimodal (image and text) input
|
|
173
|
+
|
|
174
|
+
Bundle an image and a text input together in the `generateContentRequest()`
|
|
175
|
+
function, with the text prompt being a question or command related to the
|
|
176
|
+
image. You can bundle multiple images and text together in the same request.
|
|
177
|
+
|
|
178
|
+
### Kotlin
|
|
179
|
+
|
|
180
|
+
val response = generativeModel.generateContent(
|
|
181
|
+
generateContentRequest(ImagePart(bitmap), TextPart(textPrompt)) {
|
|
182
|
+
// optional parameters
|
|
183
|
+
...
|
|
184
|
+
},
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
### Java
|
|
188
|
+
|
|
189
|
+
GenerateContentResponse response = generativeModelFutures.generateContent(
|
|
190
|
+
new GenerateContentRequest.Builder(
|
|
191
|
+
new ImagePart(bitmap),
|
|
192
|
+
new TextPart("textPrompt"))
|
|
193
|
+
// optional parameters
|
|
194
|
+
.build())
|
|
195
|
+
.get();
|
|
196
|
+
|
|
197
|
+
## Process inference result
|
|
198
|
+
|
|
199
|
+
- Run the inference and retrieve the result. You can choose to either wait for
|
|
200
|
+
the full result or stream the response as it's generated for both text-only
|
|
201
|
+
and multimodal prompts.
|
|
202
|
+
|
|
203
|
+
- This uses non-streaming inference, which retrieves the entire result from
|
|
204
|
+
the AI model before returning the result:
|
|
205
|
+
|
|
206
|
+
### Kotlin
|
|
207
|
+
|
|
208
|
+
// Call the AI model to generate content and store the complete
|
|
209
|
+
// in a new variable named 'response' once it's finished
|
|
210
|
+
val response = generativeModel.generateContent("Write a 3 sentence story about a magical dog")
|
|
211
|
+
|
|
212
|
+
### Java
|
|
213
|
+
|
|
214
|
+
GenerateContentResponse response = generativeModelFutures.generateContent(
|
|
215
|
+
new GenerateContentRequest.Builder(
|
|
216
|
+
new TextPart("Write a 3 sentence story about a magical dog."))
|
|
217
|
+
.build())
|
|
218
|
+
.get();
|
|
219
|
+
|
|
220
|
+
- The following snippets are examples of using streaming inference, which
|
|
221
|
+
retrieves the result in chunks as it's being generated:
|
|
222
|
+
|
|
223
|
+
### Kotlin
|
|
224
|
+
|
|
225
|
+
// Streaming inference
|
|
226
|
+
var fullResponse = ""
|
|
227
|
+
generativeModel.generateContentStream("Write a 3 sentence story about a magical dog").collect { chunk ->
|
|
228
|
+
val newChunkReceived = chunk.candidates[0].text
|
|
229
|
+
print(newChunkReceived)
|
|
230
|
+
fullResponse += newChunkReceived
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
### Java
|
|
234
|
+
|
|
235
|
+
// Streaming inference
|
|
236
|
+
StringBuilder fullResponse = new StringBuilder();
|
|
237
|
+
generativeModelFutures.generateContent(new GenerateContentRequest.Builder(
|
|
238
|
+
(new TextPart("Write a 3 sentence story about a magical dog"))).build(),
|
|
239
|
+
chunk -> {
|
|
240
|
+
Log.d(TAG, chunk);
|
|
241
|
+
fullResponse.append(chunk);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
For more information about streaming and non-streaming inference, see [Streaming
|
|
245
|
+
versus non-streaming](https://developer.android.com/ml-kit/genai#streaming-vs-non).
|
|
246
|
+
|
|
247
|
+
## Latency optimization
|
|
248
|
+
|
|
249
|
+
To optimize for the first inference call, your application may optionally call
|
|
250
|
+
`warmup()`. This loads Gemini Nano into memory and initializes runtime
|
|
251
|
+
components.
|
|
252
|
+
|
|
253
|
+
## Optional configurations
|
|
254
|
+
|
|
255
|
+
As part of each `GenerateContentRequest`, you can set the following optional
|
|
256
|
+
parameters:
|
|
257
|
+
|
|
258
|
+
- `temperature` : Controls the degree of randomness in token selection.
|
|
259
|
+
- `seed` : Enables generating stable and deterministic results.
|
|
260
|
+
- `topK` : Controls randomness and diversity in results.
|
|
261
|
+
- `candidateCount` : Requests the number of unique responses returned. Note that the exact number of responses may not be the same as `candidateCount` because duplicate responses are automatically removed.
|
|
262
|
+
- `maxOutputTokens` : Defines the maximum number of tokens that can be generated in the response.
|
|
263
|
+
|
|
264
|
+
For more guidance on setting optional configurations, see
|
|
265
|
+
[`GenerateContentRequest`](https://developer.android.com/android/reference/kotlin/com/google/mlkit/genai/prompt/GenerateContentRequest).
|
|
266
|
+
|
|
267
|
+
## Supported features and limitations
|
|
268
|
+
|
|
269
|
+
- Input must be under 4000 tokens (or approximately 3000 English words). For more information, see the [`countTokens`](https://developer.android.com/android/reference/com/google/mlkit/genai/prompt/GenerativeModel#countTokens(com.google.mlkit.genai.prompt.GenerateContentRequest)) reference.
|
|
270
|
+
- Use cases that require long output (more than 4K tokens) should be avoided.
|
|
271
|
+
- AICore enforces an inference quota per app. For more information, see [Quota
|
|
272
|
+
per application](https://developer.android.com/ml-kit/genai#quota-per).
|