reis-mobile 0.3.5 → 0.4.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 +33 -0
- package/README.md +186 -172
- package/THIRD_PARTY_NOTICES.md +224 -4
- package/agents/android-architect.md +89 -0
- package/agents/android-performance-engineer.md +92 -0
- package/agents/android-test-engineer.md +97 -0
- package/agents/flutter-test-engineer.md +2 -0
- package/agents/ios-architect.md +93 -0
- package/agents/ios-performance-engineer.md +92 -0
- package/agents/ios-test-engineer.md +95 -0
- package/agents/lead-mobile.md +10 -1
- package/agents/mobile-staff-engineer.md +1 -1
- package/agents/rn-architect.md +94 -0
- package/agents/rn-performance-engineer.md +92 -0
- package/agents/rn-test-engineer.md +98 -0
- package/bin/reis-mobile.mjs +83 -33
- package/commands/debate.md +10 -1
- package/commands/debug.md +60 -0
- package/commands/reis-mobile.md +7 -2
- package/core/config/project.mjs +59 -0
- package/core/install/codex-plugin.mjs +66 -0
- package/core/install/init.mjs +46 -0
- package/core/registry/frontmatter.mjs +15 -4
- package/core/registry/registry.mjs +21 -1
- package/core/router/intents.mjs +2 -0
- package/core/router/router.mjs +10 -5
- package/package.json +1 -1
- package/skills/android-adaptive/SKILL.md +304 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/container-behavior.md +112 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/get-started.md +69 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/index.md +81 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/flexbox/item-behavior.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/container-properties.md +415 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/get-started.md +51 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/index.md +73 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/grid/item-properties.md +170 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/layouts/adaptive/mediaquery/index.md +333 -0
- package/skills/android-adaptive/references/android/develop/ui/compose/tooling/debug.md +114 -0
- package/skills/android-adaptive/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-agp-9-upgrade/SKILL.md +106 -0
- package/skills/android-agp-9-upgrade/references/android/build/migrate-to-built-in-kotlin.md +416 -0
- package/skills/android-agp-9-upgrade/references/android/build/releases/agp-9-0-0-release-notes.md +554 -0
- package/skills/android-agp-9-upgrade/references/buildconfig.md +54 -0
- package/skills/android-agp-9-upgrade/references/ksp-kapt.md +39 -0
- package/skills/android-agp-9-upgrade/references/paparazzi-gradle-9.md +30 -0
- package/skills/android-agp-9-upgrade/references/recipes.md +62 -0
- package/skills/android-appfunctions/SKILL.md +74 -0
- package/skills/android-appfunctions/references/adb-interaction-testing.md +95 -0
- package/skills/android-appfunctions/references/context.md +26 -0
- package/skills/android-appfunctions/references/feature-discovery-analysis.md +71 -0
- package/skills/android-appfunctions/references/implementation-configuration.md +282 -0
- package/skills/android-appfunctions/references/kdoc-refinement-optimization.md +75 -0
- package/skills/android-appfunctions/references/migrate-to-service-entry-point.md +226 -0
- package/skills/android-camerax/SKILL.md +135 -0
- package/skills/android-camerax/references/camera1-to-camerax.md +198 -0
- package/skills/android-camerax/references/camera2-to-camerax.md +193 -0
- package/skills/android-camerax/references/expert-blueprints.md +58 -0
- package/skills/android-camerax/references/foldables.md +83 -0
- package/skills/android-camerax/references/immutability.md +60 -0
- package/skills/android-camerax/references/low-light.md +124 -0
- package/skills/android-camerax/references/mlkit-spatial.md +75 -0
- package/skills/android-camerax/references/modern-apis.md +42 -0
- package/skills/android-camerax/references/testing.md +69 -0
- package/skills/android-camerax/references/thermals.md +85 -0
- package/skills/android-camerax/references/wear-os.md +76 -0
- package/skills/android-camerax/references/xr.md +54 -0
- package/skills/android-cli/SKILL.md +474 -0
- package/skills/android-cli/references/interact.md +113 -0
- package/skills/android-cli/references/journeys.md +120 -0
- package/skills/android-code-review/SKILL.md +58 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/SKILL.md +340 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/design/ui/ai-glasses/guides/interaction/inputs.md +67 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/access-hardware-projected-context.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/buttons.md +139 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/cards.md +148 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/focus.md +107 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/icons.md +90 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/text.md +69 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/jetpack-compose-glimmer/title-chips.md +82 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/android/develop/xr/jetpack-xr-sdk/request-hardware-permissions.md +213 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-samples-source.md +176 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/button-source.md +203 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-samples-source.md +296 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/card-source.md +515 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffect-source.md +224 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/deptheffectlevels-source.md +105 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmersansflextypography-source.md +270 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/glimmertheme-source.md +182 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/icon-source.md +388 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconbutton-source.md +126 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/iconsizes-source.md +78 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/list-source.md +27 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/listitem-source.md +272 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/liststate-source.md +427 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/material-hct-source.md +217 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/projectedcontext-source.md +265 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stack-source.md +368 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackitemscope-source.md +440 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/stackstate-source.md +325 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/surface-source.md +1211 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-samples-source.md +101 -0
- package/skills/android-display-glasses-with-jetpack-compose-glimmer/references/titlechip-source.md +131 -0
- package/skills/android-edge-to-edge/SKILL.md +429 -0
- package/skills/android-engage-sdk-integration/SKILL.md +130 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/faq.md +439 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/food.md +1149 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/healthandfitness.md +1055 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/listen.md +1050 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/otherverticals.md +1301 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/read.md +910 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/shopping.md +1224 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/social.md +719 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/travel.md +1413 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/continue-watching/index.md +19 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/entitlements.md +353 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/getting-started.md +202 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/tv/recommendations.md +471 -0
- package/skills/android-engage-sdk-integration/references/android/guide/playcore/engage/watch.md +1081 -0
- package/skills/android-engage-sdk-integration/references/clusters.md +154 -0
- package/skills/android-engage-sdk-integration/references/common.md +519 -0
- package/skills/android-engage-sdk-integration/references/patterns.md +527 -0
- package/skills/android-engage-sdk-integration/references/requests.md +260 -0
- package/skills/android-engage-sdk-integration/references/schemas/food.md +509 -0
- package/skills/android-engage-sdk-integration/references/schemas/listen.md +842 -0
- package/skills/android-engage-sdk-integration/references/schemas/other.md +220 -0
- package/skills/android-engage-sdk-integration/references/schemas/read.md +412 -0
- package/skills/android-engage-sdk-integration/references/schemas/shopping.md +357 -0
- package/skills/android-engage-sdk-integration/references/schemas/social.md +228 -0
- package/skills/android-engage-sdk-integration/references/schemas/travel.md +923 -0
- package/skills/android-engage-sdk-integration/references/schemas/tv.md +1226 -0
- package/skills/android-engage-sdk-integration/references/schemas/watch.md +1137 -0
- package/skills/android-engage-sdk-integration/references/troubleshooting.md +39 -0
- package/skills/android-gradle-build-debug/SKILL.md +71 -0
- package/skills/android-intent-security/SKILL.md +550 -0
- package/skills/android-leanback-to-compose-tv-migration/SKILL.md +743 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/get-started/navigation.md +372 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/browse.md +243 -0
- package/skills/android-leanback-to-compose-tv-migration/references/android/training/tv/playback/compose/index.md +153 -0
- package/skills/android-media3-cast-integration/SKILL.md +236 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/create-castplayer.md +390 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/customize-castoptions.md +93 -0
- package/skills/android-media3-cast-integration/references/android/media/media3/cast/index.md +21 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/SKILL.md +127 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/analysis-of-the-project-and-layout.md +42 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/designsystems/migrate-xml-theme-to-compose.md +171 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/compose-in-views.md +299 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/migrate/interoperability-apis/views-in-compose.md +286 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/android/develop/ui/compose/setup-compose-dependencies-and-compiler.md +197 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/identify-optimal-xml-candidate.md +31 -0
- package/skills/android-migrate-xml-views-to-jetpack-compose/references/xml-layout-migration.md +86 -0
- package/skills/android-ml-kit-genai-prompt-api/SKILL.md +124 -0
- package/skills/android-ml-kit-genai-prompt-api/references/get-started.md +272 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prefix-caching.md +146 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-design.md +55 -0
- package/skills/android-ml-kit-genai-prompt-api/references/prompt-optimization.md +74 -0
- package/skills/android-ml-kit-genai-prompt-api/references/structured-output.md +219 -0
- package/skills/android-ml-kit-genai-prompt-api/references/system-instructions.md +71 -0
- package/skills/android-navigation-3/SKILL.md +122 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/index.md +51 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/migration-guide.md +670 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/animations.md +147 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basic.md +89 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicdsl.md +85 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/basicsaveable.md +90 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/bottomsheet.md +195 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/common-ui.md +200 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional-transitions.md +182 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/conditional.md +230 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-custommatcher.md +176 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-staticuri.md +140 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/deeplinks-syntheticbackstack.md +184 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/dialog.md +107 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/lifecycle-owner.md +185 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-listdetail.md +141 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/material-supportingpane.md +145 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-hilt.md +283 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/modular-koin.md +287 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/multiple-backstacks.md +468 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/passingarguments.md +371 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-event.md +273 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/results-state.md +266 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-listdetail.md +435 -0
- package/skills/android-navigation-3/references/android/guide/navigation/navigation-3/recipes/scenes-twopane.md +244 -0
- package/skills/android-navigation-3/references/android/guide/navigation/type-safe-destinations.md +129 -0
- package/skills/android-navigation-event/SKILL.md +312 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/dispatcher.md +134 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/handle-back.md +217 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/index.md +83 -0
- package/skills/android-navigation-event/references/android/guide/navigation/navigation-event/setup.md +32 -0
- package/skills/android-play-billing-library-version-upgrade/SKILL.md +96 -0
- package/skills/android-play-billing-library-version-upgrade/references/android/google/play/billing/release-notes.md +1240 -0
- package/skills/android-play-billing-library-version-upgrade/references/migration-logic.md +78 -0
- package/skills/android-play-billing-library-version-upgrade/references/version-checklist.md +54 -0
- package/skills/android-play-policy-insights/SKILL.md +172 -0
- package/skills/android-play-policy-insights/resources/common_mandates.md +100 -0
- package/skills/android-play-policy-insights/resources/compliance_report_template.md +59 -0
- package/skills/android-play-policy-insights/resources/critic.md +86 -0
- package/skills/android-play-policy-insights/resources/goal_data_safety.md +212 -0
- package/skills/android-play-policy-insights/resources/goal_permissions_and_apis.md +459 -0
- package/skills/android-play-policy-insights/resources/goal_user_account.md +106 -0
- package/skills/android-play-policy-insights/resources/policies.json +321 -0
- package/skills/android-play-policy-insights/resources/scanner_config.json +843 -0
- package/skills/android-play-policy-insights/scripts/generate_report.py +860 -0
- package/skills/android-play-policy-insights/scripts/orchestrator.py +1313 -0
- package/skills/android-play-policy-insights/scripts/play_store_scraper.py +410 -0
- package/skills/android-play-policy-insights/scripts/scanner.py +261 -0
- package/skills/android-play-policy-insights/scripts/template_engine.py +243 -0
- package/skills/android-profiler/SKILL.md +60 -0
- package/skills/android-profiler/analysis/analysis_orchestrator.md +32 -0
- package/skills/android-profiler/analysis/workflows/perfetto-sql/perfetto_sql.md +28 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/perfetto_trace_analysis.md +121 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/guiding_principles.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/domain_hints_template.md +7 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_cpu.md +56 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_graphics.md +51 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_io.md +46 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_ipc.md +41 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_memory.md +55 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/hints/subsystems/hints_power.md +33 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/per_candidate_analysis.md +172 -0
- package/skills/android-profiler/analysis/workflows/perfetto-trace-analysis/references/triage.md +94 -0
- package/skills/android-profiler/recording/recording_orchestrator.md +36 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/perfetto_trace_recording.md +148 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/app_jank.pftxt +43 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/cpu_profile.pftxt +35 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/java_heap_dump.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/long_background.pftxt +37 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/memory_counters.pftxt +45 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/native_heap.pftxt +21 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/example-configs/sched_cpu.pftxt +33 -0
- package/skills/android-profiler/recording/workflows/perfetto-trace-recording/references/trace_config_reference.md +102 -0
- package/skills/android-profiler/references/env_setup.md +15 -0
- package/skills/android-profiler/references/perfetto/setup.md +29 -0
- package/skills/android-profiler/references/perfetto/sql.md +327 -0
- package/skills/android-r8-analyzer/SKILL.md +72 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION-ANALYZER.md +287 -0
- package/skills/android-r8-analyzer/references/CONFIGURATION.md +44 -0
- package/skills/android-r8-analyzer/references/KEEP-RULES-IMPACT-HIERARCHY.md +83 -0
- package/skills/android-r8-analyzer/references/REDUNDANT-RULES.md +222 -0
- package/skills/android-r8-analyzer/references/REFLECTION-GUIDE.md +139 -0
- package/skills/android-r8-analyzer/references/REPORT_FORMAT.md +51 -0
- package/skills/android-r8-analyzer/references/android/topic/performance/app-optimization/enable-app-optimization.md +252 -0
- package/skills/android-r8-analyzer/references/android/training/testing/other-components/ui-automator.md +312 -0
- package/skills/android-restore-credentials/SKILL.md +359 -0
- package/skills/android-restore-credentials/references/android/guide/topics/manifest/application-element.md +832 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-restore-credentials/references/android/identity/passkeys/sign-in-with-passkeys.md +219 -0
- package/skills/android-styles/SKILL.md +229 -0
- package/skills/android-styles/references/android/develop/ui/compose/designsystems/custom.md +459 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/fundamentals.md +421 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/state-animations.md +461 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/styles-vs-modifiers.md +48 -0
- package/skills/android-styles/references/android/develop/ui/compose/styles/theming.md +269 -0
- package/skills/android-verified-email/SKILL.md +432 -0
- package/skills/android-verified-email/references/android/identity/credential-manager/index.md +67 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/credential-verifier.md +166 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification-implementation.md +313 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/email-verification.md +158 -0
- package/skills/android-verified-email/references/android/identity/digital-credentials/index.md +112 -0
- package/skills/android-verified-email/references/android/identity/passkeys/create-passkeys.md +327 -0
- package/skills/android-verified-email/references/android/identity/sign-in/credential-manager-webview.md +84 -0
- package/skills/android-wear-compose-m3/SKILL.md +365 -0
- package/skills/android-wear-compose-m3/references/android/training/wearables/compose/migrate-to-material3.md +677 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md +123 -0
- package/skills/android-wear-compose-m3/references/foundation/AmbientModeSample.kt.md.txt +123 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md +430 -0
- package/skills/android-wear-compose-m3/references/foundation/CurvedWorldSample.kt.md.txt +430 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md +99 -0
- package/skills/android-wear-compose-m3/references/foundation/ExpandableSample.kt.md.txt +99 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md +141 -0
- package/skills/android-wear-compose-m3/references/foundation/HierarchicalFocusSample.kt.md.txt +141 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md +56 -0
- package/skills/android-wear-compose-m3/references/foundation/PagerSamples.kt.md.txt +56 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md +153 -0
- package/skills/android-wear-compose-m3/references/foundation/RotarySamples.kt.md.txt +153 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/foundation/ScalingLazyColumnSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToDismissBoxSample.kt.md.txt +169 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md +282 -0
- package/skills/android-wear-compose-m3/references/foundation/SwipeToRevealSample.kt.md.txt +282 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md +335 -0
- package/skills/android-wear-compose-m3/references/foundation/TransformingLazyColumnSample.kt.md.txt +335 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md +377 -0
- package/skills/android-wear-compose-m3/references/material3/AlertDialogSample.kt.md.txt +377 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md +165 -0
- package/skills/android-wear-compose-m3/references/material3/AnimatedTextSample.kt.md.txt +165 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonGroupSample.kt.md.txt +91 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md +496 -0
- package/skills/android-wear-compose-m3/references/material3/ButtonSample.kt.md.txt +496 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md +470 -0
- package/skills/android-wear-compose-m3/references/material3/CardSample.kt.md.txt +470 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md +67 -0
- package/skills/android-wear-compose-m3/references/material3/CheckboxButtonSample.kt.md.txt +67 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md +162 -0
- package/skills/android-wear-compose-m3/references/material3/ConfirmationDialogSample.kt.md.txt +162 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md +78 -0
- package/skills/android-wear-compose-m3/references/material3/CurvedTextSamples.kt.md.txt +78 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md +131 -0
- package/skills/android-wear-compose-m3/references/material3/DatePickerSample.kt.md.txt +131 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md +74 -0
- package/skills/android-wear-compose-m3/references/material3/DynamicColorSchemeSample.kt.md.txt +74 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md +63 -0
- package/skills/android-wear-compose-m3/references/material3/EdgeButtonSample.kt.md.txt +63 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md +60 -0
- package/skills/android-wear-compose-m3/references/material3/FadingExpandingLabelSample.kt.md.txt +60 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconButtonSample.kt.md.txt +125 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md +116 -0
- package/skills/android-wear-compose-m3/references/material3/IconToggleButtonSample.kt.md.txt +116 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md +68 -0
- package/skills/android-wear-compose-m3/references/material3/LevelIndicatorSample.kt.md.txt +68 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md +50 -0
- package/skills/android-wear-compose-m3/references/material3/LinearProgressIndicatorSample.kt.md.txt +50 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md +177 -0
- package/skills/android-wear-compose-m3/references/material3/ListHeaderSample.kt.md.txt +177 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md +651 -0
- package/skills/android-wear-compose-m3/references/material3/OneHandedGestureSamples.kt.md.txt +651 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md +57 -0
- package/skills/android-wear-compose-m3/references/material3/OpenOnPhoneDialogSample.kt.md.txt +57 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md +110 -0
- package/skills/android-wear-compose-m3/references/material3/PageIndicatorSample.kt.md.txt +110 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md +204 -0
- package/skills/android-wear-compose-m3/references/material3/PagerScaffoldSample.kt.md.txt +204 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerGroupSample.kt.md.txt +139 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md +111 -0
- package/skills/android-wear-compose-m3/references/material3/PickerSample.kt.md.txt +111 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md +184 -0
- package/skills/android-wear-compose-m3/references/material3/PlaceholderSample.kt.md.txt +184 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md +263 -0
- package/skills/android-wear-compose-m3/references/material3/ProgressIndicatorSample.kt.md.txt +263 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md +105 -0
- package/skills/android-wear-compose-m3/references/material3/RadioButtonSample.kt.md.txt +105 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScaffoldSample.kt.md.txt +146 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollAwaySample.kt.md.txt +97 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/ScrollIndicatorSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md +86 -0
- package/skills/android-wear-compose-m3/references/material3/SliderSample.kt.md.txt +86 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md +148 -0
- package/skills/android-wear-compose-m3/references/material3/StepperSample.kt.md.txt +148 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md +166 -0
- package/skills/android-wear-compose-m3/references/material3/SurfaceTransformationSample.kt.md.txt +166 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToDismissBoxSample.kt.md.txt +172 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwipeToRevealSample.kt.md.txt +367 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md +66 -0
- package/skills/android-wear-compose-m3/references/material3/SwitchButtonSample.kt.md.txt +66 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextButtonSample.kt.md.txt +115 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md +71 -0
- package/skills/android-wear-compose-m3/references/material3/TextToggleButtonSample.kt.md.txt +71 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimePickerSample.kt.md.txt +151 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md +65 -0
- package/skills/android-wear-compose-m3/references/material3/TimeTextSample.kt.md.txt +65 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformationSpecSample.kt.md.txt +246 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnNotificationsSample.kt.md.txt +89 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md +309 -0
- package/skills/android-wear-compose-m3/references/material3/TransformingLazyColumnSample.kt.md.txt +309 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md +205 -0
- package/skills/android-wear-compose-m3/references/navigation3/SwipeDismissableSceneStrategySample.kt.md.txt +205 -0
- package/skills/{architecture-feature-first → flutter-architecture-feature-first}/SKILL.md +1 -1
- package/skills/{bloc → flutter-bloc}/SKILL.md +1 -1
- package/skills/flutter-build-debug/SKILL.md +66 -0
- package/skills/{code-review → flutter-code-review}/SKILL.md +1 -1
- package/skills/{dart-3-updates → flutter-dart-3-updates}/SKILL.md +1 -1
- package/skills/{dart-fix-runtime-errors → flutter-dart-fix-runtime-errors}/SKILL.md +1 -1
- package/skills/{dart-resolve-package-conflicts → flutter-dart-resolve-package-conflicts}/SKILL.md +1 -1
- package/skills/{dart-run-static-analysis → flutter-dart-run-static-analysis}/SKILL.md +1 -1
- package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/SKILL.md +1 -1
- package/skills/{effective-dart → flutter-effective-dart}/SKILL.md +1 -1
- package/skills/{provider → flutter-provider}/SKILL.md +1 -1
- package/skills/{riverpod → flutter-riverpod}/SKILL.md +1 -1
- package/skills/ios-cocoapods-debug/SKILL.md +65 -0
- package/skills/ios-code-review/SKILL.md +56 -0
- package/skills/ios-xcode-build-debug/SKILL.md +66 -0
- package/skills/{detect-mobile-stack → mobile-detect-stack}/SKILL.md +1 -1
- package/skills/mobile-firebase/SKILL.md +54 -0
- package/skills/mobile-firebase/references/android/ai-logic.md +31 -0
- package/skills/mobile-firebase/references/android/analytics.md +33 -0
- package/skills/mobile-firebase/references/android/app-check.md +36 -0
- package/skills/mobile-firebase/references/android/auth.md +44 -0
- package/skills/mobile-firebase/references/android/crashlytics.md +31 -0
- package/skills/mobile-firebase/references/android/firestore.md +44 -0
- package/skills/mobile-firebase/references/android/functions.md +33 -0
- package/skills/mobile-firebase/references/android/in-app-messaging.md +28 -0
- package/skills/mobile-firebase/references/android/messaging.md +41 -0
- package/skills/mobile-firebase/references/android/realtime-database.md +50 -0
- package/skills/mobile-firebase/references/android/remote-config.md +43 -0
- package/skills/mobile-firebase/references/android/sql-connect.md +31 -0
- package/skills/mobile-firebase/references/android/storage.md +39 -0
- package/skills/mobile-firebase/references/android.md +30 -0
- package/skills/{firebase-ai/SKILL.md → mobile-firebase/references/flutter/ai-logic.md} +2 -8
- package/skills/{firebase-analytics/SKILL.md → mobile-firebase/references/flutter/analytics.md} +2 -8
- package/skills/{firebase-app-check/SKILL.md → mobile-firebase/references/flutter/app-check.md} +2 -8
- package/skills/{firebase-auth/SKILL.md → mobile-firebase/references/flutter/auth.md} +2 -8
- package/skills/{firebase-crashlytics/SKILL.md → mobile-firebase/references/flutter/crashlytics.md} +2 -8
- package/skills/{firebase-cloud-firestore/SKILL.md → mobile-firebase/references/flutter/firestore.md} +2 -8
- package/skills/{firebase-cloud-functions/SKILL.md → mobile-firebase/references/flutter/functions.md} +2 -8
- package/skills/{firebase-in-app-messaging/SKILL.md → mobile-firebase/references/flutter/in-app-messaging.md} +2 -8
- package/skills/{firebase-messaging/SKILL.md → mobile-firebase/references/flutter/messaging.md} +2 -8
- package/skills/{firebase-database/SKILL.md → mobile-firebase/references/flutter/realtime-database.md} +2 -8
- package/skills/{firebase-remote-config/SKILL.md → mobile-firebase/references/flutter/remote-config.md} +2 -8
- package/skills/{flutterfire-configure/SKILL.md → mobile-firebase/references/flutter/setup-flutterfire.md} +1 -8
- package/skills/{firebase-data-connect/SKILL.md → mobile-firebase/references/flutter/sql-connect.md} +2 -8
- package/skills/{firebase-storage/SKILL.md → mobile-firebase/references/flutter/storage.md} +2 -8
- package/skills/mobile-firebase/references/flutter.md +36 -0
- package/skills/mobile-firebase/references/ios/ai-logic.md +30 -0
- package/skills/mobile-firebase/references/ios/analytics.md +33 -0
- package/skills/mobile-firebase/references/ios/app-check.md +36 -0
- package/skills/mobile-firebase/references/ios/auth.md +48 -0
- package/skills/mobile-firebase/references/ios/crashlytics.md +34 -0
- package/skills/mobile-firebase/references/ios/firestore.md +53 -0
- package/skills/mobile-firebase/references/ios/functions.md +35 -0
- package/skills/mobile-firebase/references/ios/in-app-messaging.md +26 -0
- package/skills/mobile-firebase/references/ios/messaging.md +45 -0
- package/skills/mobile-firebase/references/ios/realtime-database.md +49 -0
- package/skills/mobile-firebase/references/ios/remote-config.md +44 -0
- package/skills/mobile-firebase/references/ios/sql-connect.md +33 -0
- package/skills/mobile-firebase/references/ios/storage.md +36 -0
- package/skills/mobile-firebase/references/ios.md +28 -0
- package/skills/mobile-firebase/references/react-native/ai-logic.md +32 -0
- package/skills/mobile-firebase/references/react-native/analytics.md +43 -0
- package/skills/mobile-firebase/references/react-native/app-check.md +35 -0
- package/skills/mobile-firebase/references/react-native/auth.md +50 -0
- package/skills/mobile-firebase/references/react-native/crashlytics.md +36 -0
- package/skills/mobile-firebase/references/react-native/firestore.md +45 -0
- package/skills/mobile-firebase/references/react-native/functions.md +28 -0
- package/skills/mobile-firebase/references/react-native/in-app-messaging.md +27 -0
- package/skills/mobile-firebase/references/react-native/messaging.md +46 -0
- package/skills/mobile-firebase/references/react-native/realtime-database.md +46 -0
- package/skills/mobile-firebase/references/react-native/remote-config.md +32 -0
- package/skills/mobile-firebase/references/react-native/sql-connect.md +11 -0
- package/skills/mobile-firebase/references/react-native/storage.md +30 -0
- package/skills/mobile-firebase/references/react-native.md +29 -0
- package/skills/mobile-test/SKILL.md +63 -0
- package/skills/mobile-test/references/android/setup/GUIDE.md +183 -0
- package/skills/mobile-test/references/android/setup/references/android/develop/ui/compose/testing/common-patterns.md +181 -0
- package/skills/mobile-test/references/android/setup/references/android/studio/preview/compose-screenshot-testing.md +255 -0
- package/skills/mobile-test/references/android/setup/references/android/training/dependency-injection/hilt-testing.md +447 -0
- package/skills/mobile-test/references/android.md +83 -0
- package/skills/{dart-collect-coverage/SKILL.md → mobile-test/references/flutter/coverage.md} +2 -11
- package/skills/{dart-generate-test-mocks/SKILL.md → mobile-test/references/flutter/generate-mocks.md} +2 -11
- package/skills/{flutter-add-integration-test/SKILL.md → mobile-test/references/flutter/integration-tests.md} +2 -11
- package/skills/{dart-migrate-to-checks-package/SKILL.md → mobile-test/references/flutter/migrate-to-checks.md} +2 -13
- package/skills/{mockito/SKILL.md → mobile-test/references/flutter/mockito.md} +1 -8
- package/skills/{mocktail/SKILL.md → mobile-test/references/flutter/mocktail.md} +1 -8
- package/skills/{patrol-e2e-testing/SKILL.md → mobile-test/references/flutter/patrol.md} +1 -8
- package/skills/{testing/SKILL.md → mobile-test/references/flutter/testing-guidelines.md} +1 -8
- package/skills/{dart-add-unit-test/SKILL.md → mobile-test/references/flutter/unit-tests.md} +2 -11
- package/skills/{flutter-add-widget-test/SKILL.md → mobile-test/references/flutter/widget-tests.md} +2 -11
- package/skills/mobile-test/references/flutter.md +44 -0
- package/skills/mobile-test/references/ios.md +79 -0
- package/skills/mobile-test/references/react-native.md +62 -0
- /package/skills/{dart-use-pattern-matching → flutter-dart-use-pattern-matching}/examples/json_patterns.dart +0 -0
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
{{#IF_ANY data_sources, disclosure}}
|
|
2
|
+
{{ACTIVATE_GOAL}}
|
|
3
|
+
{{/IF_ANY}}
|
|
4
|
+
## Data Safety and Privacy Audit
|
|
5
|
+
|
|
6
|
+
### Policies to Verify
|
|
7
|
+
|
|
8
|
+
- **The Policy Spirit**: Users deserve complete transparency regarding what
|
|
9
|
+
personal or sensitive information leaves their devices. Under Play Store
|
|
10
|
+
rules, any off-device transmission of user data must be explicitly declared in
|
|
11
|
+
the Play Store Data Safety form, and sensitive or non-obvious data collection
|
|
12
|
+
requires prior prominent in-app disclosure and affirmative user consent.
|
|
13
|
+
|
|
14
|
+
- **Common Evaluation Matrix**:
|
|
15
|
+
| Case | Technical Observation | `user_initiated` | `is_third_party` | Disclosure Status | Severity | Issue Summary |
|
|
16
|
+
| :--- | :--- | :--- | :--- | :--- | :--- | :--- |
|
|
17
|
+
| **1** | **Not Transferred** (Local only) | N/A | N/A | `EXEMPT` | `SUGGESTION` | "Data Safety Compliant (Local-Only)" |
|
|
18
|
+
| **2A** | **Transferred** + **Background** + **No Disclosure** | `false` | (Any) | `MISSING` | `CRITICAL` | "**Silent Background Transfer**": Policy violation. Data is sent without prior disclosure. |
|
|
19
|
+
| **2B** | **Transferred** + **Background** + **Disclosure Found** | `false` | (Any) | `DISCLOSED` | `IMPORTANT` | "**Background Transfer (Disclosure Claimed)**": Evidence found; requires Critic verification. |
|
|
20
|
+
| **3** | **Transferred** + **User-Initiated** + **First Party** | `true` | `false` | `EXEMPT` | `IMPORTANT` | "**User-Initiated Collection**": Disclosure exempt, but **must be declared** in Play Store form. |
|
|
21
|
+
| **4** | **Transferred** + **User-Initiated** + **Third Party** | `true` | `true` | `EXEMPT` | `SUGGESTION` | "**Manual Sharing**": **Policy Exempt**. User triggers transfer to 3P; no disclosure or declaration needed. |
|
|
22
|
+
|
|
23
|
+
- **Exemptions Reference**:
|
|
24
|
+
- **Anonymous Data**: Fully anonymized data not linked to a user is exempt.
|
|
25
|
+
- **End-to-End Encryption (E2EE)**: Data E2EE where the developer cannot read
|
|
26
|
+
it is exempt.
|
|
27
|
+
- **Open Web WebView**: Data entered into a WebView navigating the open web is
|
|
28
|
+
exempt.
|
|
29
|
+
- *If any of these apply, downgrade severity to `SUGGESTION` and mark
|
|
30
|
+
`EXEMPT`.*
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
### The Audit Protocol
|
|
35
|
+
|
|
36
|
+
#### Step 0: Facts orientation
|
|
37
|
+
|
|
38
|
+
- **Identify Third-Party SDKs**: If you observe network, crash-reporting, or
|
|
39
|
+
tracking telemetry, check the project's build files (e.g., build.gradle,
|
|
40
|
+
build.gradle.kts, libs.versions.toml) on-demand using your file-reading tools
|
|
41
|
+
to verify which SDKs (Analytics, Ads, etc.) are integrated.
|
|
42
|
+
- **Understand Off-Device Sinks**: Use your native knowledge of standard Android
|
|
43
|
+
framework components to identify transmission destinations. Focus on active
|
|
44
|
+
egress vectors such as standard HTTP/REST libraries (e.g., OkHttp, Retrofit,
|
|
45
|
+
Ktor, HttpURLConnection), WebViews passing data off-device, background syncing
|
|
46
|
+
tasks, or analytic/telemetry frameworks (e.g., Firebase, Mixpanel, Adjust,
|
|
47
|
+
AppsFlyer).
|
|
48
|
+
- **Identify Disclosures**: Review `disclosure` below. Use these as starting
|
|
49
|
+
points for Step 2.
|
|
50
|
+
|
|
51
|
+
#### Step 1: Verify behavioral transmission (Forward Trace)
|
|
52
|
+
|
|
53
|
+
For each source in `data_sources` listed below, trace the technical signal from
|
|
54
|
+
the exact location provided to its transmission endpoint.
|
|
55
|
+
- **Mandatory Starting Point**: Navigate to the file and line number specified
|
|
56
|
+
in the `data_sources` list.
|
|
57
|
+
- **Loop Discipline**: You must analyze the transmission path for *every* piece
|
|
58
|
+
of evidence listed to verify if it reaches an off-device sink.
|
|
59
|
+
- **Evidence**: Provide the file/line where the data is passed to the sink and a
|
|
60
|
+
brief justification of the sink's known transmission behavior (e.g., network
|
|
61
|
+
upload, telemetry payload).
|
|
62
|
+
- **Semantic Grounding**: Use the provided `*Description*` to verify that the
|
|
63
|
+
code evidence actually matches the semantic scope of the data type. If the
|
|
64
|
+
variable or logic refers to unrelated data (e.g., a `fileName` that does not
|
|
65
|
+
identify a user `NAME`), treat it as a false positive and follow the
|
|
66
|
+
**Evidentiary Standard** to downgrade or prune the finding.
|
|
67
|
+
- **Sink Categorization**: Determine the destination:
|
|
68
|
+
1. **First Party / Service Provider (`is_third_party: false`)**:
|
|
69
|
+
Developer-controlled servers, Firebase, custom APIs, etc.
|
|
70
|
+
2. **Third Party (`is_third_party: true`)**: Social SDKs, ad networks, or
|
|
71
|
+
user-selected apps via Android Share Sheet (`Intent.ACTION_SEND`).
|
|
72
|
+
- **Ambiguity Mandate**: If the destination is ambiguous (e.g., generic URL or
|
|
73
|
+
obfuscated SDK), you MUST default to `is_third_party: false` (erring on the
|
|
74
|
+
side of Collection).
|
|
75
|
+
- **On-Device Transfer**: Treat silent data sharing to another app via
|
|
76
|
+
Intents/ContentProviders as a transfer (`is_transferred: true`), even if it
|
|
77
|
+
doesn't use the network.
|
|
78
|
+
|
|
79
|
+
#### Step 2: Semantic Search for Protection (UI Disclosure)
|
|
80
|
+
|
|
81
|
+
**Conditional Execution**: Execute this step **ONLY IF** `is_transferred` is
|
|
82
|
+
`true` AND `user_initiated` is `false`.
|
|
83
|
+
- **Rationale**: User-initiated actions (Case 3 and 4) are exempt from Prominent
|
|
84
|
+
Disclosure. Do not search for disclosures if `user_initiated` is true.
|
|
85
|
+
- **Semantic Search**: Review the `disclosure` list below.
|
|
86
|
+
- **Gatekeeper Check**: Check if the Activity/Fragment displaying that consent
|
|
87
|
+
acts as a gatekeeper (i.e., gates the initialization of the data-collection
|
|
88
|
+
logic). Do not attempt to trace backwards from a low-level repository up to
|
|
89
|
+
the UI.
|
|
90
|
+
- **Content Check**: The UI must state *what* is collected and *how* it is used.
|
|
91
|
+
- **Evidence**: Provide the file/layout name and the specific text found.
|
|
92
|
+
|
|
93
|
+
#### Step 3: Synthesis
|
|
94
|
+
|
|
95
|
+
- **`findings` (CRITICAL)**: You must construct and output exactly **one**
|
|
96
|
+
object inside the `"findings"` array for **every** data type found in the
|
|
97
|
+
`data_sources` list below, regardless of whether it is compliant or a
|
|
98
|
+
violation.
|
|
99
|
+
- **Evaluating Keys**: For each data type object in `"findings"`, evaluate and
|
|
100
|
+
populate:
|
|
101
|
+
1. **psl_constant**: Set this exactly to the uppercase **PSL Constant** of
|
|
102
|
+
the data type (listed as the **Data Type** heading in the **Data Sources to
|
|
103
|
+
Trace** section below, e.g., `"PRECISE_LOCATION"`, `"CONTACTS"`). This is
|
|
104
|
+
critical for downstream matching.
|
|
105
|
+
2. **policy_id**: Set this exactly to either `"prominent_disclosure_policy"`
|
|
106
|
+
or `"data_safety_section"` depending on the check being performed.
|
|
107
|
+
3. **is_transferred**: `true` (JSON Boolean) if the data is transferred
|
|
108
|
+
off-device or on-device to a third party. `false` (JSON Boolean) if local
|
|
109
|
+
only.
|
|
110
|
+
4. **user_initiated**: `true` (JSON Boolean) if the user explicitly triggers
|
|
111
|
+
the transfer.
|
|
112
|
+
5. **is_third_party**: `true` (JSON Boolean) if the destination is a Third
|
|
113
|
+
Party (e.g., Share Sheet, Social SDK). `false` (JSON Boolean) if it's a
|
|
114
|
+
First Party/Service Provider (e.g., your own backend).
|
|
115
|
+
6. **prominent_disclosure_status**: Set strictly to one of these three
|
|
116
|
+
uppercase enums: `"DISCLOSED"` (visible disclosure and user consent found),
|
|
117
|
+
`"MISSING"` (no disclosure found, or is not an affirmative gatekeeper), or
|
|
118
|
+
`"EXEMPT"` (exempt from prominent disclosure under policies).
|
|
119
|
+
7. **purpose**: Categorize why the data is being collected (e.g., "App
|
|
120
|
+
functionality", "Analytics", "Local functionality only").
|
|
121
|
+
8. **linked_to_user**: `true` (JSON Boolean) if the data is tied to an
|
|
122
|
+
identity, email, or device ID, otherwise `false` (JSON Boolean).
|
|
123
|
+
|
|
124
|
+
- **Map findings strictly to the 5 Cases:** Use the Case matrix in "Policies to
|
|
125
|
+
Verify" to set the appropriate `severity` and `issue_summary` based on the
|
|
126
|
+
combination of `is_transferred`, `user_initiated`, `is_third_party`, and
|
|
127
|
+
`prominent_disclosure_status`.
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### Domain-Specific Heuristics
|
|
132
|
+
|
|
133
|
+
Apply the following heuristics while strictly adhering to the Heuristics &
|
|
134
|
+
Extrapolation Boundaries defined in your Execution Mandates:
|
|
135
|
+
1. **Implicit Data Leaks (The Logger Loop)**: Inspect if any custom logging
|
|
136
|
+
frameworks (e.g., Crashlytics, custom error loggers, or telemetry SDKs)
|
|
137
|
+
receive sensitive variables as part of diagnostic payloads. If a user
|
|
138
|
+
identifier (e.g., email, account ID) or precise location is passed to a
|
|
139
|
+
logger that uploads payloads off-device, this counts as **transferred**
|
|
140
|
+
(`is_transferred`: true).
|
|
141
|
+
2. **Third-Party SDK Siphoning**: Look at the project's build files on-demand
|
|
142
|
+
(e.g., build.gradle or libs.versions.toml). If SDKs like Google Ads, or
|
|
143
|
+
Firebase are initialized and have access to the context, evaluate if
|
|
144
|
+
they are siphoning advertiser IDs or device identifiers automatically. If
|
|
145
|
+
those libraries are loaded and the manifest requests broad network
|
|
146
|
+
permissions, treat those device identifiers as **transferred**
|
|
147
|
+
(`is_transferred`: true) for analytics/marketing purposes.
|
|
148
|
+
3. **Indirect Consent**: If you find an `AlertDialog` or disclosure, verify if
|
|
149
|
+
it is an actual gatekeeper. If the app begins tracking user data *prior* to
|
|
150
|
+
the user tapping "Accept", or if the user can close the dialog and continue
|
|
151
|
+
using the app while data tracking remains active, flag this as a `CRITICAL`
|
|
152
|
+
violation under `prominent_disclosure_policy`.
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
### Codebase Context & Evidence
|
|
157
|
+
|
|
158
|
+
{{#IF semantic_files.LEGAL}}
|
|
159
|
+
**Semantic Triage Starting Points (Files of Interest)**:
|
|
160
|
+
The following files likely contain privacy or consent logic:
|
|
161
|
+
- **LEGAL** related:
|
|
162
|
+
{{#EACH semantic_files.LEGAL}}
|
|
163
|
+
- `{{ITEM}}`
|
|
164
|
+
{{/EACH}}
|
|
165
|
+
{{/IF}}
|
|
166
|
+
|
|
167
|
+
{{#IF data_sources}}
|
|
168
|
+
**Data Sources to Trace**:
|
|
169
|
+
{{#EACH data_sources}}
|
|
170
|
+
- **Data Type**: {{KEY}}
|
|
171
|
+
*Description: {{VALUE.description}}*
|
|
172
|
+
{{#EACH VALUE.findings}}
|
|
173
|
+
- `{{ITEM}}`
|
|
174
|
+
{{/EACH}}
|
|
175
|
+
{{/EACH}}
|
|
176
|
+
{{/IF}}
|
|
177
|
+
|
|
178
|
+
{{#IF disclosure}}
|
|
179
|
+
**UI Disclosure Starting Points**:
|
|
180
|
+
{{#EACH disclosure}}
|
|
181
|
+
- `{{ITEM}}`
|
|
182
|
+
{{/EACH}}
|
|
183
|
+
{{/IF}}
|
|
184
|
+
|
|
185
|
+
## Output schema
|
|
186
|
+
|
|
187
|
+
Save final JSON output to `{{TEMP_DIR}}/worker_{{GOAL_NAME}}.json`.
|
|
188
|
+
|
|
189
|
+
```json
|
|
190
|
+
{
|
|
191
|
+
"domain": "Data Safety and Privacy",
|
|
192
|
+
"findings": [
|
|
193
|
+
{
|
|
194
|
+
"psl_constant": "STRING_VALUE (The exact PSL Constant, e.g., USER_ACCOUNT)",
|
|
195
|
+
"policy_id": "prominent_disclosure_policy | data_safety_section",
|
|
196
|
+
"issue_summary": "STRING_VALUE",
|
|
197
|
+
"severity": "CRITICAL | IMPORTANT | SUGGESTION",
|
|
198
|
+
"files_involved": ["STRING_VALUE"],
|
|
199
|
+
"evidence": "STRING_VALUE",
|
|
200
|
+
"recommendation": "STRING_VALUE",
|
|
201
|
+
|
|
202
|
+
# UNIFIED DATA SAFETY METADATA LOOKUP KEYS:
|
|
203
|
+
"is_transferred": true | false,
|
|
204
|
+
"user_initiated": true | false,
|
|
205
|
+
"is_third_party": true | false,
|
|
206
|
+
"prominent_disclosure_status": "DISCLOSED | MISSING | EXEMPT",
|
|
207
|
+
"purpose": "STRING_VALUE",
|
|
208
|
+
"linked_to_user": true | false
|
|
209
|
+
}
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
```
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
{{#IF_ALL requested_permissions.exact_alarm, exact_alarm}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
2
|
+
{{#IF_ALL requested_permissions.foreground_service, foreground_service}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
3
|
+
{{#IF_ALL requested_permissions.accessibility, accessibility}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
4
|
+
{{#IF_ALL requested_permissions.APPS_ON_DEVICE, data_sources.APPS_ON_DEVICE}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
5
|
+
{{#IF_ALL requested_permissions.SMS_CALL_LOG, data_sources.SMS_CALL_LOG}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
6
|
+
{{#IF_ALL requested_permissions.MEDIA, data_sources.MEDIA}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
7
|
+
{{#IF_ALL requested_permissions.AUDIO, data_sources.AUDIO}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
8
|
+
{{#IF_ALL requested_permissions.ALL_FILES, data_sources.FILES_AND_DOCS}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
9
|
+
{{#IF_ALL requested_permissions.LOCATION, data_sources.PRECISE_LOCATION}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
10
|
+
{{#IF_ALL requested_permissions.LOCATION, data_sources.APPROX_LOCATION}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
11
|
+
{{#IF_ALL requested_permissions.CONTACTS, data_sources.CONTACTS}}{{ACTIVATE_GOAL}}{{/IF_ALL}}
|
|
12
|
+
|
|
13
|
+
## Permissions and APIs Audit
|
|
14
|
+
|
|
15
|
+
### Hint: Deducing Core Functionality
|
|
16
|
+
|
|
17
|
+
Since you must determine if certain permissions are justified by the app's "core
|
|
18
|
+
purpose", use these fast heuristics:
|
|
19
|
+
1. **The "Broken" Test**: Is the feature essential to the app's primary purpose?
|
|
20
|
+
If the app would still be functional and useful without the feature, it is
|
|
21
|
+
NOT core functionality.
|
|
22
|
+
2. **Manifest Intent**: Review `AndroidManifest.xml`. The name of the `LAUNCHER`
|
|
23
|
+
Activity and specialized `<intent-filter>` declarations (like default SMS
|
|
24
|
+
handlers) strongly indicate the app's main purpose.
|
|
25
|
+
3. **Naming**: The package name (`{{PACKAGE_NAME}}`) and app label
|
|
26
|
+
(`{{APP_NAME}}`) often describe the app's purpose explicitly.
|
|
27
|
+
4. **Execution Context**: Usage in classes like `BackupManager` suggest core
|
|
28
|
+
functionality, whereas usage in `AdHelper`, `CrashReporter`, or
|
|
29
|
+
`AnalyticsManager` indicates secondary features.
|
|
30
|
+
5. **Mandatory Rule**: Secondary features like **advertising, analytics, or
|
|
31
|
+
social sharing never justify** restricted permissions like Background
|
|
32
|
+
Location, All Files Access, or Broad Media Access.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
### Policies to Verify
|
|
37
|
+
|
|
38
|
+
{{#IF_ALL requested_permissions.MEDIA, data_sources.MEDIA}}
|
|
39
|
+
#### Photo and Video Access Policy (Policy ID: photo_video_access_policy)
|
|
40
|
+
|
|
41
|
+
- **Goal**: Evaluate if the app's core functionality justifies broad access to
|
|
42
|
+
photos or if it should migrate to the Android Photo Picker.
|
|
43
|
+
- **The Policy Spirit**: User privacy is paramount. Apps should only request
|
|
44
|
+
broad media storage permissions if they are dedicated media managers (like
|
|
45
|
+
Gallery or Backup apps). For standard tasks like profile picture uploads,
|
|
46
|
+
custom sharing, or attaching media, developers must use scoped APIs to prevent
|
|
47
|
+
security risks.
|
|
48
|
+
- **Evidence**:
|
|
49
|
+
{{#EACH data_sources.MEDIA}}
|
|
50
|
+
- `{{ITEM}}`
|
|
51
|
+
{{/EACH}}
|
|
52
|
+
**Relevant Permissions Requested**:
|
|
53
|
+
{{#EACH requested_permissions.MEDIA}}
|
|
54
|
+
- `{{ITEM}}`
|
|
55
|
+
{{/EACH}}
|
|
56
|
+
{{#IF TARGET_SDK}}
|
|
57
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
58
|
+
{{/IF}}
|
|
59
|
+
- **Common Evaluation Matrix**:
|
|
60
|
+
| Target SDK | Broad Media Permission Requested? | Condition / Context Checked | Severity | Direct Actionable Recommendation |
|
|
61
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
62
|
+
| **33 or higher** | Yes | App requests broad media access (e.g. `READ_MEDIA_IMAGES`), but features only require user-selected media. | `IMPORTANT` | Migrate to the **Android Photo Picker** (`MediaStore.ACTION_PICK_IMAGES`) which does not require any permission prompt. |
|
|
63
|
+
| **Any** | Yes | App requests broad storage/media permissions but is not a dedicated media manager (e.g., a social or utility app). | `IMPORTANT` | Migrate to the **Android Photo Picker** for single-item or multi-item media selection. |
|
|
64
|
+
|
|
65
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
66
|
+
Look beyond standard native file pickers. Extrapolate using this heuristic:
|
|
67
|
+
1. **User-Selected Media Heuristic**: Analyze where the code handles selected
|
|
68
|
+
files. If images or videos are loaded strictly via a user-facing button
|
|
69
|
+
click (e.g., "Upload Avatar", "Share Photo", "Attach File") and processed
|
|
70
|
+
one-at-a-time, broad filesystem media permissions are structurally
|
|
71
|
+
unnecessary. Flag an `IMPORTANT` violation and recommend Photo Picker
|
|
72
|
+
migration.
|
|
73
|
+
{{/IF_ALL}}
|
|
74
|
+
|
|
75
|
+
{{#IF_ALL requested_permissions.ALL_FILES, data_sources.FILES_AND_DOCS}}
|
|
76
|
+
#### All Files Access Policy (Policy ID: all_files_access_policy)
|
|
77
|
+
|
|
78
|
+
- **Goal**: Evaluate if the app's core purpose justifies the high-risk
|
|
79
|
+
`MANAGE_EXTERNAL_STORAGE` permission.
|
|
80
|
+
- **The Policy Spirit**: Full filesystem access is a restricted privilege. The
|
|
81
|
+
Play Store strictly limits `MANAGE_EXTERNAL_STORAGE` to apps where full disk
|
|
82
|
+
reads/writes are critical to the core purpose (e.g., file managers, antivirus
|
|
83
|
+
scanner, backup tools). Non-compliant apps must utilize Scoped Storage or
|
|
84
|
+
Storage Access Framework (SAF).
|
|
85
|
+
- **Evidence**:
|
|
86
|
+
{{#EACH data_sources.FILES_AND_DOCS}}
|
|
87
|
+
- `{{ITEM}}`
|
|
88
|
+
{{/EACH}}
|
|
89
|
+
**Relevant Permissions Requested**:
|
|
90
|
+
{{#EACH requested_permissions.ALL_FILES}}
|
|
91
|
+
- `{{ITEM}}`
|
|
92
|
+
{{/EACH}}
|
|
93
|
+
- **Common Evaluation Matrix**:
|
|
94
|
+
| Core App Purpose | Is Permission Justified? | Severity | Direct Actionable Recommendation |
|
|
95
|
+
| :--- | :--- | :--- | :--- |
|
|
96
|
+
| **File Manager, Antivirus, Backup/Restore, or Document Manager** | Yes (Compliant) | None | No action needed; core purpose justifies the restricted permission. |
|
|
97
|
+
| **Standard Utility, Social Media, Game, or Productivity App** | No (Violation) | `CRITICAL` | Remove `MANAGE_EXTERNAL_STORAGE` from the Manifest. For document picking or local file saving, migrate to the **Storage Access Framework (SAF)**. |
|
|
98
|
+
|
|
99
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
100
|
+
Surgically audit how the filesystem is queried:
|
|
101
|
+
1. **Scoped Storage Sufficiency**: Check the files using the storage APIs. If
|
|
102
|
+
the app is using filesystem pathways solely to log diagnostics, store
|
|
103
|
+
custom caches, or save simple download artifacts, broad access is not
|
|
104
|
+
justified. Recommend using app-specific directories
|
|
105
|
+
(`Context.getExternalFilesDir()`) which require zero permissions.
|
|
106
|
+
{{/IF_ALL}}
|
|
107
|
+
|
|
108
|
+
{{#IF requested_permissions.LOCATION}}
|
|
109
|
+
{{#IF_ANY data_sources.PRECISE_LOCATION, data_sources.APPROX_LOCATION}}
|
|
110
|
+
#### Location Access Policy (Policy ID: location_access_policy)
|
|
111
|
+
|
|
112
|
+
- **Goal**: Verify that location access is essential, uses minimum scope, and is
|
|
113
|
+
properly disclosed.
|
|
114
|
+
- **The Policy Spirit**: User tracking is extremely sensitive. Apps must collect
|
|
115
|
+
the minimum scope of location required (approximate vs precise), provide clear
|
|
116
|
+
prominent disclosures, and must never utilize background tracking unless it is
|
|
117
|
+
essential for safety, navigation, or physical fitness features.
|
|
118
|
+
- **Evidence**:
|
|
119
|
+
{{#IF data_sources.PRECISE_LOCATION}}
|
|
120
|
+
- **Precise Location usage**:
|
|
121
|
+
{{#EACH data_sources.PRECISE_LOCATION}}
|
|
122
|
+
- `{{ITEM}}`
|
|
123
|
+
{{/EACH}}
|
|
124
|
+
{{/IF}}
|
|
125
|
+
{{#IF data_sources.APPROX_LOCATION}}
|
|
126
|
+
- **Approximate Location usage**:
|
|
127
|
+
{{#EACH data_sources.APPROX_LOCATION}}
|
|
128
|
+
- `{{ITEM}}`
|
|
129
|
+
{{/EACH}}
|
|
130
|
+
{{/IF}}
|
|
131
|
+
**Relevant Permissions Requested**:
|
|
132
|
+
{{#EACH requested_permissions.LOCATION}}
|
|
133
|
+
- `{{ITEM}}`
|
|
134
|
+
{{/EACH}}
|
|
135
|
+
{{#IF TARGET_SDK}}
|
|
136
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
137
|
+
{{/IF}}
|
|
138
|
+
- **Common Evaluation Matrix**:
|
|
139
|
+
| Scope | Target SDK | Finding / Condition Checked | Severity | Direct Actionable Recommendation |
|
|
140
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
141
|
+
| **Foreground** | Any | Requests `ACCESS_FINE_LOCATION` but features only require city-level or approximate weather/search features. | `IMPORTANT` | Downgrade Manifest to `ACCESS_COARSE_LOCATION` to respect the minimum scope mandate. |
|
|
142
|
+
| **Foreground** | Any | App purpose (`{{APP_NAME}}`) does not imply location, yet foreground tracking is used, and prominent disclosure alert code is missing. | `IMPORTANT` | Implement a **Prominent In-App Disclosure** dialog explaining what location data is collected *before* requesting foreground permission. |
|
|
143
|
+
| **Background** | Any | Requests `ACCESS_BACKGROUND_LOCATION` solely for advertising, marketing, or general analytics. | `CRITICAL` | **High-Risk Violation**: Completely remove background location collection from the codebase. |
|
|
144
|
+
| **Background** | Any | Requests background location, but features could operate with foreground location access. | `IMPORTANT` | Downgrade the feature to foreground-only location tracking and remove background permission. |
|
|
145
|
+
| **Background** | Any | Background location is legitimate, but prominent disclosure does not mention "location" and "when the app is closed or not in use." | `IMPORTANT` | Update the Prominent Disclosure text to explicitly state "location" and "when closed or not in use". |
|
|
146
|
+
| **Foreground** | **37 or higher** | Precise location is requested on Android 17+. | `SUGGESTION` | Migrate to the **Location Button** API as the minimum scope mechanism for precise foreground location. |
|
|
147
|
+
|
|
148
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
149
|
+
Actively trace custom background workers and disclosures:
|
|
150
|
+
1. **The Foreground Sufficiency Test**: Analyze background threads,
|
|
151
|
+
`WorkManager` tasks, or background services triggering location updates. If
|
|
152
|
+
the background process performs syncing or location calculations that could
|
|
153
|
+
be deferred to when the user is actively viewing the app, flag an
|
|
154
|
+
`IMPORTANT` violation.
|
|
155
|
+
2. **The Reasonable Expectation Test**: If the app label (`{{APP_NAME}}`) or
|
|
156
|
+
packages suggest a utility that shouldn't logically track location,
|
|
157
|
+
evaluate any indirect geo-tracking (such as geo-lookup of network IP
|
|
158
|
+
addresses, or sending local Wi-Fi SSID logs off-device). If found, flag an
|
|
159
|
+
`IMPORTANT` missing prominent disclosure.
|
|
160
|
+
{{/IF_ANY}}
|
|
161
|
+
{{/IF}}
|
|
162
|
+
|
|
163
|
+
{{#IF_ALL requested_permissions.CONTACTS, data_sources.CONTACTS}}
|
|
164
|
+
#### Contacts Access Policy (Policy ID: contacts_access_policy)
|
|
165
|
+
|
|
166
|
+
- **Goal**: Evaluate if broad contacts access (`READ_CONTACTS`) is justified or
|
|
167
|
+
if the Android Contact Picker should be used.
|
|
168
|
+
- **The Policy Spirit**: Address books contain sensitive personal details. The
|
|
169
|
+
Play Store mandates that apps use scoped contact access unless broad,
|
|
170
|
+
continuous contacts synchronization is critical (such as in social network
|
|
171
|
+
friend-matching or full contact managers).
|
|
172
|
+
- **Evidence**:
|
|
173
|
+
{{#EACH data_sources.CONTACTS}}
|
|
174
|
+
- `{{ITEM}}`
|
|
175
|
+
{{/EACH}}
|
|
176
|
+
**Relevant Permissions Requested**:
|
|
177
|
+
{{#EACH requested_permissions.CONTACTS}}
|
|
178
|
+
- `{{ITEM}}`
|
|
179
|
+
{{/EACH}}
|
|
180
|
+
{{#IF TARGET_SDK}}
|
|
181
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
182
|
+
{{/IF}}
|
|
183
|
+
- **Common Evaluation Matrix**:
|
|
184
|
+
| Target SDK | Access Model | Condition / Finding Checked | Severity | Direct Actionable Recommendation |
|
|
185
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
186
|
+
| **Any** | Broad (`READ_CONTACTS`) | Broad access is requested for one-time transactions, file sharing, referrals, or simple forms. | `IMPORTANT` | Migrate to the **Android Contact Picker** (`Intent.ACTION_PICK_CONTACTS`) to query contacts securely. |
|
|
187
|
+
| **37 or higher** | Broad (`READ_CONTACTS`) | Target SDK is 37+ (effective Oct 2026), and broad access is used for secondary or standard tasks. | `IMPORTANT` | Migrate to the **Android Contact Picker** as broad contacts access is restricted. |
|
|
188
|
+
|
|
189
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
190
|
+
Evaluate the depth of contact queries:
|
|
191
|
+
1. **Single-Item Verification**: Search for database cursors reading contact
|
|
192
|
+
tables (`ContactsContract.CommonDataKinds`). If the cursors are used solely
|
|
193
|
+
to let a user select a single friend, mobile phone number, or email
|
|
194
|
+
address, broad contacts access is a violation. Recommend Contact Picker.
|
|
195
|
+
{{/IF_ALL}}
|
|
196
|
+
|
|
197
|
+
{{#IF_ALL requested_permissions.exact_alarm, exact_alarm}}
|
|
198
|
+
#### Exact Alarm Policy (Policy ID: exact_alarm_policy)
|
|
199
|
+
|
|
200
|
+
- **Goal**: Evaluate if the app's core functionality justifies the
|
|
201
|
+
`USE_EXACT_ALARM` permission.
|
|
202
|
+
- **The Policy Spirit**: Exact alarms degrade system performance and battery
|
|
203
|
+
life. The Play Store strictly limits the high-risk `USE_EXACT_ALARM`
|
|
204
|
+
permission to alarm clocks, timers, and calendar apps where precise,
|
|
205
|
+
down-to-the-second timing is critical.
|
|
206
|
+
- **Evidence**:
|
|
207
|
+
{{#EACH exact_alarm}}
|
|
208
|
+
- `{{ITEM}}`
|
|
209
|
+
{{/EACH}}
|
|
210
|
+
**Relevant Permissions Requested**:
|
|
211
|
+
{{#EACH requested_permissions.exact_alarm}}
|
|
212
|
+
- `{{ITEM}}`
|
|
213
|
+
{{/EACH}}
|
|
214
|
+
- **Common Evaluation Matrix**:
|
|
215
|
+
| Core App Purpose | Permission Requested | Justified? | Severity | Direct Actionable Recommendation |
|
|
216
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
217
|
+
| **Alarm Clock, Timer, or Calendar App** | `USE_EXACT_ALARM` | Yes (Compliant) | None | No action needed. |
|
|
218
|
+
| **Standard Utility, Game, Sync, or Productivity App** | `USE_EXACT_ALARM` | No (Violation) | `IMPORTANT` | Switch to `SCHEDULE_EXACT_ALARM` which respects system battery constraints, or use standard `AlarmManager` inexact scheduling. |
|
|
219
|
+
|
|
220
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
221
|
+
Examine alarm trigger targets:
|
|
222
|
+
1. **Time-Insensitive Syncing**: Verify the files scheduling alarms. If alarms
|
|
223
|
+
are used to fetch network updates, clean cache files, trigger analytics
|
|
224
|
+
uploads, or post local daily notifications, exact timing is not justified.
|
|
225
|
+
Recommend using `WorkManager` for background tasks instead of
|
|
226
|
+
`AlarmManager`.
|
|
227
|
+
{{/IF_ALL}}
|
|
228
|
+
|
|
229
|
+
{{#IF_ALL requested_permissions.foreground_service, foreground_service}}
|
|
230
|
+
#### Foreground Services (Policy ID: foreground_services_policy)
|
|
231
|
+
|
|
232
|
+
- **Goal**: Verify the declaration and justification of foreground services.
|
|
233
|
+
- **The Policy Spirit**: Foreground services keep processes alive in the
|
|
234
|
+
background and must be highly visible to users. Every declared service must
|
|
235
|
+
have an appropriate `foregroundServiceType` defined in the Manifest, and
|
|
236
|
+
special types like `specialUse` require specific tag property justifications.
|
|
237
|
+
- **Evidence**:
|
|
238
|
+
{{#EACH foreground_service}}
|
|
239
|
+
- `{{ITEM}}`
|
|
240
|
+
{{/EACH}}
|
|
241
|
+
**Relevant Permissions Requested**:
|
|
242
|
+
{{#EACH requested_permissions.foreground_service}}
|
|
243
|
+
- `{{ITEM}}`
|
|
244
|
+
{{/EACH}}
|
|
245
|
+
{{#IF TARGET_SDK}}
|
|
246
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
247
|
+
{{/IF}}
|
|
248
|
+
- **Common Evaluation Matrix**:
|
|
249
|
+
| Service Configuration | Justification Check | Severity | Direct Actionable Recommendation |
|
|
250
|
+
| :--- | :--- | :--- | :--- |
|
|
251
|
+
| **Missing type tag** | Foreground service is declared but lacks a `foregroundServiceType` attribute. | `CRITICAL` | Add the appropriate `android:foregroundServiceType` attribute to the service declaration in the Manifest. |
|
|
252
|
+
| **Lacks specialUse property** | Service type is `specialUse`, but Manifest lacks the required `<property android:name="android.app.PROPERTY_SPECIAL_USE_FGS_SUBTYPE" ...>` tag. | `CRITICAL` | Add the `<property>` tag inside the service block with a valid subtype string. |
|
|
253
|
+
| **Type Misalignment** | Declared FGS type does not logically align with the app's core purpose. | `IMPORTANT` | Re-align FGS type to match app features, or migrate background operations to **WorkManager** if user-visible foreground presence is not justified. |
|
|
254
|
+
| **Declaration Reminder** | Foreground service is declared (even if type is correct). | `SUGGESTION` | **Play Console Declaration Required**: For apps targeting Android 14+, you must complete a Foreground Service declaration in the Play Console (App content section) for each type used, providing a functional description, user impact video, and a specific use case selection. |
|
|
255
|
+
|
|
256
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
257
|
+
Critique specialUse justifications and service behavior:
|
|
258
|
+
1. **Justification String Audit**: Read the text of the `<property>` tag for
|
|
259
|
+
`specialUse`. If the text contains weak, boilerplate, or placeholder
|
|
260
|
+
justifications (e.g., "requires background process for app to run"), flag
|
|
261
|
+
an `IMPORTANT` violation warning the developer that Google Play reviewers
|
|
262
|
+
will reject this service.
|
|
263
|
+
2. **Notification Integrity**: Verify if the FGS implementation creates a
|
|
264
|
+
valid user-facing notification. If no `startForeground()` or notification
|
|
265
|
+
builder logic is associated with the service initiation, flag an
|
|
266
|
+
`IMPORTANT` violation.
|
|
267
|
+
3. **Play Console Declaration Confirmation**: If any foreground service is
|
|
268
|
+
used, flag a `SUGGESTION` to remind the developer that a specialized
|
|
269
|
+
declaration form in the Play Console is mandatory, requiring a video
|
|
270
|
+
demonstration of the feature.
|
|
271
|
+
{{/IF_ALL}}
|
|
272
|
+
|
|
273
|
+
{{#IF_ALL requested_permissions.accessibility, accessibility}}
|
|
274
|
+
#### Accessibility API Policy (Policy ID: accessibility_api_policy)
|
|
275
|
+
|
|
276
|
+
- **Goal**: Verify the configuration and justification of Accessibility
|
|
277
|
+
Services.
|
|
278
|
+
- **The Policy Spirit**: Accessibility APIs provide deep system access to assist
|
|
279
|
+
users with disabilities. Using these APIs for non-accessibility tasks (like UI
|
|
280
|
+
automation, screen scraping, background monitoring, or ad blocking) is
|
|
281
|
+
strictly prohibited by Google Play and causes immediate app rejection.
|
|
282
|
+
- **Evidence**:
|
|
283
|
+
{{#EACH accessibility}}
|
|
284
|
+
- `{{ITEM}}`
|
|
285
|
+
{{/EACH}}
|
|
286
|
+
**Relevant Permissions Requested**:
|
|
287
|
+
{{#EACH requested_permissions.accessibility}}
|
|
288
|
+
- `{{ITEM}}`
|
|
289
|
+
{{/EACH}}
|
|
290
|
+
- **Common Evaluation Matrix**:
|
|
291
|
+
| Service Configuration | Real Code Usage | Justified? | Severity | Direct Actionable Recommendation |
|
|
292
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
293
|
+
| **`isAccessibilityTool="true"`** | Code performs screen scraping, ad blocking, or automated click routines for standard users. | No (Violation) | `CRITICAL` | **High Risk of Play Store Rejection**: Remove accessibility helper configs. Migrate UI automation to standard Android testing libraries. |
|
|
294
|
+
| **`isAccessibilityTool` false/missing** | Code implements an accessibility listener but is not a dedicated helper app. | No prominent disclosure | `CRITICAL` | **High Risk of Play Store Rejection**: Because you request accessibility permission for a standard utility, you MUST implement an in-app **Prominent Disclosure and Affirmative Consent screen** before asking the user to enable the service, otherwise your app will be rejected. |
|
|
295
|
+
|
|
296
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
297
|
+
Trace the ingestion of accessibility events:
|
|
298
|
+
1. **Telemetry Siphoning**: Scan the Accessibility Service methods
|
|
299
|
+
(`onAccessibilityEvent`). If the service captures on-screen text,
|
|
300
|
+
notifications, or keystrokes and routes them to local caches, shared
|
|
301
|
+
preferences, or off-device network logging endpoints, flag a `CRITICAL`
|
|
302
|
+
violation under the Accessibility API policy.
|
|
303
|
+
{{/IF_ALL}}
|
|
304
|
+
|
|
305
|
+
{{#IF_ALL requested_permissions.APPS_ON_DEVICE, data_sources.APPS_ON_DEVICE}}
|
|
306
|
+
#### Package Visibility (Policy ID: package_visibility_policy)
|
|
307
|
+
|
|
308
|
+
- **Goal**: Evaluate if the app's core functionality justifies broad visibility
|
|
309
|
+
into installed apps (`QUERY_ALL_PACKAGES` or related package APIs).
|
|
310
|
+
- **The Policy Spirit**: The list of installed apps reveals sensitive user
|
|
311
|
+
habits. The Play Store strictly restricts the `QUERY_ALL_PACKAGES` permission
|
|
312
|
+
to apps that directly manage device safety (Antivirus, File Managers, Device
|
|
313
|
+
Search).
|
|
314
|
+
- **Evidence**:
|
|
315
|
+
{{#EACH data_sources.APPS_ON_DEVICE}}
|
|
316
|
+
- `{{ITEM}}`
|
|
317
|
+
{{/EACH}}
|
|
318
|
+
**Relevant Permissions Requested**:
|
|
319
|
+
{{#EACH requested_permissions.APPS_ON_DEVICE}}
|
|
320
|
+
- `{{ITEM}}`
|
|
321
|
+
{{/EACH}}
|
|
322
|
+
- **Common Evaluation Matrix**:
|
|
323
|
+
| Core App Purpose | Permission Requested | Justified? | Severity | Direct Actionable Recommendation |
|
|
324
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
325
|
+
| **Antivirus, File Manager, or Device Search** | `QUERY_ALL_PACKAGES` | Yes (Compliant) | None | No action needed. |
|
|
326
|
+
| **Any App** | `QUERY_ALL_PACKAGES` | No, used for ads, analytics, or secondary marketing. | `IMPORTANT` | **High-Risk Violation**: Remove the permission from the Manifest. Use specific `<queries>` intent declarations if package checks are strictly required for sharing/integration. |
|
|
327
|
+
|
|
328
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
329
|
+
Examine indirect queries:
|
|
330
|
+
1. **Indirect Package Searching**: Check if the code queries package details
|
|
331
|
+
dynamically using `PackageManager.getInstalledPackages()` or checks intents
|
|
332
|
+
in loops. If the intent lists are used to deduce if competitor apps or
|
|
333
|
+
advertising profiles exist, flag an `IMPORTANT` violation of package
|
|
334
|
+
visibility guidelines.
|
|
335
|
+
{{/IF_ALL}}
|
|
336
|
+
|
|
337
|
+
{{#IF_ALL requested_permissions.SMS_CALL_LOG, data_sources.SMS_CALL_LOG}}
|
|
338
|
+
#### SMS and Call Log Permissions (Policy ID: sms_call_log_policy)
|
|
339
|
+
|
|
340
|
+
- **Goal**: Evaluate if the app's core functionality justifies access to
|
|
341
|
+
sensitive SMS or Call Log data.
|
|
342
|
+
- **The Policy Spirit**: SMS and Call details are high-risk. Google Play
|
|
343
|
+
restricts access to default phone handlers and default SMS handlers. Standard
|
|
344
|
+
utility or shopping apps must use non-privileged APIs for SMS-based
|
|
345
|
+
verification.
|
|
346
|
+
- **Evidence**:
|
|
347
|
+
{{#EACH data_sources.SMS_CALL_LOG}}
|
|
348
|
+
- `{{ITEM}}`
|
|
349
|
+
{{/EACH}}
|
|
350
|
+
**Relevant Permissions Requested**:
|
|
351
|
+
{{#EACH requested_permissions.SMS_CALL_LOG}}
|
|
352
|
+
- `{{ITEM}}`
|
|
353
|
+
{{/EACH}}
|
|
354
|
+
- **Common Evaluation Matrix**:
|
|
355
|
+
| Code Context | Finding / Trigger Checked | Severity | Direct Actionable Recommendation |
|
|
356
|
+
| :--- | :--- | :--- | :--- |
|
|
357
|
+
| **OTP/Account Verification** | App requests SMS permissions to automatically read login verification codes (OTPs). | `IMPORTANT` | Migrate to the **SMS Retriever API** or **SMS User Consent API** which require zero permissions. |
|
|
358
|
+
| **Utility or Secondary Feature** | App requests SMS/Call log access for non-core dashboard or notification features. | `CRITICAL` | **High-Risk Violation**: Completely remove SMS and Call Log permissions from the Manifest. |
|
|
359
|
+
| **Default SMS Handler** | App appears to be a legitimate handler (e.g. implements required intent filters). | `SUGGESTION` | **Play Console Declaration**: You must submit a **Permissions Declaration Form** in the Play Console and may be required to provide a video demonstration of this core functionality. |
|
|
360
|
+
|
|
361
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
362
|
+
Audit background receivers:
|
|
363
|
+
1. **Background Incoming SMS Listeners**: Check if a `BroadcastReceiver`
|
|
364
|
+
listens to `android.provider.Telephony.SMS_RECEIVED`. If this receiver
|
|
365
|
+
parses text in the background without being a designated default SMS
|
|
366
|
+
handler, flag a `CRITICAL` violation.
|
|
367
|
+
2. **Default Handler Confirmation**: If the app requests SMS/Call Log
|
|
368
|
+
permissions and correctly implements the system-mandated intent filters for
|
|
369
|
+
a Default Handler, flag a `SUGGESTION` to remind the developer about the
|
|
370
|
+
mandatory Play Console declaration form.
|
|
371
|
+
{{/IF_ALL}}
|
|
372
|
+
|
|
373
|
+
{{#IF_ALL requested_permissions.AUDIO, data_sources.AUDIO}}
|
|
374
|
+
#### Audio Recording Policy (Policy ID: audio_recording_policy)
|
|
375
|
+
|
|
376
|
+
- **Goal**: Evaluate if the app's core functionality justifies broad access to
|
|
377
|
+
audio recording.
|
|
378
|
+
- **The Policy Spirit**: Unprompted audio recording is a severe privacy breach.
|
|
379
|
+
Apps should request microphone access strictly for user-visible, time-bounded
|
|
380
|
+
actions. Target SDK 34+ encourages using the system-managed Microphone Button
|
|
381
|
+
for temporary needs.
|
|
382
|
+
- **Evidence**:
|
|
383
|
+
{{#EACH data_sources.AUDIO}}
|
|
384
|
+
- `{{ITEM}}`
|
|
385
|
+
{{/EACH}}
|
|
386
|
+
**Relevant Permissions Requested**:
|
|
387
|
+
{{#EACH requested_permissions.AUDIO}}
|
|
388
|
+
- `{{ITEM}}`
|
|
389
|
+
{{/EACH}}
|
|
390
|
+
{{#IF TARGET_SDK}}
|
|
391
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
392
|
+
{{/IF}}
|
|
393
|
+
- **Common Evaluation Matrix**:
|
|
394
|
+
| Target SDK | Audio Recording Trigger Context | Severity | Direct Actionable Recommendation |
|
|
395
|
+
| :--- | :--- | :--- | :--- |
|
|
396
|
+
| **34 or higher** | App requests broad `RECORD_AUDIO` permission for occasional, user-initiated vocal input or short recording. | `IMPORTANT` | Migrate to the **Android Microphone Button** API to process temporary audio securely. |
|
|
397
|
+
| **Any** | App captures audio for secondary features (analytics, user-agent details, etc.) without explicit user control. | `IMPORTANT` | Remove microphone permissions. For general searches, integrate standard Android Speech Recognizer intents. |
|
|
398
|
+
|
|
399
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
400
|
+
Verify recording indicators and threads:
|
|
401
|
+
1. **Continuous Capture**: Scan for active recorder threads (`AudioRecord` or
|
|
402
|
+
`MediaRecorder`). If recording loops can be active when the app is
|
|
403
|
+
minimized or without a visible user-facing indicator, flag this as a
|
|
404
|
+
`CRITICAL` violation.
|
|
405
|
+
{{/IF_ALL}}
|
|
406
|
+
|
|
407
|
+
{{#IF_ALL requested_permissions.FILES_AND_DOCS, data_sources.FILES_AND_DOCS}}
|
|
408
|
+
#### Files and Docs Access Policy (Policy ID: files_and_docs_policy)
|
|
409
|
+
|
|
410
|
+
- **Goal**: Evaluate if broad file access (non-media) is justified or if the
|
|
411
|
+
Storage Access Framework should be used.
|
|
412
|
+
- **The Policy Spirit**: Storage isolation (Scoped Storage) is mandatory on
|
|
413
|
+
modern Android versions. Broad access to shared files is heavily restricted.
|
|
414
|
+
Standard files, documents, and download folders should be navigated using
|
|
415
|
+
scoped contracts to prevent global filesystem snooping.
|
|
416
|
+
- **Evidence**:
|
|
417
|
+
{{#EACH data_sources.FILES_AND_DOCS}}
|
|
418
|
+
- `{{ITEM}}`
|
|
419
|
+
{{/EACH}}
|
|
420
|
+
**Relevant Permissions Requested**:
|
|
421
|
+
{{#EACH requested_permissions.FILES_AND_DOCS}}
|
|
422
|
+
- `{{ITEM}}`
|
|
423
|
+
{{/EACH}}
|
|
424
|
+
{{#IF TARGET_SDK}}
|
|
425
|
+
**Target SDK**: `{{TARGET_SDK}}`
|
|
426
|
+
{{/IF}}
|
|
427
|
+
- **Common Evaluation Matrix**:
|
|
428
|
+
| Target SDK | Storage Configuration | Justified? | Severity | Direct Actionable Recommendation |
|
|
429
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
430
|
+
| **30 or higher** | App requests broad `READ_EXTERNAL_STORAGE` or `WRITE_EXTERNAL_STORAGE` for simple document selection. | No (Violation) | `IMPORTANT` | **Scoped Storage Mandate**: Migrate your document/file selections to the **Storage Access Framework (SAF)** (`Intent.ACTION_OPEN_DOCUMENT`). |
|
|
431
|
+
|
|
432
|
+
- **Domain-Specific Heuristics (Strictly Bounded)**:
|
|
433
|
+
Critique external directory creation:
|
|
434
|
+
1. **Manual File Sync Heuristic**: Check if the code creates custom root-level
|
|
435
|
+
folders on external storage (e.g.
|
|
436
|
+
`Environment.getExternalStorageDirectory() + "/my_folder"`). If directories
|
|
437
|
+
are created for standard document outputs or logging, flag an `IMPORTANT`
|
|
438
|
+
violation. Direct the developer to utilize scoped storage paths.
|
|
439
|
+
{{/IF_ALL}}
|
|
440
|
+
|
|
441
|
+
## Output schema
|
|
442
|
+
|
|
443
|
+
Save final JSON output to `{{TEMP_DIR}}/worker_{{GOAL_NAME}}.json`.
|
|
444
|
+
|
|
445
|
+
```json
|
|
446
|
+
{
|
|
447
|
+
"domain": "Permissions and APIs",
|
|
448
|
+
"findings": [
|
|
449
|
+
{
|
|
450
|
+
"policy_id": "STRING_VALUE (The exact Policy ID, e.g., photo_video_access_policy)",
|
|
451
|
+
"issue_summary": "STRING_VALUE",
|
|
452
|
+
"severity": "CRITICAL | IMPORTANT | SUGGESTION",
|
|
453
|
+
"files_involved": ["STRING_VALUE"],
|
|
454
|
+
"evidence": "STRING_VALUE",
|
|
455
|
+
"recommendation": "STRING_VALUE"
|
|
456
|
+
}
|
|
457
|
+
]
|
|
458
|
+
}
|
|
459
|
+
```
|