{"id":"e92e1255-f572-460d-a5cd-f31a7dc92d79","shortId":"SMC9kP","kind":"skill","title":"android-ui-states-validation","tagline":"Review Android UI flows for empty, loading, error, offline, and edge-case behavior before release.","description":"# Android UI States Validation\n\n## When To Use\n- Use this skill when the request is about: validate android ui states, check loading empty error flow android, edge cases in android screen.\n- Primary outcome: Review Android UI flows for empty, loading, error, offline, and edge-case behavior before release.\n- Reach for this skill when the core question is state coverage and recovery UX, not which test framework or assertion library to use.\n- This skill decides what the user should see in each branch of the state matrix. `android-testing-ui` only validates that design with assertions and screenshots.\n- Handoff skills when the scope expands:\n- `android-compose-accessibility`\n- `android-testing-ui`\n\n## Workflow\n1. Confirm the user-visible journey, target device behavior, and failure states that matter.\n2. Build a state matrix that covers loading, content, empty, error, offline, stale-data, denied-permission, and post-action confirmation states as applicable.\n3. Identify the owning screens, activities, destinations, and state holders for each branch of that matrix.\n4. Validate recovery UX, accessibility, configuration changes, and back-stack behavior in the showcase apps.\n5. Hand off to testing only when the missing work is about assertions or automation rather than state design.\n\n## Guardrails\n- Treat loading, empty, error, offline, and permission-denied states as first-class UI states.\n- Do not hide navigation or permission side effects inside reusable UI components.\n- Prefer lifecycle-aware APIs over manual callback chains.\n- Keep deep links, intents, and permission prompts testable and observable.\n- Distinguish transient messages, persistent error states, and stale-but-usable content instead of collapsing them into one generic failure screen.\n\n## Anti-Patterns\n- Assuming the happy path is enough for product flows.\n- Hard-coding request codes or route strings in multiple places.\n- Triggering navigation directly from repositories or network layers.\n- Shipping flows without recovery UI for denied permissions or broken state.\n- Using tests as a substitute for deciding what the product should show in each failure mode.\n\n## Examples\n### Happy path\n- Scenario: Validate OrbitTasks loading, content, and success confirmation states.\n- Command: `cd examples/orbittasks-compose && ./gradlew :app:connectedDebugAndroidTest`\n\n### Edge case\n- Scenario: Exercise long content, empty lists, and sync failures in the XML fixture.\n- Command: `cd examples/orbittasks-xml && ./gradlew :app:connectedDebugAndroidTest`\n\n### Failure recovery\n- Scenario: Avoid misrouting UI validation work to accessibility or testing-only skills.\n- Command: `python3 scripts/eval_triggers.py --skill android-ui-states-validation`\n\n## Done Checklist\n- The implementation path is explicit, minimal, and tied to the right Android surface.\n- Relevant example commands and benchmark prompts have been exercised or updated.\n- Handoffs to adjacent skills are documented when the request crosses boundaries.\n- Official references cover the chosen pattern and the main migration or troubleshooting path.\n\n## Official References\n- [https://developer.android.com/topic/architecture/ui-layer](https://developer.android.com/topic/architecture/ui-layer)\n- [https://developer.android.com/guide/topics/resources/runtime-changes](https://developer.android.com/guide/topics/resources/runtime-changes)\n- [https://developer.android.com/guide/practices/ui_guidelines](https://developer.android.com/guide/practices/ui_guidelines)\n- [https://developer.android.com/guide/topics/ui/accessibility/apps](https://developer.android.com/guide/topics/ui/accessibility/apps)","tags":["android","states","validation","agent","skills","krutikjain","agent-skills","android-development","android-skills","androidx","claude-code","codex"],"capabilities":["skill","source-krutikjain","skill-android-ui-states-validation","topic-agent-skills","topic-android","topic-android-development","topic-android-skills","topic-androidx","topic-claude-code","topic-codex","topic-cursor","topic-jetpack-compose","topic-kotlin","topic-skills"],"categories":["android-agent-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/krutikJain/android-agent-skills/android-ui-states-validation","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add krutikJain/android-agent-skills","source_repo":"https://github.com/krutikJain/android-agent-skills","install_from":"skills.sh"}},"qualityScore":"0.454","qualityRationale":"deterministic score 0.45 from registry signals: · indexed on github topic:agent-skills · 8 github stars · SKILL.md body (3,640 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-18T19:13:29.288Z","embedding":null,"createdAt":"2026-05-18T13:20:52.374Z","updatedAt":"2026-05-18T19:13:29.288Z","lastSeenAt":"2026-05-18T19:13:29.288Z","tsv":"'/gradlew':369,390 '/guide/practices/ui_guidelines](https://developer.android.com/guide/practices/ui_guidelines)':477 '/guide/topics/resources/runtime-changes](https://developer.android.com/guide/topics/resources/runtime-changes)':474 '/guide/topics/ui/accessibility/apps](https://developer.android.com/guide/topics/ui/accessibility/apps)':480 '/topic/architecture/ui-layer](https://developer.android.com/topic/architecture/ui-layer)':471 '1':135 '2':150 '3':176 '4':192 '5':208 'access':129,196,402 'action':171 'activ':181 'adjac':445 'android':2,7,22,38,46,50,55,109,127,131,413,430 'android-compose-access':126 'android-testing-ui':108,130 'android-ui-states-valid':1,412 'anti':297 'anti-pattern':296 'api':260 'app':207,370,391 'applic':175 'assert':89,117,220 'assum':299 'autom':222 'avoid':396 'awar':259 'back':201 'back-stack':200 'behavior':19,67,144,203 'benchmark':436 'boundari':453 'branch':103,188 'broken':336 'build':151 'callback':263 'case':18,48,66,373 'cd':367,388 'chain':264 'chang':198 'check':41 'checklist':418 'chosen':458 'class':241 'code':310,312 'collaps':289 'command':366,387,408,434 'compon':255 'compos':128 'configur':197 'confirm':136,172,364 'connecteddebugandroidtest':371,392 'content':158,286,361,377 'core':76 'cover':156,456 'coverag':80 'cross':452 'data':164 'decid':95,344 'deep':266 'deni':166,236,333 'denied-permiss':165 'design':115,226 'destin':182 'developer.android.com':470,473,476,479 'developer.android.com/guide/practices/ui_guidelines](https://developer.android.com/guide/practices/ui_guidelines)':475 'developer.android.com/guide/topics/resources/runtime-changes](https://developer.android.com/guide/topics/resources/runtime-changes)':472 'developer.android.com/guide/topics/ui/accessibility/apps](https://developer.android.com/guide/topics/ui/accessibility/apps)':478 'developer.android.com/topic/architecture/ui-layer](https://developer.android.com/topic/architecture/ui-layer)':469 'devic':143 'direct':321 'distinguish':275 'document':448 'done':417 'edg':17,47,65,372 'edge-cas':16,64 'effect':251 'empti':11,43,59,159,230,378 'enough':304 'error':13,44,61,160,231,279 'exampl':354,433 'examples/orbittasks-compose':368 'examples/orbittasks-xml':389 'exercis':375,440 'expand':125 'explicit':423 'failur':146,294,352,382,393 'first':240 'first-class':239 'fixtur':386 'flow':9,45,57,307,328 'framework':87 'generic':293 'guardrail':227 'hand':209 'handoff':120,443 'happi':301,355 'hard':309 'hard-cod':308 'hide':246 'holder':185 'identifi':177 'implement':420 'insid':252 'instead':287 'intent':268 'journey':141 'keep':265 'layer':326 'librari':90 'lifecycl':258 'lifecycle-awar':257 'link':267 'list':379 'load':12,42,60,157,229,360 'long':376 'main':462 'manual':262 'matrix':107,154,191 'matter':149 'messag':277 'migrat':463 'minim':424 'misrout':397 'miss':216 'mode':353 'multipl':317 'navig':247,320 'network':325 'observ':274 'offici':454,467 'offlin':14,62,161,232 'one':292 'orbittask':359 'outcom':53 'own':179 'path':302,356,421,466 'pattern':298,459 'permiss':167,235,249,270,334 'permission-deni':234 'persist':278 'place':318 'post':170 'post-act':169 'prefer':256 'primari':52 'product':306,347 'prompt':271,437 'python3':409 'question':77 'rather':223 'reach':70 'recoveri':82,194,330,394 'refer':455,468 'releas':21,69 'relev':432 'repositori':323 'request':34,311,451 'reusabl':253 'review':6,54 'right':429 'rout':314 'scenario':357,374,395 'scope':124 'screen':51,180,295 'screenshot':119 'scripts/eval_triggers.py':410 'see':100 'ship':327 'show':349 'showcas':206 'side':250 'skill':31,73,94,121,407,411,446 'skill-android-ui-states-validation' 'source-krutikjain' 'stack':202 'stale':163,283 'stale-but-us':282 'stale-data':162 'state':4,24,40,79,106,147,153,173,184,225,237,243,280,337,365,415 'string':315 'substitut':342 'success':363 'surfac':431 'sync':381 'target':142 'test':86,110,132,212,339,405 'testabl':272 'testing-on':404 'tie':426 'topic-agent-skills' 'topic-android' 'topic-android-development' 'topic-android-skills' 'topic-androidx' 'topic-claude-code' 'topic-codex' 'topic-cursor' 'topic-jetpack-compose' 'topic-kotlin' 'topic-skills' 'transient':276 'treat':228 'trigger':319 'troubleshoot':465 'ui':3,8,23,39,56,111,133,242,254,331,398,414 'updat':442 'usabl':285 'use':28,29,92,338 'user':98,139 'user-vis':138 'ux':83,195 'valid':5,25,37,113,193,358,399,416 'visibl':140 'without':329 'work':217,400 'workflow':134 'xml':385","prices":[{"id":"be336ae7-e475-470a-82be-d0d39655749b","listingId":"e92e1255-f572-460d-a5cd-f31a7dc92d79","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"krutikJain","category":"android-agent-skills","install_from":"skills.sh"},"createdAt":"2026-05-18T13:20:52.374Z"}],"sources":[{"listingId":"e92e1255-f572-460d-a5cd-f31a7dc92d79","source":"github","sourceId":"krutikJain/android-agent-skills/android-ui-states-validation","sourceUrl":"https://github.com/krutikJain/android-agent-skills/tree/main/skills/android-ui-states-validation","isPrimary":false,"firstSeenAt":"2026-05-18T13:20:52.374Z","lastSeenAt":"2026-05-18T19:13:29.288Z"}],"details":{"listingId":"e92e1255-f572-460d-a5cd-f31a7dc92d79","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"krutikJain","slug":"android-ui-states-validation","github":{"repo":"krutikJain/android-agent-skills","stars":8,"topics":["agent-skills","android","android-development","android-skills","androidx","claude-code","codex","cursor","jetpack-compose","kotlin","skills"],"license":"mit","html_url":"https://github.com/krutikJain/android-agent-skills","pushed_at":"2026-03-25T05:47:20Z","description":"Android skills repository for Kotlin, Compose, XML, testing, CI, release work, and legacy upgrades","skill_md_sha":"928c914e2989588ae965144965f94600a03851aa","skill_md_path":"skills/android-ui-states-validation/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/krutikJain/android-agent-skills/tree/main/skills/android-ui-states-validation"},"layout":"multi","source":"github","category":"android-agent-skills","frontmatter":{"name":"android-ui-states-validation","description":"Review Android UI flows for empty, loading, error, offline, and edge-case behavior before release."},"skills_sh_url":"https://skills.sh/krutikJain/android-agent-skills/android-ui-states-validation"},"updatedAt":"2026-05-18T19:13:29.288Z"}}