Skip to content

feat: Incremental Jetpack Compose migration - Phase 1+2 (setup + leaf components) #56

Description

@figonzal1

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.xmlErrorMessageComposable

  • 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.xmlOverlayComposable

  • Simple view with alpha + elevation
  • Low risk

2c. card_view_notification_permission.xmlNotificationPermissionCard

  • 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

  • Successful build with ./gradlew assembleDevDebug
  • Composables render correctly in Android Studio Preview
  • Existing tests still pass: ./gradlew test
  • Migrated components behave identically to the original XML on emulator
  • handleCvAlertPermission logic in NotificationsExt.kt is not broken
  • Error flow in QuakeFragment and ReportsFragment is not broken

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

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status
Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions