Context
The project has 23 XML layouts with no existing Compose code. The goal of this issue is to implement Phase 1 (setup) and Phase 2 (leaf components) of the incremental migration following Google's official strategy: start with the smallest, most independent components and work up the view hierarchy.
Project conditions are ideal for migration:
compileSdk 36, Java 17, pure Kotlin
- MVVM + ViewModels + Koin DI + Coroutines already established
- Coil already installed (native Compose support)
- ViewBinding active (interoperates with Compose via
ComposeView)
- No DataBinding (less friction)
Phase 1: Setup
gradle/libs.versions.toml
Add the Compose BOM and dependencies:
[versions]
compose-bom = "2025.02.00"
[libraries]
compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "compose-bom" }
compose-ui = { group = "androidx.compose.ui", name = "ui" }
compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
compose-material3 = { group = "androidx.compose.material3", name = "material3" }
compose-foundation = { group = "androidx.compose.foundation", name = "foundation" }
activity-compose = { group = "androidx.activity", name = "activity-compose", version = "1.10.1" }
coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" }
app/build.gradle.kts
- Enable
compose = true in buildFeatures
- Add dependencies to the
dependencies block
Phase 2: Leaf components
These components are completely independent. They are migrated embedded in their current XML layouts using <androidx.compose.ui.platform.ComposeView>, while Fragments remain XML-based.
2a. error_message.xml → ErrorMessageComposable
- Wifi-off icon + error text + retry button
- Used in
QuakeFragment and ReportsFragment
- Replace
<include layout="@layout/error_message"> with a ComposeView in both fragments
2b. overlay.xml → OverlayComposable
- Simple view with alpha + elevation
- Low risk
2c. card_view_notification_permission.xml → NotificationPermissionCard
- Card with title, description and button to request notification permission
- Shown in
QuakeFragment (Android 13+)
- Self-contained
New composables will be created in: app/src/main/java/cl/figonzal/lastquakechile/core/ui/composables/
Files to modify
| File |
Change |
gradle/libs.versions.toml |
Add Compose versions and libraries |
app/build.gradle.kts |
Enable Compose + add dependencies |
app/src/main/res/layout/error_message.xml |
Replace with ComposeView |
app/src/main/res/layout/overlay.xml |
Replace with ComposeView |
app/src/main/res/layout/card_view_notification_permission.xml |
Replace with ComposeView |
core/ui/composables/ErrorMessageComposable.kt |
New composable |
core/ui/composables/OverlayComposable.kt |
New composable |
core/ui/composables/NotificationPermissionCard.kt |
New composable |
Acceptance criteria
Out of scope for this issue
- AdMob native ads (requires
AndroidView wrapper)
- Google Maps (requires
maps-compose library)
- List item cards (
card_view_quake.xml, card_view_reports.xml) — Phase 3
- Main screens (
fragment_quake.xml, fragment_reports.xml) — Phase 5
QuakeDetailsActivity — last phase
🤖 Generated with Claude Code
Context
The project has 23 XML layouts with no existing Compose code. The goal of this issue is to implement Phase 1 (setup) and Phase 2 (leaf components) of the incremental migration following Google's official strategy: start with the smallest, most independent components and work up the view hierarchy.
Project conditions are ideal for migration:
compileSdk 36, Java 17, pure KotlinComposeView)Phase 1: Setup
gradle/libs.versions.tomlAdd the Compose BOM and dependencies:
app/build.gradle.ktscompose = trueinbuildFeaturesdependenciesblockPhase 2: Leaf components
These components are completely independent. They are migrated embedded in their current XML layouts using
<androidx.compose.ui.platform.ComposeView>, while Fragments remain XML-based.2a.
error_message.xml→ErrorMessageComposableQuakeFragmentandReportsFragment<include layout="@layout/error_message">with aComposeViewin both fragments2b.
overlay.xml→OverlayComposable2c.
card_view_notification_permission.xml→NotificationPermissionCardQuakeFragment(Android 13+)New composables will be created in:
app/src/main/java/cl/figonzal/lastquakechile/core/ui/composables/Files to modify
gradle/libs.versions.tomlapp/build.gradle.ktsapp/src/main/res/layout/error_message.xmlComposeViewapp/src/main/res/layout/overlay.xmlComposeViewapp/src/main/res/layout/card_view_notification_permission.xmlComposeViewcore/ui/composables/ErrorMessageComposable.ktcore/ui/composables/OverlayComposable.ktcore/ui/composables/NotificationPermissionCard.ktAcceptance criteria
./gradlew assembleDevDebug./gradlew testhandleCvAlertPermissionlogic inNotificationsExt.ktis not brokenQuakeFragmentandReportsFragmentis not brokenOut of scope for this issue
AndroidViewwrapper)maps-composelibrary)card_view_quake.xml,card_view_reports.xml) — Phase 3fragment_quake.xml,fragment_reports.xml) — Phase 5QuakeDetailsActivity— last phase🤖 Generated with Claude Code