Edge-to-Edge Migration
Priority: P1 (HIGH)
Structured workflow for migrating a Compose app to edge-to-edge display.
Prerequisites
- Project MUST use Jetpack Compose.
- Project MUST target SDK 35+. If lower, increase
compileSdkto 35.
Step 1: Plan
- Locate all Activity classes. For each without
enableEdgeToEdge(), plan to add it. - In each Activity, find all lists, FABs, and text fields that need inset handling.
- If
TextField/OutlinedTextFieldis present, plan IME inset handling.
Step 2: Enable edge-to-edge
- Add
enableEdgeToEdge()beforesetContentin everyActivity.onCreate. - Add
android:windowSoftInputMode="adjustResize"in AndroidManifest for Activities with soft keyboard.
Step 3: Apply insets
Choose ONE method per component to avoid double padding:
- PREFERRED — Scaffold: Pass
PaddingValuesto content lambda. - Material 3 components: Use built-in inset handling (
TopAppBar,NavigationBar, etc.). - Outside Scaffold: Use
Modifier.safeDrawingPadding()orwindowInsetsPadding.
See inset patterns for RIGHT/WRONG code examples.
Step 4: Handle IME
For Activities with soft keyboard:
- Set
adjustResizein manifest (NOT deprecatedSOFT_INPUT_ADJUST_RESIZE). - Add
imePadding()orfitInside(WindowInsetsRulers.Ime.current)to content container. - Place
imePaddingBEFOREverticalScroll().
See inset patterns for IME-specific RIGHT/WRONG patterns.
Step 5: Lists and FABs
- Apply inset padding to
contentPaddingofLazyColumn/LazyRow, NOT asModifier.padding()on parent. - FABs inside Scaffold are handled automatically. Outside Scaffold, use
safeDrawingPadding().
Verification
- Every
ActivitycallsenableEdgeToEdge(). -
adjustResizeset in AndroidManifest for keyboard Activities. - Text fields have IME inset handling.
- List items scroll behind system bars via
contentPadding. -
./gradlew buildsucceeds.
Anti-Patterns
- No double inset padding: Never combine
contentWindowInsets = WindowInsets.safeDrawingwithimePadding()on the same content — causes double padding when IME opens. - No parent padding on lists: Apply insets to
contentPadding, not parentModifier.padding()— parent padding clips scrolling content. - No
SOFT_INPUT_ADJUST_RESIZE: Deprecated. Use manifestadjustResizeattribute.

