Best for
- Use when reviewing Compose layout, typography, color, motion, or adaptive patterns on a verified emulator build.
vasilyu1983/AI-Agents-public/frameworks/shared-skills/skills/software-android-design/SKILL.md
Designs and audits native Android interfaces. Use when reviewing Compose layout, typography, color, motion, or adaptive patterns on a verified emulator build.
Decision brief
Use this skill for visual design decisions and design-focused audits in native Android apps. Prefer it when the user needs Material 3 aligned screen structure, current Android-native visual defaults, or a screenshot-to-fix loop after a fresh verified build/install/launch. If the…
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Declared | Source record | Install path and trigger |
| Claude Code | Declared | Source record | Install path and trigger |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/vasilyu1983/AI-Agents-public --skill "frameworks/shared-skills/skills/software-android-design"Inspect the Agent Skill "software-android-design" from https://github.com/vasilyu1983/AI-Agents-public/blob/53f6cb73ea53a2646e3e7d4665062ad66f3683ac/frameworks/shared-skills/skills/software-android-design/SKILL.md at commit 53f6cb73ea53a2646e3e7d4665062ad66f3683ac. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.
Workflow
1. Define the screen's primary job and the one or two pieces of content that must win first attention. 2. Choose the Material structure first: NavigationBar, NavigationRail, Scaffold, TopAppBar, ModalBottomSheet, ListDetailPaneScaffold, or adaptive scaffold. 3. Apply typography,…
See: - references/ai-design-review-android.md - references/android-studio-design-loop.md - scripts/capture-screenshot.sh - scripts/layout-inspector.sh
Before concluding a design recommendation or audit, confirm all of the following:
Review the “Quick Reference” section in the pinned source before continuing.
Start from Material Design 3 Expressive, not custom chrome.
Permission review
No configured static risk pattern was detected
This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.
Evidence record
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 97/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 80 | Source | Repository attention, not individual Skill quality |
| Compatibility | 2 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
Use this skill for visual design decisions and design-focused audits in native Android apps. Prefer it when the user needs Material 3 aligned screen structure, current Android-native visual defaults, or a screenshot-to-fix loop after a fresh verified build/install/launch. If the request is really about greenfield scaffolding, Gradle build loops, module selection, or broader Android implementation workflow, route to software-mobile and return here once the question becomes visual structure or design quality.
| Design concern | Default | Notes |
|---|---|---|
| Type | MaterialTheme.typography | Display → Headline → Title → Body → Label scale |
| Color | MaterialTheme.colorScheme | primary, secondary, tertiary, surface, error, and on* variants |
| Shape | MaterialTheme.shapes | ExtraSmall→ExtraLarge; RoundedCornerShape |
| Dynamic color | dynamicDarkColorScheme / dynamicLightColorScheme | Android 12+; static seed palette on older APIs |
| Bottom nav | NavigationBar 3–5 destinations | NavigationRail on medium, NavigationDrawer on expanded, or NavigationSuiteScaffold for auto |
| Top bar | TopAppBar / MediumTopAppBar / LargeTopAppBar / CenterAlignedTopAppBar | Choose by headline presence; collapsing variants for rich headers |
| Cards | ElevatedCard hero, Card primary, OutlinedCard secondary | tonalElevation 3 + shadow for hero |
| Custom data viz | Canvas | Radar charts, score rings, gradient bars, gauges — standard components insufficient |
| Adaptive layouts | ListDetailPaneScaffold, SupportingPaneScaffold, NavigationSuiteScaffold | Feed grids for homogeneous content |
| Detail views | ModalBottomSheet | Never expand deep detail inline in scroll content |
| Motion | Container transforms, AnimatedVisibility, animateContentSize, spring() | M3 Expressive defaults |
| Edge-to-edge | enableEdgeToEdge() + windowInsetsPadding | Mandatory, non-optional for targetSdk 36+ (windowOptOutEdgeToEdgeEnforcement removed) |
| Predictive back | PredictiveBackHandler (Compose) / OnBackInvokedCallback | Default system animation on Android 16+ when targeting API 36+; onBackPressed()/KEYCODE_BACK no longer dispatched at that target |
| Press feedback | InteractionSource + animateFloatAsState(0.94f), 100ms spring | Modifier.clickable without Indication = no tactile response |
| Chip groups | FlowRow | Use when spatial context matters; avoid horizontal scroll for finite sets |
| Peer view switch | SegmentedButton or TabRow | Reduces navigation depth vs. separate screens |
| Immersive viz | BottomSheetScaffold { background; viz; controls } | Full-bleed; no card wrappers; no scroll |
| Aspect ratios | Maps .aspectRatio(1.4f), charts .aspectRatio(1f) | Size by content type |
| Touch targets | ≥ 48dp on all interactive elements | Platform minimum |
| Token discipline | No magic numbers in screen files | Tokenize spacing, elevation, shape, color |
MaterialTheme.typography, MaterialTheme.colorScheme, MaterialTheme.shapes, and standard containers before custom styling.NavigationBar for peer sections, NavHost for drill-down, ModalBottomSheet for focused tasks.androidx.compose.material3:material3:1.4.0 ships the baseline M3 type scale, shapes, and most components; expressive-specific APIs (new shape morph library, expressive motion scheme, some new components) live behind @ExperimentalMaterial3ExpressiveApi in the 1.5.0-alpha line as of mid-2026. Confirm current stable-vs-experimental status at developer.android.com/jetpack/androidx/releases/compose-material3 before recommending an expressive-only API without an opt-in annotation.2026.06.00 was the latest stable BOM as of this validation. Compose BOM ships roughly monthly — verify the current value at developer.android.com/develop/ui/compose/bom/bom-mapping rather than pinning an exact version in generated code.onBackPressed() and KEYCODE_BACK are no longer dispatched at that target. Use PredictiveBackHandler in Compose or OnBackInvokedCallback directly; do not recommend onBackPressed() overrides for new targetSdk-36 code.windowOptOutEdgeToEdgeEnforcement is deprecated and has no effect once targetSdk reaches 36. Any recommendation that relies on opting out of edge-to-edge is stale.NavigationBar, NavigationRail, Scaffold, TopAppBar, ModalBottomSheet, ListDetailPaneScaffold, or adaptive scaffold.WindowSizeClass breakpoints — compact, medium, expanded.Android design task
-> Prove current build: fresh install, launch, screenshot
-> Define primary screen job and attention hierarchy
-> Choose Material 3 structure and adaptive scaffold
-> Apply tokens for type, color, shape, spacing, and motion
-> Verify compact, medium, expanded, theme, and font-scale states
-> Patch, rebuild, recapture, and compare evidence
Before writing or reviewing screen code, check these patterns from references/design-craft-patterns.md:
TextStyle(fontSize = N.sp, fontWeight = W) pattern appears 3+ times, extract it to a typography token or use the Material type scale.ListItem rows, or grid cells with visual boundaries, not floating in unbounded Column space.ElevatedCard with level 3 tonalElevation + 28dp shape for hero, Card with 16dp shape for primary, OutlinedCard for secondary. Mixed content within one card uses HorizontalDivider.Canvas for custom charts (radar, rings, gauges), animated score rings with Animatable, and gradient score bars. See references/android-component-patterns.md.AnimatedVisibility for entrance reveals, animateContentSize for expanding sections, spring() for natural motion, container transforms for navigation transitions, and press feedback via Indication or InteractionSource on all tappable surfaces.tonalElevation for surface layering rather than drop shadows alone. Material 3 uses tonal color overlays to express elevation — Surface(tonalElevation = N.dp) shifts surface color automatically.strings.xml — including section headers, CTAs, and short labels that seem "too small to localize" (they grow 30-50% in German/Russian). Verify RTL layout with forced RTL in developer options. Test German, Arabic, and CJK locales for overflow and mirroring.WindowSizeClass. Use NavigationSuiteScaffold or manual breakpoint switching. Verify that content reflows rather than just stretching.contentDescription = null. All meaningful images and icons have descriptive contentDescription. Use semantics { } to merge related elements for TalkBack and provide custom actions.MaterialTheme.shapes scale (ExtraSmall through ExtraLarge) rather than ad-hoc RoundedCornerShape values. Keep shape language consistent across Cards, Buttons, Chips, and Sheets.WindowSizeClass behavior when a change touches layout or hierarchy.See:
Decisions a senior Android design reviewer makes that go beyond checklist compliance:
Default to Compose for any new screen or greenfield module — it is the modern native baseline and this skill assumes it. Views still legitimately win in narrower cases:
ComposeView/AndroidView at the screen boundary, migrate incrementally, do not force a big-bang rewrite for a design fix.SurfaceView/TextureView (camera preview, video, some game-like canvases) — Compose's AndroidView interop works but adds indirection; a thin View layer can still be simpler when the surface needs precise frame-timing control.RecyclerView with complex diffing/animations already tuned — LazyColumn is capable, but do not force a rewrite of a well-optimized, stable RecyclerView adapter purely for "modernization" without a design or velocity reason.TextStyle/Color(0xFF...)/dp literals, the design system has a governance gap, not a discipline gap — recommend a lint rule (e.g., Compose lint check or custom detekt rule) over a style-guide reminder.Common mistakes that pass phone-only review but fail on foldables/tablets:
WindowWidthSizeClass.EXPANDED.WindowInfoTracker/FoldingFeature to detect the hinge and avoid placing critical controls there.NavigationBar should give way to NavigationRail/NavigationDrawer at medium/expanded width; leaving bottom nav on a tablet is one of the most common large-screen regressions.These are optional helpers for a proven-build design loop. If the app cannot be built, installed, or launched cleanly, fix the build before staying in this skill.
Color(0xFF...) values in Composables — use MaterialTheme.colorScheme roles so light, dark, and dynamic color adapt automatically.sp sizes outside the Material type scale without justification — prefer MaterialTheme.typography roles.tonalElevation (tonal color shift) as the primary depth signal; shadows are supplementary.Box(Modifier.clickable { }) without providing a ripple Indication — it produces a dead-feeling tap with no visual response.ModalBottomSheet as the sole navigation mechanism — it is for secondary detail, not primary app structure.WindowInsets consumption after calling enableEdgeToEdge() — content will render behind system bars.LazyColumn inside a Column with verticalScroll — this causes nested scrolling crashes. Use a single LazyColumn with mixed item types.minHeight on Cards without testing at 200% font scale — the content will overflow the fixed minimum.pointerInput with detectTapGestures for simple click handling — use Modifier.clickable which provides accessibility semantics, ripple, and focus handling for free.Text("$intValue") for years or IDs without considering locale formatting — use explicit String formatting to prevent comma insertion (2,026 instead of 2026).Modifier.shadow() without also applying clip or graphicsLayer(clip = true) — shadow draws around the unclipped bounds, creating a rectangular shadow on rounded content.Color.White or Color.Black for text or surfaces — use MaterialTheme.colorScheme.onSurface, onSurfaceVariant, or outline roles.contentDescription on meaningful icons and images — TalkBack users get no information from undescribed elements.fillMaxWidth() on every element without considering medium and expanded WindowSizeClass — content stretches to unreadable line lengths on tablets.ModalBottomSheet and present a new one in the same frame — set state to hidden first, then present the new sheet after recomposition.animatableProgress at 0f for data-driven views — data may load after composition, leaving the Canvas empty. Start at 1f or trigger animation on data change.LazyVerticalGrid with GridCells.Fixed(3) on compact phones for content that needs readable text — two columns or a single column with weight-based rows works better. Reserve Fixed(3) for icon-sized cells or compact stat grids.Modifier.background() with a rounded shape without also applying .clip() to the same shape — child content will bleed past the rounded corners. Use Surface(shape = ...) instead, which clips automatically.rememberSaveable for large data objects or lists — it serializes to Bundle which has a strict 1MB transaction limit. Use a ViewModel for screen-level data state; use rememberSaveable only for primitive UI state (selected tab index, scroll position, sheet expanded boolean).Modifier.verticalScroll() and LazyColumn in the same hierarchy — this creates nested scrolling that crashes or produces broken gestures. Use a single LazyColumn with mixed item { } blocks for heterogeneous content.lineHeight in sp for body text without testing at 200% font scale — large font scale with fixed lineHeight creates overlapping text. Let the Material type scale handle line height or use lineHeight = TextUnit.Unspecified and rely on default scaling.data class instance on every frame. Strong Skipping Mode (Kotlin 2.x + Compose) compares unstable composable parameters by instance reference, so a _uiState.value = _uiState.value.copy(field = new) per event forces the visualization composable to recompose even when the value it actually reads is unchanged. Hoist derived lists to the ViewModel with stateIn, split state into @Immutable slices, and pass only the primitives a given chart or ring actually needs. See ../software-android-native/references/compose-state-concurrency.md → "Strong Skipping Mode (Kotlin 2.x)" for the full rules.Before concluding a design recommendation or audit, confirm all of the following:
MaterialTheme.typography roles, not ad-hoc TextStyle(fontSize = N.sp)MaterialTheme.colorScheme roles; contrast verified in both light and dark themes, with dynamic color on and offWindowSizeClassenableEdgeToEdge() called and all content uses windowInsetsPadding or equivalent — not an opt-out (windowOptOutEdgeToEdgeEnforcement has no effect at targetSdk 36+)PredictiveBackHandler/OnBackInvokedCallback, not a bare onBackPressed() override, if targetSdk is 33+LazyColumn nested inside Column(Modifier.verticalScroll()) in the changed screens@ExperimentalMaterial3ExpressiveApi) unless verified stable at review timeFreshness-check before final answers whenever the request depends on:
@ExperimentalMaterial3ExpressiveApiWindowSizeClass behaviorStart from data/sources.json, then prefer material.io, developer.android.com, and Google I/O sessions.
Before applying this skill on a non-trivial task, read learnings.consolidated.md in this directory (and learnings.md if present).
After applying it, if you encountered a pattern worth remembering, a mistake worth preventing, or a domain fact that surprised you, append one dated bullet to learnings.md via agents-skills-feedback-loop/scripts/append_learning.py. Do not modify SKILL.md itself.
Frequently asked questions
Use this skill for visual design decisions and design-focused audits in native Android apps. Prefer it when the user needs Material 3 aligned screen structure, current Android-native visual defaults, or a screenshot-to-fix loop after a fresh verified build/install/launch. If the…
The source record exposes this install command: npx skills add https://github.com/vasilyu1983/AI-Agents-public --skill "frameworks/shared-skills/skills/software-android-design". Inspect the command and pinned source before running it.
The pinned source record declares support for: codex, claude code.
Alternatives
vasilyu1983/AI-Agents-public
Guides iOS testing with XCTest, XCUITest, Swift Testing, simctl, and xcresult. Use when choosing destinations, controlling flakes, or parsing test artifacts for native apps.
vasilyu1983/AI-Agents-public
Designs and audits UI/UX systems with usability and accessibility requirements. Use when shaping flows, design systems, interaction patterns, or WCAG-aware product behavior.
vasilyu1983/AI-Agents-public
Designs session lifecycle for coding-agent runtimes. Use when implementing resume, transcript restoration, checkpoint rewind, cross-worktree recovery, or session-state persistence.
vasilyu1983/AI-Agents-public
Systematic debugging for crashes, regressions, flakes, and production bugs. Use when diagnosing stack traces, logs, traces, or profiling data.