reis-mobile 0.4.0 → 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 +15 -0
- package/README.md +35 -204
- package/THIRD_PARTY_NOTICES.md +10 -13
- package/agents/android-performance-engineer.md +2 -2
- package/agents/mobile-code-reviewer.md +2 -0
- package/agents/rn-architect.md +1 -1
- package/commands/debug.md +1 -1
- package/core/registry/registry.mjs +18 -11
- package/package.json +24 -3
- package/skills/mobile-android/SKILL.md +29 -0
- package/skills/{android-agp-9-upgrade/SKILL.md → mobile-android/references/build-and-performance/agp-9-upgrade/GUIDE.md} +1 -20
- package/skills/{android-cli/SKILL.md → mobile-android/references/build-and-performance/android-cli/GUIDE.md} +1 -25
- package/skills/{android-profiler/SKILL.md → mobile-android/references/build-and-performance/android-profiler/GUIDE.md} +1 -27
- package/skills/{android-r8-analyzer/SKILL.md → mobile-android/references/build-and-performance/r8-analyzer/GUIDE.md} +1 -20
- package/skills/mobile-android/references/build-and-performance.md +12 -0
- package/skills/{android-display-glasses-with-jetpack-compose-glimmer/SKILL.md → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer/GUIDE.md} +1 -24
- package/skills/{android-leanback-to-compose-tv-migration/SKILL.md → mobile-android/references/devices/leanback-to-compose-tv-migration/GUIDE.md} +1 -37
- package/skills/{android-wear-compose-m3/SKILL.md → mobile-android/references/devices/wear-compose-m3/GUIDE.md} +1 -25
- package/skills/mobile-android/references/devices.md +11 -0
- package/skills/{android-restore-credentials/SKILL.md → mobile-android/references/identity/restore-credentials/GUIDE.md} +1 -23
- package/skills/{android-verified-email/SKILL.md → mobile-android/references/identity/verified-email/GUIDE.md} +1 -28
- package/skills/mobile-android/references/identity.md +10 -0
- package/skills/{android-camerax/SKILL.md → mobile-android/references/media/camerax/GUIDE.md} +1 -30
- package/skills/{android-media3-cast-integration/SKILL.md → mobile-android/references/media/media3-cast-integration/GUIDE.md} +1 -24
- package/skills/mobile-android/references/media.md +10 -0
- package/skills/{android-appfunctions/SKILL.md → mobile-android/references/on-device-ai/appfunctions/GUIDE.md} +1 -24
- package/skills/{android-ml-kit-genai-prompt-api/SKILL.md → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api/GUIDE.md} +1 -20
- package/skills/mobile-android/references/on-device-ai.md +10 -0
- package/skills/{android-engage-sdk-integration/SKILL.md → mobile-android/references/play/engage-sdk-integration/GUIDE.md} +1 -19
- package/skills/{android-play-billing-library-version-upgrade/SKILL.md → mobile-android/references/play/play-billing-library-version-upgrade/GUIDE.md} +1 -22
- package/skills/{android-play-policy-insights/SKILL.md → mobile-android/references/play/play-policy-insights/GUIDE.md} +1 -43
- package/skills/mobile-android/references/play.md +11 -0
- package/skills/{android-adaptive/SKILL.md → mobile-android/references/ui/adaptive/GUIDE.md} +1 -25
- package/skills/{android-edge-to-edge/SKILL.md → mobile-android/references/ui/edge-to-edge/GUIDE.md} +1 -21
- package/skills/{android-migrate-xml-views-to-jetpack-compose/SKILL.md → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose/GUIDE.md} +1 -24
- package/skills/{android-navigation-3/SKILL.md → mobile-android/references/ui/navigation-3/GUIDE.md} +1 -37
- package/skills/{android-navigation-event/SKILL.md → mobile-android/references/ui/navigation-event/GUIDE.md} +1 -25
- package/skills/{android-styles/SKILL.md → mobile-android/references/ui/styles/GUIDE.md} +1 -21
- 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/{flutter-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/{flutter-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/{flutter-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/{flutter-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/{android-code-review/SKILL.md → mobile-code-review/references/android.md} +1 -8
- package/skills/{flutter-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/{flutter-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/{ios-code-review/SKILL.md → mobile-code-review/references/ios.md} +1 -8
- package/skills/mobile-code-review/references/react-native.md +58 -0
- package/skills/mobile-debug/SKILL.md +50 -0
- package/skills/{android-gradle-build-debug/SKILL.md → mobile-debug/references/android/gradle-build.md} +0 -8
- package/skills/mobile-debug/references/android.md +26 -0
- package/skills/{flutter-build-debug/SKILL.md → mobile-debug/references/flutter/build.md} +5 -13
- 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/{flutter-dart-resolve-package-conflicts/SKILL.md → mobile-debug/references/flutter/package-conflicts.md} +2 -11
- package/skills/{flutter-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/{ios-cocoapods-debug/SKILL.md → mobile-debug/references/ios/cocoapods.md} +1 -9
- package/skills/{ios-xcode-build-debug/SKILL.md → mobile-debug/references/ios/xcode-build.md} +0 -8
- package/skills/mobile-debug/references/ios.md +23 -0
- package/skills/mobile-debug/references/react-native.md +43 -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/{flutter-dart-3-updates/SKILL.md → mobile-flutter/references/dart/dart-3.md} +1 -8
- package/skills/{flutter-effective-dart/SKILL.md → mobile-flutter/references/dart/effective-dart.md} +1 -8
- package/skills/{flutter-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/{android-intent-security/SKILL.md → mobile-security/references/android/intent-security.md} +1 -28
- 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-security-audit/SKILL.md +0 -101
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/android/build/migrate-to-built-in-kotlin.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/android/build/releases/agp-9-0-0-release-notes.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/buildconfig.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/ksp-kapt.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/paparazzi-gradle-9.md +0 -0
- /package/skills/{android-agp-9-upgrade → mobile-android/references/build-and-performance/agp-9-upgrade}/references/recipes.md +0 -0
- /package/skills/{android-cli → mobile-android/references/build-and-performance/android-cli}/references/interact.md +0 -0
- /package/skills/{android-cli → mobile-android/references/build-and-performance/android-cli}/references/journeys.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/analysis_orchestrator.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-sql/perfetto_sql.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/analysis/workflows/perfetto-trace-analysis/references/triage.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/recording_orchestrator.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/env_setup.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/perfetto/setup.md +0 -0
- /package/skills/{android-profiler → mobile-android/references/build-and-performance/android-profiler}/references/perfetto/sql.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/CONFIGURATION-ANALYZER.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/CONFIGURATION.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/KEEP-RULES-IMPACT-HIERARCHY.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REDUNDANT-RULES.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REFLECTION-GUIDE.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/REPORT_FORMAT.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/android/topic/performance/app-optimization/enable-app-optimization.md +0 -0
- /package/skills/{android-r8-analyzer → mobile-android/references/build-and-performance/r8-analyzer}/references/android/training/testing/other-components/ui-automator.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/button-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/button-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/card-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/card-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/deptheffect-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/deptheffectlevels-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/glimmersansflextypography-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/glimmertheme-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/icon-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/iconbutton-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/iconsizes-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/list-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/listitem-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/liststate-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/material-hct-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/projectedcontext-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stack-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stackitemscope-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/stackstate-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/surface-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/titlechip-samples-source.md +0 -0
- /package/skills/{android-display-glasses-with-jetpack-compose-glimmer → mobile-android/references/devices/display-glasses-with-jetpack-compose-glimmer}/references/titlechip-source.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/get-started/navigation.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/playback/compose/browse.md +0 -0
- /package/skills/{android-leanback-to-compose-tv-migration → mobile-android/references/devices/leanback-to-compose-tv-migration}/references/android/training/tv/playback/compose/index.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/android/training/wearables/compose/migrate-to-material3.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/AmbientModeSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/AmbientModeSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/CurvedWorldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/CurvedWorldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ExpandableSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ExpandableSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/HierarchicalFocusSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/HierarchicalFocusSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/PagerSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/PagerSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/RotarySamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/RotarySamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ScalingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/ScalingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToDismissBoxSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToDismissBoxSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToRevealSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/SwipeToRevealSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/TransformingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/foundation/TransformingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AlertDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AlertDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AnimatedTextSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/AnimatedTextSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonGroupSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonGroupSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CardSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CardSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CheckboxButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CheckboxButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ConfirmationDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ConfirmationDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CurvedTextSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/CurvedTextSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DatePickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DatePickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DynamicColorSchemeSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/DynamicColorSchemeSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/EdgeButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/EdgeButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/FadingExpandingLabelSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/FadingExpandingLabelSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconToggleButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/IconToggleButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LevelIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LevelIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LinearProgressIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/LinearProgressIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ListHeaderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ListHeaderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OneHandedGestureSamples.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OneHandedGestureSamples.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OpenOnPhoneDialogSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/OpenOnPhoneDialogSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PageIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PageIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PagerScaffoldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PagerScaffoldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerGroupSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerGroupSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PlaceholderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/PlaceholderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ProgressIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ProgressIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/RadioButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/RadioButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScaffoldSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScaffoldSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollAwaySample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollAwaySample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollIndicatorSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/ScrollIndicatorSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SliderSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SliderSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/StepperSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/StepperSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SurfaceTransformationSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SurfaceTransformationSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToDismissBoxSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToDismissBoxSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToRevealSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwipeToRevealSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwitchButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/SwitchButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextToggleButtonSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TextToggleButtonSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimePickerSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimePickerSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimeTextSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TimeTextSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformationSpecSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformationSpecSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnNotificationsSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnSample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/material3/TransformingLazyColumnSample.kt.md.txt +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +0 -0
- /package/skills/{android-wear-compose-m3 → mobile-android/references/devices/wear-compose-m3}/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/guide/topics/manifest/application-element.md +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/identity/passkeys/create-passkeys.md +0 -0
- /package/skills/{android-restore-credentials → mobile-android/references/identity/restore-credentials}/references/android/identity/passkeys/sign-in-with-passkeys.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/credential-manager/index.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/credential-verifier.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/email-verification-implementation.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/email-verification.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/digital-credentials/index.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/passkeys/create-passkeys.md +0 -0
- /package/skills/{android-verified-email → mobile-android/references/identity/verified-email}/references/android/identity/sign-in/credential-manager-webview.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/camera1-to-camerax.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/camera2-to-camerax.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/expert-blueprints.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/foldables.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/immutability.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/low-light.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/mlkit-spatial.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/modern-apis.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/testing.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/thermals.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/wear-os.md +0 -0
- /package/skills/{android-camerax → mobile-android/references/media/camerax}/references/xr.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/create-castplayer.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/customize-castoptions.md +0 -0
- /package/skills/{android-media3-cast-integration → mobile-android/references/media/media3-cast-integration}/references/android/media/media3/cast/index.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/adb-interaction-testing.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/context.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/feature-discovery-analysis.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/implementation-configuration.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/kdoc-refinement-optimization.md +0 -0
- /package/skills/{android-appfunctions → mobile-android/references/on-device-ai/appfunctions}/references/migrate-to-service-entry-point.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/get-started.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prefix-caching.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prompt-design.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/prompt-optimization.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/structured-output.md +0 -0
- /package/skills/{android-ml-kit-genai-prompt-api → mobile-android/references/on-device-ai/ml-kit-genai-prompt-api}/references/system-instructions.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/faq.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/food.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/healthandfitness.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/listen.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/otherverticals.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/read.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/shopping.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/social.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/travel.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/continue-watching/index.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/entitlements.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/getting-started.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/tv/recommendations.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/android/guide/playcore/engage/watch.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/clusters.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/common.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/patterns.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/requests.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/food.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/listen.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/other.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/read.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/shopping.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/social.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/travel.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/tv.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/schemas/watch.md +0 -0
- /package/skills/{android-engage-sdk-integration → mobile-android/references/play/engage-sdk-integration}/references/troubleshooting.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/android/google/play/billing/release-notes.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/migration-logic.md +0 -0
- /package/skills/{android-play-billing-library-version-upgrade → mobile-android/references/play/play-billing-library-version-upgrade}/references/version-checklist.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/common_mandates.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/compliance_report_template.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/critic.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_data_safety.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_permissions_and_apis.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/goal_user_account.md +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/policies.json +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/resources/scanner_config.json +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/generate_report.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/orchestrator.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/play_store_scraper.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/scanner.py +0 -0
- /package/skills/{android-play-policy-insights → mobile-android/references/play/play-policy-insights}/scripts/template_engine.py +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/develop/ui/compose/tooling/debug.md +0 -0
- /package/skills/{android-adaptive → mobile-android/references/ui/adaptive}/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/analysis-of-the-project-and-layout.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/identify-optimal-xml-candidate.md +0 -0
- /package/skills/{android-migrate-xml-views-to-jetpack-compose → mobile-android/references/ui/migrate-xml-views-to-jetpack-compose}/references/xml-layout-migration.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/index.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/migration-guide.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/animations.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basic.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/common-ui.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/conditional.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/dialog.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/results-event.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/results-state.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +0 -0
- /package/skills/{android-navigation-3 → mobile-android/references/ui/navigation-3}/references/android/guide/navigation/type-safe-destinations.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/dispatcher.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/handle-back.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/index.md +0 -0
- /package/skills/{android-navigation-event → mobile-android/references/ui/navigation-event}/references/android/guide/navigation/navigation-event/setup.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/designsystems/custom.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/fundamentals.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/state-animations.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +0 -0
- /package/skills/{android-styles → mobile-android/references/ui/styles}/references/android/develop/ui/compose/styles/theming.md +0 -0
- /package/skills/{flutter-dart-use-pattern-matching → mobile-flutter/references/dart/pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# iOS platform features
|
|
2
|
+
|
|
3
|
+
## Permissions
|
|
4
|
+
|
|
5
|
+
- Every protected API needs its usage description in `Info.plist` (`NSCameraUsageDescription`, `NSLocationWhenInUseUsageDescription`, `NSPhotoLibraryUsageDescription`...) with text that explains the benefit; a missing key crashes the app when the API is used.
|
|
6
|
+
- Ask in context, when the user starts the feature, and handle denied and restricted states with a path to Settings (`UIApplication.openSettingsURLString`).
|
|
7
|
+
- Photo picking with `PhotosPicker` (SwiftUI) or `PHPickerViewController` needs no library permission.
|
|
8
|
+
|
|
9
|
+
## Push notifications
|
|
10
|
+
|
|
11
|
+
- Enable the Push Notifications capability; request authorization with `UNUserNotificationCenter.current().requestAuthorization(options:)`; register with `UIApplication.shared.registerForRemoteNotifications()`.
|
|
12
|
+
- Implement `UNUserNotificationCenterDelegate` to show notifications in the foreground and handle taps.
|
|
13
|
+
- Rich media needs a Notification Service Extension; silent pushes need the Background Modes → Remote notifications capability and are throttled by the system.
|
|
14
|
+
- With Firebase Cloud Messaging, follow `mobile-firebase`.
|
|
15
|
+
|
|
16
|
+
## Universal links and URL schemes
|
|
17
|
+
|
|
18
|
+
- Universal links: add the Associated Domains capability (`applinks:example.com`) and host `apple-app-site-association` on the domain over HTTPS.
|
|
19
|
+
- Handle incoming URLs with `.onOpenURL` (SwiftUI) or the scene delegate, route through the navigation model, and validate parameters before acting.
|
|
20
|
+
- Custom URL schemes can be claimed by other apps; do not use them for authentication callbacks or privileged actions.
|
|
21
|
+
|
|
22
|
+
## Background work
|
|
23
|
+
|
|
24
|
+
- `BGTaskScheduler` with `BGAppRefreshTask` for short refreshes and `BGProcessingTask` for longer maintenance; register identifiers in `Info.plist` (`BGTaskSchedulerPermittedIdentifiers`) and schedule again after each run. The system decides when tasks run.
|
|
25
|
+
- Finishing a short task after the app goes to background: `beginBackgroundTask(withName:)` with the matching `endBackgroundTask`.
|
|
26
|
+
|
|
27
|
+
## Widgets, Live Activities and App Intents
|
|
28
|
+
|
|
29
|
+
- Widgets use WidgetKit in an extension target with a `TimelineProvider`; share data with the app through an App Group container, and reload timelines from the app when data changes.
|
|
30
|
+
- Live Activities use ActivityKit and need `NSSupportsLiveActivities` in the app's `Info.plist`.
|
|
31
|
+
- App Intents expose actions to Shortcuts, Siri, Spotlight, widgets and controls; define `AppIntent` types and `AppShortcutsProvider` for discoverable shortcuts.
|
|
32
|
+
|
|
33
|
+
## In-app purchases with StoreKit 2
|
|
34
|
+
|
|
35
|
+
```swift
|
|
36
|
+
let products = try await Product.products(for: ["com.example.pro.monthly"])
|
|
37
|
+
let result = try await products[0].purchase()
|
|
38
|
+
if case .success(let verification) = result, case .verified(let transaction) = verification {
|
|
39
|
+
// unlock content, then:
|
|
40
|
+
await transaction.finish()
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- Start listening to `Transaction.updates` at launch to catch renewals, refunds and purchases made on other devices.
|
|
45
|
+
- Only unlock content for `.verified` transactions; validate entitlements on your server for anything valuable.
|
|
46
|
+
- Test with a StoreKit configuration file in Xcode, then in the sandbox and TestFlight.
|
|
47
|
+
- Check the App Store Review Guidelines on digital goods before choosing a payment method.
|
|
48
|
+
|
|
49
|
+
## Privacy
|
|
50
|
+
|
|
51
|
+
- Keep the app's privacy manifest (`PrivacyInfo.xcprivacy`) accurate: data collected, tracking domains and required-reason APIs. Third-party SDKs must ship their own.
|
|
52
|
+
- Request App Tracking Transparency (`ATTrackingManager`) before tracking across apps, with `NSUserTrackingUsageDescription`.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# iOS UI and navigation
|
|
2
|
+
|
|
3
|
+
## SwiftUI state
|
|
4
|
+
|
|
5
|
+
| Wrapper | Use for |
|
|
6
|
+
|---|---|
|
|
7
|
+
| `@State` | Value state owned by the view; also owns an `@Observable` model the view creates |
|
|
8
|
+
| `@Binding` | Two-way access to state owned by a parent |
|
|
9
|
+
| `@Observable` class (iOS 17+) | A model; views update only for properties they read |
|
|
10
|
+
| `@Bindable` | Bindings to properties of an `@Observable` model the view does not own |
|
|
11
|
+
| `ObservableObject` + `@StateObject` / `@ObservedObject` | Models before iOS 17: `@StateObject` where created, `@ObservedObject` where passed in |
|
|
12
|
+
| `@Environment` | Values and models injected from an ancestor |
|
|
13
|
+
| `@FocusState` | Keyboard focus in forms |
|
|
14
|
+
|
|
15
|
+
A view must not recreate a model it does not own on every update; that resets state.
|
|
16
|
+
|
|
17
|
+
## Navigation
|
|
18
|
+
|
|
19
|
+
```swift
|
|
20
|
+
enum Route: Hashable { case order(Order.ID), settings }
|
|
21
|
+
|
|
22
|
+
struct RootView: View {
|
|
23
|
+
@State private var path: [Route] = []
|
|
24
|
+
|
|
25
|
+
var body: some View {
|
|
26
|
+
NavigationStack(path: $path) {
|
|
27
|
+
OrdersList(onSelect: { path.append(.order($0)) })
|
|
28
|
+
.navigationDestination(for: Route.self) { route in
|
|
29
|
+
switch route {
|
|
30
|
+
case .order(let id): OrderDetail(id: id)
|
|
31
|
+
case .settings: SettingsView()
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
- `NavigationStack` with a path (iOS 16+) makes deep links and state restoration possible; `NavigationView` is deprecated.
|
|
40
|
+
- Pass identifiers in routes, not whole models.
|
|
41
|
+
- Sheets and full-screen covers are driven by optional state (`.sheet(item:)`), not booleans plus separate data.
|
|
42
|
+
|
|
43
|
+
## Lists and forms
|
|
44
|
+
|
|
45
|
+
- `List` and `LazyVStack` need stable identity: `Identifiable` models, not indices, for data that changes.
|
|
46
|
+
- Heavy work does not belong in `body`: format, sort and filter in the model.
|
|
47
|
+
- Forms: `Form`, `TextField` with `.textContentType` and `.keyboardType`, `@FocusState` to move between fields and dismiss the keyboard, validation in the model.
|
|
48
|
+
|
|
49
|
+
## UIKit interop
|
|
50
|
+
|
|
51
|
+
- Use a UIKit view in SwiftUI with `UIViewRepresentable` / `UIViewControllerRepresentable`, coordinating delegates through a `Coordinator`.
|
|
52
|
+
- Embed SwiftUI in UIKit with `UIHostingController`.
|
|
53
|
+
- In UIKit, prefer diffable data sources and compositional layouts for collections.
|
|
54
|
+
|
|
55
|
+
## Accessibility and localization
|
|
56
|
+
|
|
57
|
+
- Support Dynamic Type: system text styles (`.font(.body)`), no fixed heights around text.
|
|
58
|
+
- Label icon-only controls (`.accessibilityLabel`), group related elements, and keep touch targets at least 44×44 points.
|
|
59
|
+
- Test with VoiceOver and the largest accessibility text sizes.
|
|
60
|
+
- Localize user-facing strings with String Catalogs (`.xcstrings`) or `String(localized:)`; SwiftUI `Text("key")` literals are localizable automatically.
|
|
61
|
+
|
|
62
|
+
## Previews
|
|
63
|
+
|
|
64
|
+
`#Preview { OrdersList(orders: .fixtures) }` with fixture data and injected fake services, so previews never hit the network.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-rn
|
|
3
|
+
description: Builds React Native and Expo apps in TypeScript — navigation with React Navigation or Expo Router, lists, forms, styling, gestures and animations with Reanimated, safe areas, accessibility and localization; networking with TanStack Query, response validation, persistence with MMKV, AsyncStorage, SQLite and secure storage; permissions, push notifications, deep links, background tasks, native modules and config plugins; performance with Hermes and the React profiler; and release with EAS Build, EAS Submit and EAS Update or bare Gradle and Xcode builds. Use when writing or changing React Native code, adding a native capability, configuring Expo, preparing a store build or an over-the-air update, or when the user asks how to do something in React Native, even if they do not name the library.
|
|
4
|
+
intents: [performance, release, accessibility]
|
|
5
|
+
stacks: [react-native]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mobile React Native
|
|
9
|
+
|
|
10
|
+
Guides for building React Native and Expo apps. Cross-platform topics live in their own skills and have React Native references there: architecture and state in `mobile-architecture`, tests in `mobile-test`, debugging (Metro, native modules, builds) in `mobile-debug`, code review in `mobile-code-review`, security in `mobile-security` and Firebase in `mobile-firebase`.
|
|
11
|
+
|
|
12
|
+
## Pick the topic
|
|
13
|
+
|
|
14
|
+
| Topic | Read |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Navigation, lists, forms, styling, gestures, animations, accessibility, localization | [references/ui-navigation.md](references/ui-navigation.md) |
|
|
17
|
+
| Networking, server state, validation, persistence, offline | [references/data-networking.md](references/data-networking.md) |
|
|
18
|
+
| Permissions, push, deep links, background work, native modules, config plugins | [references/platform-features.md](references/platform-features.md) |
|
|
19
|
+
| Performance, bundle, EAS Build, store submission and over-the-air updates | [references/performance-release.md](references/performance-release.md) |
|
|
20
|
+
|
|
21
|
+
## Before writing code
|
|
22
|
+
|
|
23
|
+
- Detect the setup: Expo (managed with Continuous Native Generation, or with committed `android/` and `ios/`) or bare React Native; the React Native and Expo SDK versions; whether the New Architecture is enabled.
|
|
24
|
+
- Install libraries with `npx expo install` in Expo projects, so versions match the SDK.
|
|
25
|
+
- Libraries with native code need a new native build (a development build in Expo); they do not work in Expo Go unless the Expo SDK includes them.
|
|
26
|
+
- Native requirements of each platform still apply; see `mobile-ios` and `mobile-android` for store and platform specifics.
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# React Native data and networking
|
|
2
|
+
|
|
3
|
+
## Server state with TanStack Query
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
const queryClient = new QueryClient({ defaultOptions: { queries: { staleTime: 30_000, retry: 2 } } });
|
|
7
|
+
|
|
8
|
+
export function App() {
|
|
9
|
+
return (
|
|
10
|
+
<QueryClientProvider client={queryClient}>
|
|
11
|
+
<RootNavigator />
|
|
12
|
+
</QueryClientProvider>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const useOrder = (orderId: string) =>
|
|
17
|
+
useQuery({ queryKey: ['orders', orderId], queryFn: () => api.orders.get(orderId) });
|
|
18
|
+
|
|
19
|
+
export function useCancelOrder() {
|
|
20
|
+
const queryClient = useQueryClient();
|
|
21
|
+
return useMutation({
|
|
22
|
+
mutationFn: api.orders.cancel,
|
|
23
|
+
onSuccess: () => queryClient.invalidateQueries({ queryKey: ['orders'] }),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
The names are illustrative. Use RTK Query instead if the project is built on Redux Toolkit.
|
|
29
|
+
|
|
30
|
+
- React Native has no window focus or online events: wire `focusManager` to `AppState` and `onlineManager` to NetInfo so queries refetch when the app returns to the foreground or reconnects.
|
|
31
|
+
- Keys include every variable the request depends on.
|
|
32
|
+
|
|
33
|
+
## HTTP client
|
|
34
|
+
|
|
35
|
+
- One typed client on `fetch` (or axios, if the project uses it) with a base URL, auth header injection, token refresh and timeouts. `fetch` has no timeout: use an `AbortController` with a timer.
|
|
36
|
+
- `fetch` does not reject on 4xx/5xx; check `response.ok`.
|
|
37
|
+
- Validate or map responses at the boundary (for example with zod) instead of `as` casts in screens.
|
|
38
|
+
- Base URLs and public config come from app config or EAS environment variables; secrets stay on the backend.
|
|
39
|
+
|
|
40
|
+
## Persistence
|
|
41
|
+
|
|
42
|
+
| Data | Store |
|
|
43
|
+
|---|---|
|
|
44
|
+
| Tokens, credentials | `expo-secure-store` or `react-native-keychain` (Keychain/Keystore) |
|
|
45
|
+
| Preferences, small key-value data | MMKV (`react-native-mmkv`) or AsyncStorage |
|
|
46
|
+
| Relational or large data | SQLite (`expo-sqlite` or the library the project uses), optionally with an ORM such as Drizzle |
|
|
47
|
+
| Files and media | `expo-file-system` or the file library the project uses |
|
|
48
|
+
| Query cache across launches | TanStack Query persisters, for data that is safe to show stale |
|
|
49
|
+
|
|
50
|
+
AsyncStorage is unencrypted and asynchronous; do not store secrets there, and avoid large values.
|
|
51
|
+
|
|
52
|
+
## Offline
|
|
53
|
+
|
|
54
|
+
- Detect connectivity with `@react-native-community/netinfo` to show offline state, but still handle request failures.
|
|
55
|
+
- For offline-first flows, read from local storage, sync from the network into it, and queue writes with retry and a visible pending state.
|
|
56
|
+
|
|
57
|
+
## Real-time
|
|
58
|
+
|
|
59
|
+
WebSockets or server-sent updates must pause or reconnect with `AppState` changes; the OS suspends connections in the background.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# React Native performance and release
|
|
2
|
+
|
|
3
|
+
## Measure before optimizing
|
|
4
|
+
|
|
5
|
+
- The React profiler in React Native DevTools (or the DevTools version for the project's React Native release) to find components that re-render.
|
|
6
|
+
- The performance monitor for JavaScript and UI frame rates; native profilers (Instruments, Android Studio) for native modules and startup.
|
|
7
|
+
- Test performance in release builds on real devices: development builds are much slower.
|
|
8
|
+
|
|
9
|
+
## Common fixes
|
|
10
|
+
|
|
11
|
+
- **Re-renders:** narrow context values, memoize expensive children with stable props, select store slices, keep fast-changing state local.
|
|
12
|
+
- **Lists:** virtualized lists with stable keys and memoized rows (see `ui-navigation.md`).
|
|
13
|
+
- **JavaScript thread:** move animations to Reanimated worklets; defer heavy work until after interactions; avoid large synchronous JSON parsing during navigation.
|
|
14
|
+
- **Startup:** keep Hermes enabled, avoid importing heavy modules at the entry point, show the first screen before loading optional data.
|
|
15
|
+
- **Bundle and size:** remove unused dependencies, check which libraries pull large native SDKs, and remove `console.log` in release builds.
|
|
16
|
+
|
|
17
|
+
## Versioning
|
|
18
|
+
|
|
19
|
+
- User-facing version: `version` in the Expo app config, or the native version fields in bare projects (`versionName` on Android, `MARKETING_VERSION` on iOS).
|
|
20
|
+
- Build numbers: iOS `buildNumber` and Android `versionCode` must increase for every store upload. EAS can manage them with `appVersionSource: "remote"` and `autoIncrement` in `eas.json`.
|
|
21
|
+
|
|
22
|
+
## Building
|
|
23
|
+
|
|
24
|
+
**Expo / EAS:**
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
eas build --platform ios --profile production
|
|
28
|
+
eas build --platform android --profile production
|
|
29
|
+
eas submit --platform ios --latest
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- Build profiles live in `eas.json` (development, preview, production); credentials are managed by EAS or provided by the team.
|
|
33
|
+
- Environment variables per environment are configured in EAS; values available to the app code are public.
|
|
34
|
+
|
|
35
|
+
**Bare React Native:** `./gradlew bundleRelease` in `android/` for an AAB, and an Xcode archive for iOS; store requirements and signing follow `mobile-android` and `mobile-ios`.
|
|
36
|
+
|
|
37
|
+
## Over-the-air updates
|
|
38
|
+
|
|
39
|
+
- EAS Update (or the update service the project uses) ships JavaScript and asset changes only. Anything that changes native code, native config or config plugins needs a new store build.
|
|
40
|
+
- `runtimeVersion` must change whenever the native layer changes, so an update never reaches a binary it is incompatible with; prefer a policy such as `fingerprint` or `appVersion` over manual values when possible.
|
|
41
|
+
- Publish to a preview channel first, then roll out to production; keep a way to roll back.
|
|
42
|
+
- Store rules restrict what updates may change (for example, no new features that bypass review on iOS); check the current guidelines.
|
|
43
|
+
|
|
44
|
+
## Crash reporting
|
|
45
|
+
|
|
46
|
+
Upload source maps for release bundles (and dSYMs and R8 mappings for native code) to the crash reporter, so JavaScript and native stack traces are readable.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# React Native platform features
|
|
2
|
+
|
|
3
|
+
## Permissions
|
|
4
|
+
|
|
5
|
+
- Expo modules expose permission hooks and methods (`useCameraPermissions`, `Location.requestForegroundPermissionsAsync`...); bare projects often use `react-native-permissions`.
|
|
6
|
+
- Declare iOS usage descriptions and Android permissions in native config: in Expo, through the module's config plugin options or `ios.infoPlist` and `android.permissions` in the app config; in bare projects, in `Info.plist` and `AndroidManifest.xml`.
|
|
7
|
+
- Ask in context, handle "denied" and "blocked", and link to settings with `Linking.openSettings()`.
|
|
8
|
+
|
|
9
|
+
## Push notifications
|
|
10
|
+
|
|
11
|
+
- **Expo:** `expo-notifications` for permissions, tokens, foreground handling (`setNotificationHandler`) and taps; the Expo push service or your own backend with FCM/APNs credentials. Push does not work in Expo Go on every platform and SDK version; use a development build.
|
|
12
|
+
- **Firebase Cloud Messaging:** follow `mobile-firebase` (React Native Firebase).
|
|
13
|
+
- Android 13+ needs the notification permission; iOS needs the Push Notifications capability and an APNs key.
|
|
14
|
+
- Register background handlers at the app entry, outside components.
|
|
15
|
+
|
|
16
|
+
## Deep links
|
|
17
|
+
|
|
18
|
+
- Custom scheme: `scheme` in the Expo app config, or intent filters and URL types in bare projects.
|
|
19
|
+
- Universal links and app links: `ios.associatedDomains` and `android.intentFilters` with `autoVerify` in Expo, plus the `apple-app-site-association` and `assetlinks.json` files on your domain.
|
|
20
|
+
- Route links through the navigator's linking configuration and validate parameters before acting.
|
|
21
|
+
|
|
22
|
+
## Background work
|
|
23
|
+
|
|
24
|
+
- Periodic background work is limited and scheduled by the OS. In Expo, use the background task module of the SDK in use (`expo-background-task` replaced `expo-background-fetch`; check the SDK docs) with `expo-task-manager`.
|
|
25
|
+
- Uploads and long jobs that must finish belong on the server or in native background transfer APIs, not in JavaScript timers.
|
|
26
|
+
|
|
27
|
+
## Native modules and config
|
|
28
|
+
|
|
29
|
+
- **Expo Modules API:** write native modules in Swift and Kotlin with a typed JavaScript interface; works in Expo and bare projects.
|
|
30
|
+
- **Turbo Modules / Fabric components:** the New Architecture native module system in bare projects; define the spec in TypeScript and generate code with Codegen.
|
|
31
|
+
- **Config plugins:** change native projects (Info.plist, manifest, Gradle, Podfile) reproducibly in Expo projects with Continuous Native Generation. Do not hand-edit `android/` and `ios/` in such projects; changes are lost on `npx expo prebuild --clean`.
|
|
32
|
+
- Wrap each native module once in a typed TypeScript API.
|
|
33
|
+
|
|
34
|
+
## Device capabilities
|
|
35
|
+
|
|
36
|
+
Camera (`expo-camera` or `react-native-vision-camera`), location (`expo-location`), media library, biometrics (`expo-local-authentication`), haptics and sensors: prefer the libraries the project already uses, check that they support the New Architecture when it is enabled, and add their permissions.
|
|
37
|
+
|
|
38
|
+
## In-app purchases
|
|
39
|
+
|
|
40
|
+
Use a maintained library (for example RevenueCat's SDK or `react-native-iap`) or the store APIs through native modules; verify purchases and entitlements on a server, and test with store sandbox accounts. Store rules for digital goods are in `mobile-ios` and `mobile-android`.
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# React Native UI and navigation
|
|
2
|
+
|
|
3
|
+
## Navigation
|
|
4
|
+
|
|
5
|
+
Use the router the project has.
|
|
6
|
+
|
|
7
|
+
**React Navigation** (native stack):
|
|
8
|
+
|
|
9
|
+
```tsx
|
|
10
|
+
export type RootStackParamList = { Orders: undefined; OrderDetail: { orderId: string } };
|
|
11
|
+
const Stack = createNativeStackNavigator<RootStackParamList>();
|
|
12
|
+
|
|
13
|
+
export function RootNavigator() {
|
|
14
|
+
return (
|
|
15
|
+
<Stack.Navigator>
|
|
16
|
+
<Stack.Screen name="Orders" component={OrdersScreen} />
|
|
17
|
+
<Stack.Screen name="OrderDetail" component={OrderDetailScreen} />
|
|
18
|
+
</Stack.Navigator>
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
**Expo Router** (file-based): routes are files under `app/` (`app/orders/[orderId].tsx`), layouts are `_layout.tsx`, navigation uses `<Link href="/orders/42">` or `router.push`, and params come from `useLocalSearchParams`.
|
|
24
|
+
|
|
25
|
+
- Type route params and pass ids, not objects or functions.
|
|
26
|
+
- Configure deep linking in the router (the `linking` option, or Expo Router's automatic routes) so notifications and links open the right screen.
|
|
27
|
+
- Use native stack navigators for native transitions and gestures.
|
|
28
|
+
|
|
29
|
+
## Layout and styling
|
|
30
|
+
|
|
31
|
+
- `StyleSheet.create` or the styling library the project uses; Flexbox with `flexDirection: 'column'` as the default.
|
|
32
|
+
- Safe areas with `react-native-safe-area-context` (`SafeAreaView` or `useSafeAreaInsets`); the core `SafeAreaView` only works on iOS.
|
|
33
|
+
- Dark mode with `useColorScheme` and a theme object, not hardcoded colors.
|
|
34
|
+
- Platform differences in `.ios.tsx`/`.android.tsx` files or `Platform.select`, kept small.
|
|
35
|
+
|
|
36
|
+
## Lists
|
|
37
|
+
|
|
38
|
+
- `FlatList`/`SectionList` (or FlashList, if the project uses it) for long or dynamic data, with a stable `keyExtractor`.
|
|
39
|
+
- Memoize `renderItem` components and avoid inline objects on hot rows; provide `getItemLayout` for fixed-height rows.
|
|
40
|
+
- Pull to refresh with `refreshing`/`onRefresh`; pagination with `onEndReached` guarded against duplicate calls.
|
|
41
|
+
|
|
42
|
+
## Forms and keyboard
|
|
43
|
+
|
|
44
|
+
- A form library the project has (React Hook Form is common), with schema validation shared with the API layer when possible.
|
|
45
|
+
- `KeyboardAvoidingView` (behavior differs per platform) or a keyboard library the project uses; `keyboardShouldPersistTaps="handled"` on scroll views with inputs.
|
|
46
|
+
- Set `textContentType` (iOS) and `autoComplete` for autofill, and `returnKeyType` with focus chaining between fields.
|
|
47
|
+
|
|
48
|
+
## Gestures and animations
|
|
49
|
+
|
|
50
|
+
- Reanimated for animations that run on the UI thread, Gesture Handler for gestures; `Animated` with `useNativeDriver: true` for simple cases.
|
|
51
|
+
- Do not drive per-frame animation through React state.
|
|
52
|
+
|
|
53
|
+
## Images
|
|
54
|
+
|
|
55
|
+
`expo-image` (or the image library the project uses) for caching and placeholders; size images close to their display size.
|
|
56
|
+
|
|
57
|
+
## Accessibility and localization
|
|
58
|
+
|
|
59
|
+
- `accessibilityRole`, `accessibilityLabel` and `accessibilityState` on touchables; `accessible` groups for composite elements.
|
|
60
|
+
- Respect font scaling; do not set `allowFontScaling={false}` on body text. Touch targets of at least 44–48 points (`hitSlop` for small icons).
|
|
61
|
+
- Test with VoiceOver and TalkBack.
|
|
62
|
+
- Localize with the library the project uses (for example i18next) and the device locale from `expo-localization` or equivalent.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: mobile-security
|
|
3
|
+
description: Security review and hardening for mobile apps on every stack, organized by the OWASP MASVS categories — insecure token and credential storage, hardcoded secrets, cleartext traffic and TLS validation bypass, certificate pinning, exported components and intent handling, deep links, WebView bridges, biometrics, sensitive logging, backups, screenshots and release hardening — with concrete checks for Flutter, native Android, native iOS and React Native. Use when reviewing mobile code for security, auditing an app before release, storing tokens or credentials, handling authentication, deep links or WebViews, or when the user mentions OWASP, MASVS, pentest findings or store security requirements.
|
|
4
|
+
intents: [review, security, release]
|
|
5
|
+
stacks: ["*"]
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Mobile Security
|
|
9
|
+
|
|
10
|
+
Organized by the OWASP MASVS categories. Apply the general checks below, then the reference for the detected stack. In cross-platform apps, also apply the Android and iOS references to the native folders.
|
|
11
|
+
|
|
12
|
+
## 1. Pick the reference
|
|
13
|
+
|
|
14
|
+
| Project | Read |
|
|
15
|
+
|---|---|
|
|
16
|
+
| Flutter | [references/flutter.md](references/flutter.md) |
|
|
17
|
+
| Native Android (Kotlin/Java), or `android/` in any app | [references/android.md](references/android.md) |
|
|
18
|
+
| Native iOS (Swift/Objective-C), or `ios/` in any app | [references/ios.md](references/ios.md) |
|
|
19
|
+
| React Native or Expo | [references/react-native.md](references/react-native.md) |
|
|
20
|
+
|
|
21
|
+
Firebase-specific protection (security rules, App Check) is covered by `mobile-firebase`.
|
|
22
|
+
|
|
23
|
+
## 2. Evidence and severity
|
|
24
|
+
|
|
25
|
+
Every finding needs evidence in the code or configuration at `file:line`. Severity:
|
|
26
|
+
|
|
27
|
+
- **Critical:** exposed credential or sensitive data, TLS validation disabled, exported component that performs a privileged action, backend authorization missing.
|
|
28
|
+
- **High:** token in insecure storage, cleartext traffic to the API, WebView with a JavaScript bridge exposed to remote content, deep link acting without validation.
|
|
29
|
+
- **Medium/Low:** missing hardening, verbose logs, backup enabled without need, missing screenshot protection.
|
|
30
|
+
|
|
31
|
+
## 3. General checks (all stacks)
|
|
32
|
+
|
|
33
|
+
**MASVS-STORAGE**
|
|
34
|
+
- [ ] Access token, refresh token and personal data kept in insecure storage (preferences, plain files, unencrypted database) instead of the Keychain or Keystore-backed storage.
|
|
35
|
+
- [ ] Sensitive data in logs, analytics events or crash reports.
|
|
36
|
+
|
|
37
|
+
**MASVS-CRYPTO**
|
|
38
|
+
- [ ] Private API keys, client secrets, signing keys or passwords in source code, assets or bundled configuration. Everything shipped in the app can be extracted; a real secret stays on the backend.
|
|
39
|
+
- [ ] Homemade cryptography, fixed IV or key, MD5/SHA-1 for passwords.
|
|
40
|
+
|
|
41
|
+
**MASVS-AUTH**
|
|
42
|
+
- [ ] Authorization decided only on the client (a local `isAdmin` flag, hiding a button as access control).
|
|
43
|
+
- [ ] Sessions without expiration, or refresh tokens never invalidated on logout.
|
|
44
|
+
- [ ] Biometrics used only as a local boolean, without unlocking a key in the Keychain or Keystore.
|
|
45
|
+
|
|
46
|
+
**MASVS-NETWORK**
|
|
47
|
+
- [ ] `http://` URLs for APIs.
|
|
48
|
+
- [ ] Certificate validation disabled or overridden to accept everything.
|
|
49
|
+
- [ ] Pinning, if present, without a rotation strategy (a single pin with no backup).
|
|
50
|
+
|
|
51
|
+
**MASVS-PLATFORM**
|
|
52
|
+
- [ ] Deep links and universal/app links that perform actions without validating parameters or without authentication.
|
|
53
|
+
- [ ] WebViews loading remote content with JavaScript and a native bridge enabled.
|
|
54
|
+
- [ ] Sensitive data on the clipboard or visible in the app switcher snapshot.
|
|
55
|
+
|
|
56
|
+
**MASVS-CODE / RESILIENCE**
|
|
57
|
+
- [ ] Release builds without obfuscation or minification when the app has sensitive logic.
|
|
58
|
+
- [ ] Debug code, test endpoints or feature flags that bypass checks reachable in release.
|
|
59
|
+
- [ ] Dependencies with known vulnerabilities, or abandoned security-sensitive libraries.
|
|
60
|
+
|
|
61
|
+
**MASVS-PRIVACY**
|
|
62
|
+
- [ ] Permissions requested without real use in the code.
|
|
63
|
+
- [ ] Third-party SDKs collecting data that is not declared (privacy manifest and App Store privacy details on iOS, Data safety on Google Play).
|
|
64
|
+
|
|
65
|
+
## 4. Useful commands (read-only)
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Signing material and environment files that should not be in the repository
|
|
69
|
+
git ls-files | grep -Ei '\.(jks|keystore|p12|p8|pem|mobileprovision)$|key\.properties|(^|/)\.env(\.|$)'
|
|
70
|
+
|
|
71
|
+
# Android manifest flags worth reading in context
|
|
72
|
+
grep -rn --include='AndroidManifest.xml' -E 'usesCleartextTraffic|allowBackup|exported="true"|debuggable' . 2>/dev/null
|
|
73
|
+
|
|
74
|
+
# iOS App Transport Security exceptions
|
|
75
|
+
grep -rn --include='*.plist' 'NSAllowsArbitraryLoads' . 2>/dev/null
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
`google-services.json` and `GoogleService-Info.plist` identify a Firebase project and ship in every app; committing them is not a leak by itself. The findings there are unrestricted API keys and weak security rules.
|
|
79
|
+
|
|
80
|
+
## Output
|
|
81
|
+
|
|
82
|
+
Report under **Security** (or **Critical**, when the severity is Critical), with the MASVS category, `file:line`, impact and fix.
|
|
@@ -1,31 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
name: android-intent-security
|
|
3
|
-
description: Best practices for Android Intent security. Use this skill when auditing
|
|
4
|
-
component configurations in AndroidManifest.xml activities, services, receivers)
|
|
5
|
-
or source code handling incoming Intents (getIntent, getParcelableExtra) to prevent
|
|
6
|
-
Intent Redirection and unauthorized access.
|
|
7
|
-
license: Apache-2.0
|
|
8
|
-
source: https://github.com/android/skills
|
|
9
|
-
intents: [security, review]
|
|
10
|
-
stacks: [android]
|
|
11
|
-
metadata:
|
|
12
|
-
author: Google LLC
|
|
13
|
-
last-updated: '2026-08-14'
|
|
14
|
-
keywords:
|
|
15
|
-
- recipe
|
|
16
|
-
- Android
|
|
17
|
-
- Security
|
|
18
|
-
- Intent
|
|
19
|
-
- Redirection
|
|
20
|
-
- PendingIntent
|
|
21
|
-
- ContentProvider
|
|
22
|
-
- Service
|
|
23
|
-
- Signature
|
|
24
|
-
- Verification
|
|
25
|
-
- sanitizer
|
|
26
|
-
- Vulnerability
|
|
27
|
-
- Best Practices
|
|
28
|
-
---
|
|
1
|
+
> Adapted from the `android-intent-security` skill in [android/skills](https://github.com/android/skills) (Apache-2.0). See `THIRD_PARTY_NOTICES.md`.
|
|
29
2
|
|
|
30
3
|
This skill provides guidelines and patterns to secure Android components
|
|
31
4
|
(Activities, Services, Broadcast Receivers, Content Providers) and handle
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Android security checks
|
|
2
|
+
|
|
3
|
+
Apply after the general checks in `SKILL.md`, to native Android apps and to the `android/` folder of cross-platform apps. For a deep review of exported components, intents, `PendingIntent`s and intent redirection, follow [android/intent-security.md](android/intent-security.md).
|
|
4
|
+
|
|
5
|
+
## Manifest and components
|
|
6
|
+
|
|
7
|
+
- [ ] `activity`, `service`, `receiver` or `provider` with `android:exported="true"` without a permission and without validating the incoming `Intent`.
|
|
8
|
+
- [ ] `android:debuggable="true"` hardcoded in the manifest.
|
|
9
|
+
- [ ] `android:allowBackup="true"` (or absent) in an app with sensitive data, without backup and data extraction rules that exclude it.
|
|
10
|
+
- [ ] `PendingIntent`s created mutable without need, or with implicit base intents.
|
|
11
|
+
- [ ] App links without `android:autoVerify="true"` and a published Digital Asset Links file, so other apps can claim the same URLs.
|
|
12
|
+
|
|
13
|
+
## Network
|
|
14
|
+
|
|
15
|
+
- [ ] `android:usesCleartextTraffic="true"`, or a `network_security_config` with `cleartextTrafficPermitted="true"` for production domains.
|
|
16
|
+
- [ ] `network_security_config` trusting user-installed certificates (`<certificates src="user"/>`) outside `debug-overrides`.
|
|
17
|
+
- [ ] A custom `TrustManager` or `HostnameVerifier` that accepts everything.
|
|
18
|
+
|
|
19
|
+
## Storage and credentials
|
|
20
|
+
|
|
21
|
+
- [ ] Tokens in `SharedPreferences` or DataStore without encryption. Keep keys in the Android Keystore; Jetpack Security (`EncryptedSharedPreferences`) is deprecated, so check the current recommendation before introducing it.
|
|
22
|
+
- [ ] Keystore passwords in a committed `build.gradle(.kts)` instead of `key.properties` or environment variables.
|
|
23
|
+
- [ ] `BiometricPrompt` used without a `CryptoObject` when it protects credentials.
|
|
24
|
+
|
|
25
|
+
## UI and logs
|
|
26
|
+
|
|
27
|
+
- [ ] Screens with sensitive data without `WindowManager.LayoutParams.FLAG_SECURE`, which blocks screenshots and the recents thumbnail.
|
|
28
|
+
- [ ] `Log.d`/`Log.v` with sensitive data not stripped in release (R8 rules or a logging wrapper).
|
|
29
|
+
|
|
30
|
+
## WebView
|
|
31
|
+
|
|
32
|
+
- [ ] `setJavaScriptEnabled(true)` with `addJavascriptInterface` on content the app does not control.
|
|
33
|
+
- [ ] `setAllowFileAccess(true)` or universal access from file URLs enabled.
|
|
34
|
+
|
|
35
|
+
## Release
|
|
36
|
+
|
|
37
|
+
- [ ] R8 disabled (`isMinifyEnabled = false`) for release when the app has logic worth protecting.
|
|
@@ -1,11 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
name: flutter-secure-token-store
|
|
3
|
-
description: "Stores JWT access tokens on Flutter with platform secure storage (Keychain on iOS, Keystore-backed storage on Android) via flutter_secure_storage. Use when persisting, reading or clearing auth tokens, or when replacing shared_preferences token storage."
|
|
4
|
-
intents: [security]
|
|
5
|
-
stacks: [flutter]
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# flutter-secure-token-store
|
|
1
|
+
# Storing auth tokens securely in Flutter
|
|
9
2
|
|
|
10
3
|
## Description
|
|
11
4
|
Store JWT tokens securely on Flutter using platform secure storage.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Flutter security checks
|
|
2
|
+
|
|
3
|
+
Apply after the general checks in `SKILL.md`. The native folders (`android/`, `ios/`) also get [android.md](android.md) and [ios.md](ios.md).
|
|
4
|
+
|
|
5
|
+
## Storage
|
|
6
|
+
|
|
7
|
+
- [ ] Tokens in `shared_preferences`, `hive` or `sqflite` without encryption. Use `flutter_secure_storage`, which stores values in the Keychain on iOS and Keystore-backed storage on Android: [flutter/secure-token-store.md](flutter/secure-token-store.md).
|
|
8
|
+
- [ ] Sensitive data cached in plain files under the app documents directory.
|
|
9
|
+
|
|
10
|
+
## Network
|
|
11
|
+
|
|
12
|
+
- [ ] `HttpClient.badCertificateCallback` returning `true`, or `HttpOverrides.global` disabling validation: Critical if it reaches the release build.
|
|
13
|
+
- [ ] `dio` or `http` clients built with custom certificate handling that accepts everything outside debug.
|
|
14
|
+
|
|
15
|
+
## Secrets and logs
|
|
16
|
+
|
|
17
|
+
- [ ] `print`/`debugPrint`/`log` with a token, `Authorization` header or login payload; `dio`'s `LogInterceptor` enabled in release.
|
|
18
|
+
- [ ] Secrets passed with `--dart-define` or `--dart-define-from-file` and treated as safe: they end up in the binary.
|
|
19
|
+
|
|
20
|
+
## Release hardening
|
|
21
|
+
|
|
22
|
+
- [ ] Release builds without `--obfuscate --split-debug-info=<dir>` when the app needs obfuscation. Keep the split debug info to symbolicate crashes.
|
|
23
|
+
- [ ] `kDebugMode`-only checks that also guard security behavior, so the check disappears in release.
|
|
24
|
+
|
|
25
|
+
## Platform
|
|
26
|
+
|
|
27
|
+
- [ ] `webview_flutter` with `JavaScriptMode.unrestricted` and `addJavaScriptChannel` loading URLs the app does not control.
|
|
28
|
+
- [ ] Deep links (`go_router`, `app_links`, `uni_links`) that navigate to privileged screens or perform actions without validating parameters and authentication.
|
|
29
|
+
- [ ] Platform channels that expose native capabilities (files, keychain, device identifiers) to any Dart caller without validating arguments.
|
|
30
|
+
- [ ] Biometric login with `local_auth` that only returns a boolean; bind it to a key stored behind biometric protection when it guards credentials.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# iOS security checks
|
|
2
|
+
|
|
3
|
+
Apply after the general checks in `SKILL.md`, to native iOS apps and to the `ios/` folder of cross-platform apps.
|
|
4
|
+
|
|
5
|
+
## Network
|
|
6
|
+
|
|
7
|
+
- [ ] `NSAppTransportSecurity` with `NSAllowsArbitraryLoads = true` in `Info.plist` without a justified per-domain exception.
|
|
8
|
+
- [ ] A `URLSessionDelegate` that accepts any `serverTrust` without evaluating it.
|
|
9
|
+
|
|
10
|
+
## Storage and credentials
|
|
11
|
+
|
|
12
|
+
- [ ] Tokens in `UserDefaults`, property lists or files instead of the Keychain.
|
|
13
|
+
- [ ] Keychain items with permissive accessibility (`kSecAttrAccessibleAlways*`, deprecated) instead of `...WhenUnlocked` or `...AfterFirstUnlock`; `ThisDeviceOnly` variants for secrets that must not migrate to other devices through backups.
|
|
14
|
+
- [ ] Files with sensitive data written without an appropriate Data Protection class.
|
|
15
|
+
- [ ] Biometrics checked with `LAContext.evaluatePolicy` only as a boolean when they guard credentials; protect the Keychain item with `SecAccessControl` and biometry instead.
|
|
16
|
+
|
|
17
|
+
## Platform
|
|
18
|
+
|
|
19
|
+
- [ ] Custom URL schemes performing actions without validation; any app can register the same scheme. Prefer universal links for sensitive flows.
|
|
20
|
+
- [ ] Screens with sensitive data without protection in the app switcher snapshot (cover the content when the scene moves to the background).
|
|
21
|
+
- [ ] Sensitive data copied to `UIPasteboard.general` without an expiration or local-only option.
|
|
22
|
+
- [ ] `WKWebView` loading remote content with `WKScriptMessageHandler`s that perform privileged actions.
|
|
23
|
+
|
|
24
|
+
## Logs and privacy
|
|
25
|
+
|
|
26
|
+
- [ ] `NSLog`, `print` or `os_log` with sensitive data; `os_log`/`Logger` values that should be private must not be marked public.
|
|
27
|
+
- [ ] Missing or inaccurate privacy manifest (`PrivacyInfo.xcprivacy`) for the app and third-party SDKs that use required-reason APIs or collect data; check Apple's current requirements.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# React Native security checks
|
|
2
|
+
|
|
3
|
+
Apply after the general checks in `SKILL.md`. The native folders (`android/`, `ios/`) and native modules also get [android.md](android.md) and [ios.md](ios.md).
|
|
4
|
+
|
|
5
|
+
## Storage
|
|
6
|
+
|
|
7
|
+
- [ ] Tokens or credentials in `AsyncStorage` or MMKV without encryption. Use the Keychain/Keystore through `react-native-keychain` or `expo-secure-store`.
|
|
8
|
+
|
|
9
|
+
## Secrets in the bundle
|
|
10
|
+
|
|
11
|
+
- [ ] Secrets in `.env` files read through `react-native-config`, `babel` env plugins or `EXPO_PUBLIC_*` variables: they are inlined into the JavaScript bundle and readable in the APK or IPA.
|
|
12
|
+
- [ ] Secrets in `app.json`/`app.config.*` `extra`, which is bundled into the app.
|
|
13
|
+
- [ ] Hermes bytecode treated as protection: it is not obfuscation, and the bundle can be decompiled.
|
|
14
|
+
|
|
15
|
+
## Network
|
|
16
|
+
|
|
17
|
+
- [ ] `http://` endpoints allowed through native exceptions added for development and left in release (see the native references).
|
|
18
|
+
- [ ] Certificate pinning libraries configured with a single pin and no rotation plan.
|
|
19
|
+
|
|
20
|
+
## Platform
|
|
21
|
+
|
|
22
|
+
- [ ] `react-native-webview` with `originWhitelist={['*']}` and an `onMessage` handler that performs actions, or `injectedJavaScript` exposing tokens to remote content.
|
|
23
|
+
- [ ] Deep links handled through `Linking` or the navigation linking config without validating origin and parameters.
|
|
24
|
+
- [ ] Native modules exposing sensitive capabilities to JavaScript without validating arguments.
|
|
25
|
+
|
|
26
|
+
## Logs and updates
|
|
27
|
+
|
|
28
|
+
- [ ] `console.log` with sensitive data not removed in release builds (for example with `babel-plugin-transform-remove-console`).
|
|
29
|
+
- [ ] Over-the-air updates (`expo-updates` or other services) without code signing, so a compromised update channel can ship arbitrary JavaScript. Check whether the update service used supports signing and whether it is enabled.
|