Skip to content

Commit 20f2961

Browse files
committed
(FEAT)[GH-80] Migrate data module to KMM
1 parent be75517 commit 20f2961

File tree

60 files changed

+602
-645
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+602
-645
lines changed

.github/detekt.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ complexity:
102102
excludeStringsWithLessThan5Characters: true
103103
ignoreStringsRegex: '$^'
104104
TooManyFunctions:
105-
active: true
105+
active: false
106106
excludes: ['**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/iosTest/**']
107107
thresholdInFiles: 11
108108
thresholdInClasses: 11

.idea/jarRepositories.xml

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/build.gradle.kts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
plugins {
22
id("com.android.application")
33
kotlin("android")
4-
kotlin("kapt")
5-
}
6-
7-
kapt {
8-
correctErrorTypes = true
9-
useBuildCache = true
104
}
115

126
val isCI = System.getenv("CI") == "true"
@@ -86,7 +80,8 @@ dependencies {
8680
implementation(Libs.kotlinStd)
8781
implementation(Libs.materialDesign)
8882
implementation(Libs.androidXCore)
89-
83+
implementation(Libs.Kotlinx.datetime)
84+
implementation(Libs.Kotlinx.serialization)
9085
implementation(Libs.Compose.animation)
9186
implementation(Libs.Compose.foundation)
9287
implementation(Libs.Compose.foundationLayout)
@@ -114,10 +109,4 @@ dependencies {
114109

115110
implementation(Libs.Koin.core)
116111
implementation(Libs.Koin.android)
117-
118-
implementation(Libs.Moshi.core)
119-
implementation(Libs.Moshi.adapters)
120-
implementation(Libs.Moshi.sealedAnnotations)
121-
kapt(Libs.Moshi.codegen)
122-
kapt(Libs.Moshi.sealedCodgen)
123112
}
Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.popalay.tracktor
22

33
import com.popalay.tracktor.data.dataModule
4-
import com.popalay.tracktor.data.featureflags.FeatureFlagsManager
5-
import com.popalay.tracktor.data.featureflags.RealFeatureFlagsManager
64
import com.popalay.tracktor.domain.domainModule
75
import com.popalay.tracktor.feature.createtracker.CreateTrackerWorkflow
86
import com.popalay.tracktor.feature.featureflagslist.FeatureFlagsListWorkflow
@@ -13,20 +11,15 @@ import org.koin.dsl.module
1311

1412
val coreModule = module {
1513
single { AppWorkflow(get()) }
16-
single { ListWorkflow(get(), get(), get(), get(), get(), get()) }
17-
single { TrackerDetailWorkflow(get(), get(), get(), get()) }
18-
single { FeatureFlagsListWorkflow(get()) }
19-
single { CreateTrackerWorkflow(get(), get(), get()) }
14+
single { ListWorkflow(get(), get(), get(), get(), get()) }
15+
single { TrackerDetailWorkflow(get(), get(), get()) }
16+
single { FeatureFlagsListWorkflow() }
17+
single { CreateTrackerWorkflow(get(), get()) }
2018
single { SettingsWorkflow(get()) }
2119
}
2220

23-
val featureFlagsModule = module {
24-
single<FeatureFlagsManager> { RealFeatureFlagsManager() }
25-
}
26-
2721
val modules = listOf(
2822
coreModule,
2923
domainModule,
3024
dataModule,
31-
featureFlagsModule
3225
)

app/src/main/java/com/popalay/tracktor/feature/createtracker/CreateTrackerWorkflow.kt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.popalay.tracktor.feature.createtracker
22

33
import androidx.compose.ui.text.input.KeyboardType
44
import com.popalay.tracktor.data.TrackingRepository
5+
import com.popalay.tracktor.data.extensions.now
56
import com.popalay.tracktor.data.model.ProgressDirection
67
import com.popalay.tracktor.data.model.ProgressDirection.ASCENDING
78
import com.popalay.tracktor.data.model.TrackableUnit
@@ -11,24 +12,23 @@ import com.popalay.tracktor.domain.worker.GetAllUnitsWorker
1112
import com.popalay.tracktor.domain.worker.SaveTrackerWorker
1213
import com.popalay.tracktor.utils.toData
1314
import com.popalay.tracktor.utils.toSnapshot
14-
import com.squareup.moshi.JsonClass
15-
import com.squareup.moshi.Moshi
1615
import com.squareup.workflow.RenderContext
1716
import com.squareup.workflow.Snapshot
1817
import com.squareup.workflow.StatefulWorkflow
1918
import com.squareup.workflow.WorkflowAction
2019
import com.squareup.workflow.applyTo
21-
import java.time.LocalDateTime
20+
import kotlinx.datetime.LocalDateTime
21+
import kotlinx.serialization.Serializable
22+
import kotlinx.serialization.Transient
2223
import java.util.Locale
2324
import java.util.UUID
2425

2526
class CreateTrackerWorkflow(
2627
private val trackingRepository: TrackingRepository,
27-
private val getAllUnitsWorker: GetAllUnitsWorker,
28-
private val moshi: Moshi
28+
private val getAllUnitsWorker: GetAllUnitsWorker
2929
) : StatefulWorkflow<Unit, CreateTrackerWorkflow.State, CreateTrackerWorkflow.Output, CreateTrackerWorkflow.Rendering>() {
3030

31-
@JsonClass(generateAdapter = true)
31+
@Serializable
3232
data class State(
3333
val title: String = "",
3434
val selectedUnit: TrackableUnit = TrackableUnit.None,
@@ -155,7 +155,7 @@ class CreateTrackerWorkflow(
155155
val onAction: (Action) -> Unit
156156
)
157157

158-
override fun initialState(props: Unit, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
158+
override fun initialState(props: Unit, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
159159

160160
override fun render(
161161
props: Unit,
@@ -171,7 +171,7 @@ class CreateTrackerWorkflow(
171171
)
172172
}
173173

174-
override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
174+
override fun snapshotState(state: State): Snapshot = state.toSnapshot()
175175

176176
private fun runSideEffects(state: State, context: RenderContext<State, Output>) {
177177
if (state.currentAction is Action.SaveClicked) {

app/src/main/java/com/popalay/tracktor/feature/featureflagslist/FeatureFlagsListWorkflow.kt

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
package com.popalay.tracktor.feature.featureflagslist
22

3-
import com.popalay.tracktor.data.featureflags.FeatureFlagsManager
43
import com.popalay.tracktor.data.model.FeatureFlagListItem
54
import com.popalay.tracktor.utils.updateItem
65
import com.squareup.workflow.RenderContext
76
import com.squareup.workflow.Snapshot
87
import com.squareup.workflow.StatefulWorkflow
98
import com.squareup.workflow.WorkflowAction
109

11-
class FeatureFlagsListWorkflow(
12-
private val featureFlagsManager: FeatureFlagsManager
13-
) : StatefulWorkflow<Unit, FeatureFlagsListWorkflow.State, FeatureFlagsListWorkflow.Output, FeatureFlagsListWorkflow.Rendering>() {
10+
class FeatureFlagsListWorkflow :
11+
StatefulWorkflow<Unit, FeatureFlagsListWorkflow.State, FeatureFlagsListWorkflow.Output, FeatureFlagsListWorkflow.Rendering>() {
1412

1513
data class State(
1614
val featureFlags: List<FeatureFlagListItem> = emptyList()

app/src/main/java/com/popalay/tracktor/feature/list/ListWorkflow.kt

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,34 +14,31 @@ import com.popalay.tracktor.feature.settings.SettingsWorkflow
1414
import com.popalay.tracktor.feature.trackerdetail.TrackerDetailWorkflow
1515
import com.popalay.tracktor.utils.toData
1616
import com.popalay.tracktor.utils.toSnapshot
17-
import com.squareup.moshi.JsonClass
18-
import com.squareup.moshi.Moshi
1917
import com.squareup.workflow.RenderContext
2018
import com.squareup.workflow.Snapshot
2119
import com.squareup.workflow.StatefulWorkflow
2220
import com.squareup.workflow.Worker
2321
import com.squareup.workflow.WorkflowAction
2422
import com.squareup.workflow.applyTo
2523
import com.squareup.workflow.renderChild
26-
import dev.zacsweers.moshisealed.annotations.DefaultNull
27-
import dev.zacsweers.moshisealed.annotations.TypeLabel
24+
import kotlinx.serialization.Serializable
25+
import kotlinx.serialization.Transient
2826
import org.koin.core.KoinComponent
2927

3028
class ListWorkflow(
3129
private val trackingRepository: TrackingRepository,
3230
private val getAllTrackersWorker: GetAllTrackersWorker,
3331
private val trackerDetailWorkflow: TrackerDetailWorkflow,
3432
private val createTrackerWorkflow: CreateTrackerWorkflow,
35-
private val settingsWorkflow: SettingsWorkflow,
36-
private val moshi: Moshi
33+
private val settingsWorkflow: SettingsWorkflow
3734
) : StatefulWorkflow<ListWorkflow.Props, ListWorkflow.State, ListWorkflow.Output, Any>(), KoinComponent {
3835
companion object {
3936
private const val DELETING_UNDO_TIMEOUT_MILLIS = 4000L
4037
}
4138

4239
object Props
4340

44-
@JsonClass(generateAdapter = true)
41+
@Serializable
4542
data class State(
4643
@Transient val items: List<TrackerListItem> = emptyList(),
4744
@Transient val filteredItems: List<TrackerListItem> = emptyList(),
@@ -56,20 +53,16 @@ class ListWorkflow(
5653
val animate: Boolean = true
5754
)
5855

59-
@DefaultNull
60-
@JsonClass(generateAdapter = true, generator = "sealed:type")
56+
@Serializable
6157
sealed class ChildState {
62-
@TypeLabel("TrackerDetail")
63-
@JsonClass(generateAdapter = true)
58+
@Serializable
6459
data class TrackerDetail(val trackerId: String) : ChildState()
6560

66-
@TypeLabel("Settings")
67-
@JsonClass(generateAdapter = true)
61+
@Serializable
6862
@Suppress("CanSealedSubClassBeObject")
6963
class Settings : ChildState()
7064

71-
@TypeLabel("TrackerCreation")
72-
@JsonClass(generateAdapter = true)
65+
@Serializable
7366
@Suppress("CanSealedSubClassBeObject")
7467
class TrackerCreation : ChildState()
7568
}
@@ -163,7 +156,7 @@ class ListWorkflow(
163156
.let { if (it.isEmpty()) it else listOf(Category.All).plus(it) }
164157
}
165158

166-
override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
159+
override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
167160

168161
override fun render(
169162
props: Props,
@@ -194,7 +187,7 @@ class ListWorkflow(
194187
}
195188
}
196189

197-
override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
190+
override fun snapshotState(state: State): Snapshot = state.toSnapshot()
198191

199192
private fun runSideEffects(state: State, context: RenderContext<State, Output>) {
200193
when (val action = state.currentAction) {

app/src/main/java/com/popalay/tracktor/feature/trackerdetail/TrackerDetailWorkflow.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,27 @@ import com.popalay.tracktor.domain.worker.GetAllCategoriesWorker
1010
import com.popalay.tracktor.domain.worker.GetTrackerByIdWorker
1111
import com.popalay.tracktor.utils.toData
1212
import com.popalay.tracktor.utils.toSnapshot
13-
import com.squareup.moshi.JsonClass
14-
import com.squareup.moshi.Moshi
1513
import com.squareup.workflow.RenderContext
1614
import com.squareup.workflow.Snapshot
1715
import com.squareup.workflow.StatefulWorkflow
1816
import com.squareup.workflow.Worker
1917
import com.squareup.workflow.WorkflowAction
2018
import com.squareup.workflow.applyTo
19+
import kotlinx.serialization.Serializable
20+
import kotlinx.serialization.Transient
2121

2222
class TrackerDetailWorkflow(
2323
private val trackingRepository: TrackingRepository,
2424
private val categoryRepository: CategoryRepository,
25-
private val getAllCategoriesWorker: GetAllCategoriesWorker,
26-
private val moshi: Moshi
25+
private val getAllCategoriesWorker: GetAllCategoriesWorker
2726
) : StatefulWorkflow<TrackerDetailWorkflow.Props, TrackerDetailWorkflow.State, TrackerDetailWorkflow.Output, TrackerDetailWorkflow.Rendering>() {
2827
companion object {
2928
private const val DELETING_UNDO_TIMEOUT_MILLIS = 2500L
3029
}
3130

3231
data class Props(val trackerId: String)
3332

34-
@JsonClass(generateAdapter = true)
33+
@Serializable
3534
data class State(
3635
val isAddRecordDialogShowing: Boolean = false,
3736
val isAddCategoryDialogShowing: Boolean = false,
@@ -95,7 +94,7 @@ class TrackerDetailWorkflow(
9594
val onAction: (Action) -> Unit
9695
)
9796

98-
override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData(moshi) ?: State()
97+
override fun initialState(props: Props, snapshot: Snapshot?): State = snapshot?.toData() ?: State()
9998

10099
override fun render(
101100
props: Props,
@@ -112,7 +111,7 @@ class TrackerDetailWorkflow(
112111
)
113112
}
114113

115-
override fun snapshotState(state: State): Snapshot = state.toSnapshot(moshi)
114+
override fun snapshotState(state: State): Snapshot = state.toSnapshot()
116115

117116
private fun runSideEffects(state: State, context: RenderContext<State, Output>) {
118117
when (val action = state.currentAction) {

build.gradle.kts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ plugins {
1111
allprojects {
1212
repositories {
1313
maven(url = "https://dl.bintray.com/kotlin/kotlin-eap/")
14+
maven(url = "https://kotlin.bintray.com/kotlinx/")
1415
maven(url = "https://jitpack.io")
16+
maven(url = "https://dl.bintray.com/ekito/koin")
17+
mavenCentral()
1518
jcenter()
1619
google()
1720
}
@@ -36,8 +39,8 @@ subprojects {
3639
configurations.all {
3740
resolutionStrategy {
3841
force(
39-
"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.7",
40-
"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.7"
42+
"org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.9",
43+
"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9"
4144
)
4245
}
4346
}

buildSrc/src/main/java/Config.kt

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,27 +9,20 @@ object AndroidConfig {
99
object Version {
1010
const val androidGradlePlugin = "4.2.0-alpha10"
1111
const val kotlin = "1.4.10"
12-
const val koin = "2.1.6"
13-
const val moshi = "1.10.0"
14-
const val moshiSealed = "0.2.0"
12+
const val koin = "3.0.0-alpha-4"
1513
const val compose = "1.0.0-alpha02"
1614
const val workflow = "1.0.0-alpha.1"
1715
const val workflowCompose = "0.30.0"
18-
const val room = "2.2.5"
1916
const val androidX = "1.5.0-alpha02"
17+
const val sqlDelight = "1.4.3"
18+
const val coroutines = "1.3.9"
2019
}
2120

2221
object Libs {
2322
const val kotlinStd = "org.jetbrains.kotlin:kotlin-stdlib:${Version.kotlin}"
2423
const val materialDesign = "com.google.android.material:material:1.2.0"
25-
const val preferenceKtx = "androidx.preference:preference-ktx:1.1.1"
2624
const val androidXCore = "androidx.core:core-ktx:${Version.androidX}"
27-
28-
object Room {
29-
const val runtime = "androidx.room:room-runtime:${Version.room}"
30-
const val ktx = "androidx.room:room-ktx:${Version.room}"
31-
const val compiler = "androidx.room:room-compiler:${Version.room}"
32-
}
25+
const val uuid = "com.benasher44:uuid:0.2.2"
3326

3427
object Compose {
3528
const val animation = "androidx.compose.animation:animation:${Version.compose}"
@@ -52,11 +45,17 @@ object Libs {
5245
const val android = "org.koin:koin-android:${Version.koin}"
5346
}
5447

55-
object Moshi {
56-
const val core = "com.squareup.moshi:moshi:${Version.moshi}"
57-
const val adapters = "com.squareup.moshi:moshi-adapters:${Version.moshi}"
58-
const val codegen = "com.squareup.moshi:moshi-kotlin-codegen:${Version.moshi}"
59-
const val sealedAnnotations = "dev.zacsweers.moshisealed:moshi-sealed-annotations:${Version.moshiSealed}"
60-
const val sealedCodgen = "dev.zacsweers.moshisealed:moshi-sealed-codegen:${Version.moshiSealed}"
48+
object SqlDelight {
49+
const val runtime = "com.squareup.sqldelight:runtime:${Version.sqlDelight}"
50+
const val android = "com.squareup.sqldelight:android-driver:${Version.sqlDelight}"
51+
const val native = "com.squareup.sqldelight:native-driver:${Version.sqlDelight}"
52+
const val coroutinesExtensions = "com.squareup.sqldelight:coroutines-extensions:${Version.sqlDelight}"
53+
}
54+
55+
object Kotlinx {
56+
const val datetime = "org.jetbrains.kotlinx:kotlinx-datetime:0.1.0"
57+
const val serialization = "org.jetbrains.kotlinx:kotlinx-serialization-core:1.0.0-RC"
58+
const val coroutinesCore = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.coroutines}"
59+
const val coroutinesAndroid = "org.jetbrains.kotlinx:kotlinx-coroutines-core:${Version.coroutines}"
6160
}
6261
}

0 commit comments

Comments
 (0)